Trino 436 - 使用教程(親測,詳細)

业余砖家發表於2024-12-10

第一章 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;

相關文章