EMR Trino提供了獨立的Delta連接器,在E-MapReduce叢集上支援了較為完整的資料湖特性並進行了特性擴充。
背景資訊
Delta Lake是DataBricks公司推出的一種資料湖方案,以資料為中心,圍繞資料流走向推出了一系列功能特性,詳情請參見Delta Lake概述。
前提條件
已建立DataLake叢集、Custom叢集,並選擇了Trino服務,或者建立Hadoop叢集,並選擇了Presto服務,詳情請參見建立叢集。
使用限制
DataLake叢集、Custom叢集,和EMR-3.39.1及後續版本、EMR-5.5.0及後續版本的Hadoop叢集,支援配置Delta連接器。
基礎使用
修改Delta連接器配置
修改Delta連接器配置,詳情請參見修改內建連接器。
連接器預設配置
進入EMR控制台的Trino服務的配置頁面,在服務配置地區,單擊delta.properties頁簽,您可以修改或添加參數,參數值請根據您實際情況修改。
參數 | 描述 |
hive.metastore.uri | Hive Metastore使用Thrift協議串連的URI。參數值您可以根據實際情況修改,預設格式為thrift://master-1-1.cluster-24****:9083。 |
hive.config.resources | Hive Metastore使用的資源檔位置。 |
樣本
Trino無法建立或修改Delta Lake表,可以使用Spark-sql來建立,詳情請參見基礎使用。
產生資料。
執行以下命令,進入Spark-sql命令列。
spark-sql
執行以下命令,建立Delta表。
CREATE TABLE delta_table (id INT) USING delta;
執行以下命令,寫入資料。
INSERT INTO delta_table VALUES 0,1,2,3,4;
查詢資料。
進入Trino命令列,詳情請參見通過命令方式訪問Trino。
執行以下命令,查詢表資訊。
SELECT * FROM delta_table;
返回資訊如下。
id ---- 0 1 2 3 4 (5 rows)
高階使用
僅EMR-3.39.1、EMR-5.5.0版本支援下列功能。
Time Travel
Time Travel允許查詢錶的歷史資料。
EMR Trino支援Delta表的Time Travel特性,文法為for xxx as of
,其中xxx
的值可以為VERSION或TIMESTAMP,分別對應版本號碼和時間戳記兩種Time travel模式。
Trino支援的Time Travel文法和Delta Lake在Spark SQL上的文法相比,多了一個FOR
關鍵字。
樣本如下:
執行以下命令,進入Spark-sql命令列。
spark-sql
執行以下命令,覆蓋資料。
INSERT OVERWRITE TABLE delta_table VALUES 5,6,7,8,9;
查詢資料。
進入Trino命令列,詳情請參見通過命令方式訪問Trino。
執行以下命令,查詢表資訊。
SELECT * FROM delta_table;
返回資訊如下。
id ---- 5 6 7 8 9 (5 rows)
使用Time Travel查詢歷史資料。
執行以下命令,按版本號碼查詢資料,直接填寫版本號碼即可。 版本號碼是一個單調遞增的整數。預設第一次INSERT之後版本號碼為1,之後每修改一次版本號碼加1。
SELECT * FROM delta_table FOR VERSION AS OF 1;
返回資訊如下。
id ---- 2 1 3 4 0 (5 rows)
按時間戳記查詢資料,共支援DATE、TIMESTAMP和TIMESTAMP WITH TIME ZONE三種類型的時間戳記。
DATE類型:查詢日期所對應的UTC時間00:00:00的資料。
TIMESTAMP類型:查詢指定時間戳記對應的UTC的資料。
例如,使用TIMESTAMP類型查詢北京時間(+08:00)2022年2月15日20點整的資料,則代碼如下。
SELECT * FROM delta_table FOR TIMESTAMP AS OF TIMESTAMP '2022-02-15 12:00:00';
說明其中,第一個TIMESTAMP說明使用的是時間戳記進行Time Travel查詢(非版本號碼),第二個TIMESTAMP則說明時間戳記是TIMESTAMP類型(非DATE類型)。
返回資訊如下。
id ---- 2 0 3 4 1 (5 rows)
TIMESTAMP WITH TIME ZONE類型:無法直接讀取資料,需要進行格式轉換。
例如,查詢北京時間(+08:00)2022年2月15日20點的資料。程式碼範例如下。
SELECT * FROM delta_table FOR TIMESTAMP AS OF CAST('2022-02-15 20:00:00 +0800' AS TIMESTAMP WITH TIME ZONE);
Z-Order
Trino基於Z-Order最佳化了Delta表查詢。目前支援Parquet自身的最佳化和Data Skipping的最佳化。執行最佳化後,Delta會按檔案粒度統計各個欄位的最大和最小值,該統計資訊用於直接過濾資料檔案。Trino的Delta連接器可以讀取到這些統計資訊。
對於使用OPTIMIZE和ZORDER BY命令最佳化過的Delta表,在Z-Order列設定合適時,Trino的查詢速度最大能夠提升數十倍。
Trino支援Z-order的資料類型有Int、Long、Double、Float、Binary、Boolean、String和Array。
Trino支援Z-Order Data Skipping的謂詞有=
、<
、<=
、>
和>=
。
Trino暫不支援like和in等謂詞,但由於Z-order的局部排序能力,這些謂詞在Z-order最佳化後同樣可以提升查詢速度。
例如,表conn_zorder,共含有src_ip、src_port、dst_ip和dst_port四列。
先在Spark中執行最佳化,命令如下所示。
OPTIMIZE conn_zorder ZORDER BY (src_ip, src_port, dst_ip, dst_port);
括弧中的順序即為Z-Order的順序。
OPTIMIZE操作會根據資料量大小耗費一定時間。最佳化完成後,執行合格查詢均會提升效能。
查詢一部分Z-Order最佳化的列能提升效能,命令如下所示。
SELECT COUNT(*) FROM conn_zorder WHERE src_ip > '64.';
按Z-Order的最佳化順序執行查詢,速度提升非常大,命令如下所示。
SELECT COUNT(*) FROM conn_zorder WHERE src_ip >= '64.' AND dst_ip < '192.' AND src_port < 1000 AND dst_port > 50000;