第一章 Trino簡介
1. Trino概述
Trino是一個分散式SQL查詢引擎,旨在查詢分佈在一個或多個異構資料來源上的大型資料集。如果使用的是數TB或數PB的資料,那麼很可能使用的是與Hadoop和HDFS互動的工具。Trino被設計為使用MapReduce作業管道(如Hive或Pig)查詢HDFS的工具的替代品,但Trino並不侷限於訪問HDFS。Trino可以而且已經擴充套件到對不同型別的資料來源進行操作,包括傳統的關聯式資料庫和其他資料來源,如Cassandra。
Trino旨在處理資料倉儲和分析:資料分析,彙總大量資料並生成報告。這些工作負載通常被歸類為聯機分析處理(OLAP)。
說明:不要誤解Trino理解SQL的事實,因為它提供了標準資料庫的功能。Trino不是一個通用的關聯式資料庫。它不能取代MySQL、PostgreSQL或Oracle等資料庫。Trino不是為處理線上事務處理(OLTP)而設計的。對於為資料倉儲或分析而設計和最佳化的許多其他資料庫也是如此。
2. Trino架構
Trino是一個分散式查詢引擎,可跨多個伺服器並行處理資料。Trino伺服器有兩種型別,協調器(coordinators)和工作節點(workers)。以下部分介紹了這些伺服器和Trino體系結構的其他元件。
Trino叢集由一個coordinator和多個worker組成。使用者透過SQL工具與coordinator連線。協調員與工人合作。coordinator管理workers。透過配置catalogs,coordinator 和 the workers訪問已連線的資料來源。
每個查詢的執行都是狀態操作,coordinator編排工作負載,它會將任務排程到workers中並行執行。每個Trino都執行在JVM例項中,並透過使用執行緒進一步將任務並行化。
使用者使用客戶端工具(如JDBC驅動或Trino CLI)連線到叢集中的協調器,然後協調器(coordinator)就可以協調工作節點(worker)訪問資料來源。
協調器(coordinator)是一類處理使用者查詢請求並管理工作節點執行查詢工作的伺服器。工作節點(worker)是一類負責執行任務和處理資料的伺服器。
協調器(coordinator)通常會執行一個節點發現服務,工作節點(worker)透過註冊到該服務來加入叢集。客戶端、協調器(coordinator)和工作節點(worker)之間所有的通訊和資料傳輸,都透過基於HTTP/HTTPS的REST服務互動。
第二章 Trino安裝
1. Trino環境要求
Linux作業系統:64位
Java執行時環境: Jdk21以及以上版本
Python版本: 2.6.x、2.7.x 或 3.x
2. Trino部署
Trino 伺服器可以安裝和部署在許多不同的伺服器上平臺。使用者通常部署由一個具有一個協調器和多個工作節點的叢集。Trino支援如何部署方式:
(1) 部署Trino
(2) Docker容器中的Trino
(3) Trino on Kubernetes with Helm
(4) RPM包
下文介紹RPM包的部署方式。
1、下載 Trino 的RPM 軟體包
Trino Server 436下載地址 :
https://repo1.maven.org/maven2/io/trino/trino-server-rpm/436/trino-server-rpm-436.rpm
Trino Cli 436下載地址:
https://repo1.maven.org/maven2/io/trino/trino-cli/436/trino-cli-436-executable.jar
2、使用命令安裝軟體包:rpm
rpm -ivh trino-server-rpm-436.rpm --nodeps
3、啟動服務
service trino start ;
安裝後可以使用service命令管理Trino伺服器:
service trino [start|stop|restart|status]
命令 |
動作 |
start |
將伺服器作為守護程式啟動,並返回其程序 ID。 |
stop |
關閉以 或 開頭的伺服器。傳送 SIGTERM 訊號。 |
restart |
停止然後啟動正在執行的伺服器,或啟動已停止的伺服器, 分配新的程序 ID。 |
status |
列印狀態行,即“已停止 pid”或“作為 pid 執行”。 |
4、驗證服務是否正常
(1)在伺服器上執行service trino status,看到Running as XXX說明服務啟動成功。
(2)在伺服器上執行jps,如果看到TrinoServer的程序說明啟動成功。
(3)在瀏覽器中輸入:http://ip:8080,如果出現登入頁面,隨意輸入使用者root,登入可以看到如下頁面。
5、安裝Trino客戶端
下載之後將trino-cli-436-executable.jar改成trino-cli,並給trino-cli新增可執行許可權
mv trino-cli-436-executable.jar trino-cli
chmod +x trino-cli
./trino-cli --server localhost:8080
3. Trino目錄結構
(1) /usr/lib/trino/lib/:包含執行產品所需的各種庫。外掛位於外掛子目錄中。
(2) /etc/trino:包含一般的trino配置檔案,如node.properties、jvm.config、config.properties。目錄配置位於目錄子目錄中。
(3) /etc/trino/env.sh:包含trino使用的Java安裝路徑,允許配置程序環境變數,包括secrets。
(4) /var/log/trino:包含日誌檔案。
(5) /var/lib/trino/data:資料目錄的位置。Trino在此處儲存日誌和其他資料。
(6) /etc/rc.d/init.d/trino:包含用於控制伺服器程序的服務指令碼以及檔案路徑的啟動器配置。
第三章 Trino聯結器
1. MySQL聯結器
MySQL聯結器允許在外部MySQL例項中查詢和建立表。這可以用於連線不同系統(如MySQL和Hive)之間的資料,或兩個不同MySQL例項之間的資料。
1.1. 要求
(1) MySQL 5.7、8.0 或更高版本。
(2) 從 Trino 協調器和工作執行緒到 MySQL 的網路訪問。 埠 3306 是預設埠。
1.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://192.168.80.131:3306
connection-user=root
connection-password=Root@1234
這裡主機要使用IP地址,不要使用主機名。
1.3. 登入客戶端
(1)重啟trino服務
service trino stop ; service trino start ;
或者
service trino restart ;
(2)登入客戶端命令
./trino-cli --server localhost:8080
或者連線trino時可以設定預設的catalog(某個連線例項)和schema(資料庫),這樣可以直接查詢表。
./trino-cli http://localhost:8080/mysql/test
說明:mysql為catalog中配置的connector.name,test為需要連線的資料庫名稱。
1.4. 操作MySQL
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs;
(2)檢視mysql下所有的schemas (對應為資料庫)
show schemas from mysql;
如果連線失敗,可以檢視日誌/var/log/trino/server.log
(3)檢視資料庫中的所有表
show tables from mysql.test;
(4)查詢表資料
use mysql.test;
select * from mysql.test.tbl001 limit 10;
(5)插入資料
insert into tbl001(id,name) values(5,'55555');
select * from mysql.test.tbl001;
(5)修改資料
update tbl001 set name = 'xxxxx' where id = 5 ;
select * from mysql.test.tbl001 ;
(6)刪除資料
delete from tbl001 where id = 5 ;
select * from mysql.test.tbl001;
(7)檢視錶結構和建表語句
desc tbl001;
show create table tbl001 ;
(8)退出客戶端
quit; 或者exit;
補充內容:
(9) 透過trino-cli直接執行SQL(使用--execute選項)
./trino-cli http://localhost:8080/mysql/test --execute 'select * from mysql.test.tbl001'
./trino-cli http://localhost:8080 --execute 'use mysql.test ; select * from mysql.test.tbl001'
(10) 透過trino-cli執行SQL檔案(-f選項)
vi mysql_test.sql
use mysql.test;
select * from tbl001;
執行SQL檔案:./trino-cli http://localhost:8080 -f mysql_test.sql
2. PostgreSQL聯結器
PostgreSQL聯結器允許在外部PostgreSQL資料庫中查詢和建立表。這可以用於連線不同系統(如PostgreSQL和Hive)之間的資料,或不同PostgreSQL例項之間的資料。
2.1. 要求
(1) PostgreSQL 11.x或更高版本。
(2) Trino協調員(coordinator)和工作節點(workers )對PostgreSQL的網路訪問。預設埠是5432。
2.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi postgresql.properties
connector.name=postgresql
connection-url=jdbc:postgresql://192.168.80.131:5432/bdc01
connection-user=postgres
connection-password=postgres
這裡主機要使用IP地址,不要使用主機名。
2.3. 登入客戶端
重啟trino服務:
service trino stop ; service trino start ;
或者
service trino restart ;
登入客戶端命令:
./trino-cli --server localhost:8080
2.4. 操作PostgreSQL
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs;
(2)檢視postgresql下所有的schemas (對應為資料庫)
show schemas from postgresql;
如果連線失敗,可以檢視日誌/var/log/trino/server.log
(3)檢視資料庫中的所有表
show tables from postgresql.public;
(4)查詢表資料
use postgresql.public;
select * from postgresql.public.nation_test order by n_nationkey ;
(5)插入資料
insert into nation_test(n_nationkey,n_name,n_regionkey) values(99,'XXXXX',3);
select * from nation_test order by n_nationkey ;
(6)修改資料
update nation_test set n_name = 'YYYYY' where n_nationkey = 99 ;
select * from nation_test order by n_nationkey ;
(7)刪除資料
delete from nation_test where n_nationkey = 99 ;
select * from nation_test order by n_nationkey ;
(8)檢視錶結構和建表語句
desc nation_test;
或者 show columns from nation_test ;
show create table nation_test ;
(9)退出客戶端
quit; 或者exit;
3. Oracle聯結器
Oracle聯結器允許在外部Oracle資料庫中查詢和建立表。聯結器允許Trino連線不同資料庫(如Oracle和Hive)或不同Oracle資料庫例項提供的資料。
3.1. 要求
(1) Oracle 19或更高版本。
(2) Trino協調員(coordinator)和工作節點(workers )對Oracle的網路訪問。預設埠是1521。
3.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi oracle.properties
connector.name=oracle
connection-url=jdbc:oracle:thin:@192.168.80.134:1521/orclpdb1
connection-user=dsjzx
connection-password=Dsjzx123
這裡主機要使用IP地址,不要使用主機名。
這裡連線使用的是服務名orclpdb1,不是SID。
3.3. 登入客戶端
重啟trino服務:
service trino stop ; service trino start ;
或者
service trino restart ;
登入客戶端命令:
./trino-cli --server localhost:8080
3.4. 操作Oracle
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs;
(2)檢視oracle下所有的schemas (對應為使用者)
show schemas from oracle;
如果連線失敗,可以檢視日誌/var/log/trino/server.log
(3)檢視資料庫中的所有表
show tables from oracle.dsjzx;
(4)查詢表資料
use oracle.dsjzx;
select * from oracle.dsjzx.ora_test01;
說明:在Oracle中使用Number欄位型別時,必須指定精度,即NUMBER(p)或者NUMBER(p, s)。否則該欄位在Tirno中無法識別。
(5)插入資料
insert into ora_test01(tid,name) values(99,'XXXXX');
select * from ora_test01;
(6)修改資料
update ora_test01 set name = 'YYYYY' where tid = 99 ;
select * from ora_test01 ;
(7)刪除資料
delete from ora_test01 where tid = 99 ;
select * from ora_test01 ;
(8)檢視錶結構和建表語句
desc ora_test01;
或者 show columns from ora_test01 ;
show create table ora_test01;
(9)退出客戶端
quit; 或者exit;
4. Kafka聯結器
Kafka聯結器允許使用Apache Kafka主題作為Trino中的表。每條訊息在Trino中顯示為一行。
主題可以是實時的,當行在資料到達時顯示,在資料段被丟棄時消失。如果在一個查詢中多次訪問同一個表(例如:自聯接),這可能會導致奇怪的行為。
Kafka聯結器跨Workers並行地讀取和寫入來自Kafka主題的訊息資料,以實現顯著的效能提升。這種並行化的資料集大小是可配置的,因此可以根據特定需求進行調整。
4.1. 要求
(1) Kafka broker 版本 0.10.0 或更高版本。
(2) 從 Trino 協調器(coordinator)和工作節點(Worker)到 Kafka 節點的網路訪問。 預設埠是9092。
4.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi kafka.properties
connector.name=kafka
kafka.table-names=mytest
kafka.nodes=hadoop01:9092,hadoop02:9092,hadoop03:9092
kafka.table-description-dir=/etc/trino/kafka
#kafka.hide-internal-columns=false
說明:
(1)kafka.table-description-dir=/etc/trino/kafka :kafka的主題檔案目錄指定,需要配置引數。其中包含一個或多個JSON檔案(必須以.json結尾),其中包含表描述檔案。
(2)kafka.hide-internal-columns=false :用於顯示Kakfa隱藏的內部列名。預設值為true,不顯示Kafka隱藏的內部列名。
4.3. 登入客戶端
重啟trino服務:
service trino stop ; service trino start ;
或者
service trino restart ;
登入客戶端命令:
./trino-cli --server localhost:8080
4.4. 操作Kafka
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs
(2)檢視kafka下所有的schemas
show schemas from kafka;
(3)檢視kafka中的所有topic
show tables from kafka.default;
(4)檢視topic的資訊
use kafka.default;
desc mytest ;
(5)查詢Topic資料
select * from mytest ;
(6)將Topic中的值對映到Trino的列
編輯表資訊的json檔案。
vi /etc/trino/kafka/default.mytest.json
{
"tableName": "mytest",
"schemaName": "default",
"topicName": "mytest",
"message": {
"dataFormat": "csv",
"fields": [
{
"name": "id",
"mapping": "0",
"type": "VARCHAR"
},
{
"name": "name",
"mapping": "1",
"type": "VARCHAR"
}
]
}
}
然後重啟Trino服務。
service trino restart ;
接著透過生產者向topic寫入csv格式的資料,以逗號作為分隔符。
bin/kafka-console-producer.sh --broker-list hadoop01:9092 --topic mytest
最後查詢topic中的資料。
插入資料(暫時未驗證透過)
insert into mytest(id,name) values('1','tom');
5. Hive聯結器
Hive 聯結器允許查詢儲存在 Apache Hive 資料倉儲中的資料。
Hive是三個元件的組合:
(1) 不同格式的資料檔案,通常儲存在Hadoop分散式檔案系統(HDFS)或AmazonS3等物件儲存系統中。
(2) 關於如何將資料檔案對映到架構和表的後設資料。這些後設資料儲存在資料庫中,如MySQL,並透過Hive元儲存服務進行訪問。
(3) 一種稱為HiveQL的查詢語言。這種查詢語言是在分散式計算框架(如MapReduce或Tez)上執行的。
Trino只使用前兩個元件:資料和後設資料。它不使用HiveQL或Hive執行環境的任何部分。
5.1. 要求
(1) Hive 聯結器需要 Hive 元儲存服務 (HMS) 或相容的實現 Hive 元儲存,例如 AWS Glue。
(2) 支援Apache Hadoop HDFS 2.x和3.x。
(3) 資料檔案必須採用受支援的格式:ORC、Parquet、Avro、RCText (RCFile using ColumnarSerDe)、RCBinary (RCFile using LazyBinaryColumnarSerDe)、SequenceFile、JSON (using org.apache.hive.hcatalog.data.JsonSerDe)、CSV (using org.apache.hadoop.hive.serde2.OpenCSVSerde)、TextFile。
5.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi hive.properties
connector.name=hive
hive.metastore.uri=thrift://192.168.80.131:9083
hive.config.resources=/etc/trino/hadoop/core-site.xml,/etc/trino/hadoop/hdfs-site.xml
這裡主機要使用IP地址,不要使用主機名。
5.3. Hive準備資料
!connect jdbc:hive2://192.168.80.131:10000
use default;
create table tbl001(id bigint, name string);
insert into tbl001(id,name) values(1,'111111'),(2,'222222'),(3,'333333');
select * from tbl001;
5.4. 登入客戶端
重啟trino服務:
service trino stop ; service trino start ;
或者
service trino restart ;
登入客戶端命令:
./trino-cli --server localhost:8080
5.5. 操作Hive
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs;
(2)檢視hive下所有的schemas (對應為資料庫)
show schemas from hive;
如果連線失敗,可以檢視日誌/var/log/trino/server.log
(3)檢視資料庫中的所有表
show tables from hive.default;
(4)檢視錶結構
desc hive.default.tbl001;
(5)檢視錶的資料
use hive.default;
select * from hive.default.tbl001;
(6)插入資料
insert into tbl001 values(99,'999999');
select * from tbl001;
(7)修改表的資料
update tbl001 set name = 'XXXXXXX' where id = 99 ;
提示說明:只有Hive事務表支援修改表的行。
在Hive中建立事務表,並匯入資料
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1;
create table trans_tbl001(
id bigint,
name string
)
clustered by (id) into 2 buckets
stored as orc
TBLPROPERTIES('transactional'='true');
insert into trans_tbl001(id,name) values(1,'111111');
insert into trans_tbl001(id,name) values(2,'222222');
insert into trans_tbl001(id,name) values(3,'333333');
insert into trans_tbl001(id,name) values(99,'999999');
透過trino客戶端查詢資料
select * from trans_tbl001 ;
透過trino客戶端修改資料
update trans_tbl001 set name = 'XXXXXXX' where id = 99 ;
select * from trans_tbl001 ;
(8)刪除表的資料
delete from tbl001 where id = 99 ;
提示說明:只有Hive事務表支援修改表的行。
delete from trans_tbl001 where id = 99 ;
select * from trans_tbl001 ;
(9)查詢建表語句
show create table trans_tbl001;
6. Hudi聯結器
Hudi 聯結器支援查詢 Hudi 表,暫不支援插入、修改、刪除操作。
6.1. 要求
(1) Hudi版本0.12.3或更高版本。
(2) Trino協調員(coordinator)和工作節點(workers )對對Hudi儲存的網路訪問。
(3) 訪問Hive元儲存服務(HMS)。
(4) Trino協調員(coordinator)到HMS的網路接入。
(5) 以Parquet檔案格式儲存在支援的檔案系統中的資料檔案。
6.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi hudi.properties
connector.name=hudi
hive.metastore.uri=thrift://192.168.80.131:9083
這裡主機要使用IP地址,不要使用主機名。
6.3. Hudi準備資料
(1)Hudi與Spark整合(省略)
(2)啟動Spark-sql
spark-sql \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
--conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog' \
--conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'
(3)建立Hudi表
create database hudi_db;
use hudi_db;
create table hudi_mor_tbl (
id int,
name string,
price double,
ts bigint
) using hudi
tblproperties (
type = 'mor',
primaryKey = 'id',
preCombineField = 'ts'
);
(4)匯入資料
insert into hudi_mor_tbl select 99, 'a99', 20.0, 900;
6.4. 登入客戶端
重啟trino服務:
service trino stop ; service trino start ;
或者
service trino restart ;
登入客戶端命令:
./trino-cli --server localhost:8080
6.5. 操作Hudi
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs;
(2)檢視hudi下所有的schemas (對應為資料庫)
show schemas from hudi;
如果連線失敗,可以檢視日誌/var/log/trino/server.log
(3)檢視資料庫中的所有表
show tables from hudi.hudi_db;
(10)檢視錶結構
desc hudi.hudi_db.hudi_mor_tbl;
(11)檢視錶的資料
use hudi.hudi_db;
select * from hudi_mor_tbl;
(12)檢視後設資料表
select * from "hudi_mor_tbl$timeline" ;
Hudi聯結器為每個Hudi表公開一個後設資料表。後設資料表包含有關Hudi表的內部結構的資訊。可以透過將後設資料表名稱附加到表名稱上來查詢每個後設資料表:select * from "test_table$timeline"。
(13)Hudi聯結器暫不支援insert、update、delete操作
7. Iceberg聯結器
Apache Iceberg是一種用於大型分析資料集的開放表格式。Iceberg聯結器允許查詢以Iceberg格式編寫的檔案中儲存的資料,如Iceberg表規範中所定義的。
7.1. 要求
(1) Trino協調員(coordinator)和工作節點(workers )對分散式物件儲存的網路訪問。
(2) 訪問Hive元儲存服務(HMS)、AWS Glue目錄、JDBC目錄、REST目錄或Nessie伺服器。
(3) 在支援的檔案系統上,以檔案格式ORC或Parquet(預設)儲存的資料檔案。
7.2. 配置
在/etc/trino/catalog中建立一個example.properties的屬性檔案。
cd /etc/trino/catalog
vi iceberg.properties
connector.name=iceberg
iceberg.catalog.type=hive_metastore
hive.metastore.uri=thrift://192.168.80.131:9083
這裡主機要使用IP地址,不要使用主機名。
7.3. Iceberg準備資料
##登入hive客戶端
hive
##建立資料庫
create database iceberg_db ;
use iceberg_db;
##建立Iceberg表
SET iceberg.catalog.iceberg_hive.type=hive;
SET iceberg.catalog.iceberg_hive.uri=thrift://192.168.80.131:9083;
SET iceberg.catalog.iceberg_hive.clients=10;
SET iceberg.catalog.iceberg_hive.warehouse=hdfs://192.168.80.131:8020/data/warehouse/iceberg-hive;
CREATE TABLE iceberg_test001 (
id int,
name string,
birthday date,
create_time timestamp
)
PARTITIONED BY(provincial string,ds string)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
TBLPROPERTIES('iceberg.catalog'='iceberg_hive');
##插入資料
INSERT INTO iceberg_test001 values
(10001, 'a10001', '2020-01-01', current_timestamp(),'99999999','20240226'),
(10002, 'a10002', '2012-04-18', current_timestamp(),'99999999','20240226'),
(10003, 'a10003', '2015-11-03', current_timestamp(),'99999999','20240226'),
(10004, 'a10004', '2013-08-27', current_timestamp(),'99999999','20240226');
##查詢資料
select * from iceberg_test001 ;
7.4. 登入客戶端
重啟trino服務:
service trino stop ; service trino start ;
或者
service trino restart ;
登入客戶端命令:
./trino-cli --server localhost:8080
7.5. 操作Iceberg
7.5.1. Trino自建表的操作
(1)顯示所有的catalog (catalog目錄下的properties檔名)
show catalogs;
(2)建立SCHEMA
CREATE SCHEMA iceberg.iceberg_hive
WITH (location='hdfs://192.168.80.131:8020/data/warehouse/iceberg-hive/');
(3)建立表
use iceberg.iceberg_hive ;
CREATE TABLE example_test01 (
id INTEGER,
name VARCHAR,
birthday DATE,
create_time TIMESTAMP,
provincial VARCHAR,
ds VARCHAR
)
WITH (
format = 'PARQUET',
partitioning = ARRAY['provincial', 'ds'],
sorted_by = ARRAY['id']
);
(4)插入資料
insert into example_test01 values
(10001, 'a10001',cast( '2020-01-01' as date), current_timestamp,'99999999','20240226'),
(10002, 'a10002', cast('2012-04-18' as date), current_timestamp,'99999999','20240226'),
(10003, 'a10003',cast( '2015-11-03' as date), current_timestamp,'99999999','20240226'),
(10004, 'a10004',cast( '2013-08-27' as date), current_timestamp,'99999999','20240226');
select * from example_test01 ;
(5)修改資料
update example_test01 set name = 'XXXXXX' where id = 10004 ;
select * from example_test01 where id = 10004 ;
(6)刪除資料
delete from example_test01 where id = 10004 ;
select * from example_test01 ;
(7)檢視所有的表
show tables;
(8)檢視錶結構和建表語句
desc example_test01 ;
show create table example_test01;
測試在hive中是否可以讀取該表的資料
select * from example_test01 ;
從中可以看到,透過Trino建立的表,在Hive中無法查詢。
為什麼?
Trino和Hive建立Iceberg表的序列化規則(ROW FORMAT SERDE)和儲存格式(STORED BY)不同。
--透過Trino建立生成的Iceberg表:
CREATE EXTERNAL TABLE `example_test01`(
`id` int,
`name` string,
`birthday` date,
`create_time` timestamp,
`provincial` string,
`ds` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.FileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.mapred.FileOutputFormat'
LOCATION 'hdfs://192.168.80.131:8020/data/warehouse/iceberg-hive/example_test01-50b32dc5ec9247498ea7fb35d5f526bb'
TBLPROPERTIES (
'metadata_location'='hdfs://192.168.80.131:8020/data/warehouse/iceberg-hive/example_test01-50b32dc5ec9247498ea7fb35d5f526bb/metadata/00004-cad950c2-57be-4550-9add-c363c70ef484.metadata.json',
'previous_metadata_location'='hdfs://192.168.80.131:8020/data/warehouse/iceberg-hive/example_test01-50b32dc5ec9247498ea7fb35d5f526bb/metadata/00003-a6d3f156-0f4a-4450-a70b-d02bb1a75e97.metadata.json',
'table_type'='ICEBERG',
'transient_lastDdlTime'='1709000455');
--透過Hive建立的Iceberg表
CREATE TABLE `iceberg_test001`(
`id` int COMMENT 'from deserializer',
`name` string COMMENT 'from deserializer',
`birthday` date COMMENT 'from deserializer',
`create_time` timestamp COMMENT 'from deserializer',
`provincial` string COMMENT 'from deserializer',
`ds` string COMMENT 'from deserializer')
ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://bdc01/user/hive/warehouse/iceberg_db.db/iceberg_test001'
TBLPROPERTIES (
'bucketing_version'='2',
'current-schema'='{"type":"struct","schema-id":0,"fields":[{"id":1,"name":"id","required":false,"type":"int"},{"id":2,"name":"name","required":false,"type":"string"},{"id":3,"name":"birthday","required":false,"type":"date"},{"id":4,"name":"create_time","required":false,"type":"timestamp"},{"id":5,"name":"provincial","required":false,"type":"string"},{"id":6,"name":"ds","required":false,"type":"string"}]}',
'current-snapshot-id'='2017496957845643908',
'current-snapshot-summary'='{"added-data-files":"1","added-records":"4","added-files-size":"1953","changed-partition-count":"1","total-records":"4","total-files-size":"1953","total-data-files":"1","total-delete-files":"0","total-position-deletes":"0","total-equality-deletes":"0"}',
'current-snapshot-timestamp-ms'='1708941864398',
'default-partition-spec'='{"spec-id":0,"fields":[{"name":"provincial","transform":"identity","source-id":5,"field-id":1000},{"name":"ds","transform":"identity","source-id":6,"field-id":1001}]}',
'engine.hive.enabled'='true',
'external.table.purge'='TRUE',
'iceberg.catalog'='iceberg_hive',
'last_modified_by'='root',
'last_modified_time'='1708941860',
'metadata_location'='hdfs://bdc01/user/hive/warehouse/iceberg_db.db/iceberg_test001/metadata/00001-29819742-3acb-46c0-8234-d16a350f132e.metadata.json',
'previous_metadata_location'='hdfs://bdc01/user/hive/warehouse/iceberg_db.db/iceberg_test001/metadata/00000-4cf17717-07ae-44c2-9079-9b2c8f3e2503.metadata.json',
'snapshot-count'='1',
'table_type'='ICEBERG',
'transient_lastDdlTime'='1708941860',
'uuid'='164870ac-489f-4434-a34c-3ed50340ed34')
7.5.2. 已存在Iceberg表的操作
(1)檢視iceberg下所有的schemas (對應為資料庫)
show schemas from iceberg;
如果連線失敗,可以檢視日誌/var/log/trino/server.log
(2)檢視資料庫中的所有表
show tables from iceberg.iceberg_db;
(3)檢視錶結構
desc iceberg.iceberg_db.iceberg_test001;
透過Hive建立的Iceberg表,在Trino中無法訪問。為什麼?
第四章 功能驗證
1. 跨源關聯計算
./trino-cli --server localhost:8080
--查詢表資料
select * from mysql.test.tbl001
select * from postgresql.public.test001 ;
select * from kafka.default.mytest ;
select * from hive.default.tbl001;
select * from iceberg.iceberg_hive.example_test01;
--MySQL和postgreSQL關聯
select
my.id,
my.name mysql_name,
pg.name pg_name,
kfk.name kafka_name,
hv.name hive_name,
icbg.name iceberg_name
from mysql.test.tbl001 my
inner join postgresql.public.test001 pg on my.id = pg.id
inner join kafka.default.mytest kfk on my.id = cast(kfk.id as bigint)
inner join hive.default.tbl001 hv on my.id = hv.id
inner join iceberg.iceberg_hive.example_test01 icbg on my.id = icbg.id;