天天看點

【大資料】Presto(Trino)配置參數以及 SQL文法

作者:大資料老司機

一、概述

Trino (前身為PrestoSQL)是一款高性能,分布式的SQL查詢引擎,可以用于查詢各種類型的資料存儲,包括Hive、Mysql、Elasticsearch、Kafka、PostgreSQL等。在使用Trino時,可以通過一些參數來控制查詢的行為,例如:

  • coordinator節點和worker節點的數量: 這兩個參數控制了Trino叢集中管理查詢的節點數量,它們的配合調整可以影響整個叢集的查詢效率。
  • memory和cpu的配置設定: 這些參數控制了Trino在查詢和計算時使用的記憶體和CPU數量。可以根據叢集的實際硬體情況和查詢工作負載來靈活配置。
  • join分布式:控制join關鍵字的使用。join分布式是一種優化政策,在大規模資料集上運作的查詢中處理join操作非常簡單。
  • 指定資料源:可以使用catalog和schema(資料庫)兩個關鍵字指定Trino查詢的資料源。
  • 分區和bucket表的查詢: 分區表是對表進行分區和拆分的一種方式,通過分區表查詢隻需掃描相應分區,提高了查詢效率。bucket表是一種将資料分散在多個桶中的表格,它們可以通過桶數對資料進行分片,并行化查詢操作,進而提高查詢性能。

Trino官方文檔:https://trino.io/docs/current/

關于更多的Presto介紹可以參考我這篇文章:大資料Hadoop之——基于記憶體型SQL查詢引擎Presto(Presto-Trino環境部署)

【大資料】Presto(Trino)配置參數以及 SQL文法

二、Trino coordinator 和 worker 節點作用

1)Trino coordinator 節點作用

在Trino中,coordinator節點是整個叢集的管理節點,它的作用包括:

  • 查詢協調:coordinator節點負責協調所有查詢操作,如解析sql語句、生成查詢計劃、排程和配置設定查詢任務等。它會根據查詢的複雜度和資料源的規模來判斷查詢是否需要被分割和并行執行,以提高查詢效率和資源使用率。
  • 資源管理:coordinator節點負責管理整個叢集的資源,如記憶體、CPU等。它會根據每個查詢的資源需求和叢集的可用資源情況來動态調整資源使用情況,以保證叢集的穩定性和性能。
  • 節點管理:coordinator節點負責管理叢集的所有worker節點,包括狀态更新、任務配置設定、心跳檢測等。它會監測節點的可用性和狀态,并根據叢集負載情況來動态調整節點的任務配置設定和負載平衡政策,以保證整個叢集的穩定性和可用性。
  • 叢集監控:coordinator節點負責監控整個叢集的運作狀況,包括各個節點的狀态、負載情況、查詢性能等。它會将這些資訊進行彙總和分析,并生成相應的報告和名額,以便管理者進行叢集的優化和調整。
  • 系統管理:coordinator節點負責管理整個Trino系統,包括配置檔案管理、插件管理、安全管理等。它會根據管理者的設定和權限來進行相應的管理和控制,以保證整個系統的穩定性和安全性。

是以,可以看出coordinator節點在Trino叢集中起到了至關重要的作用,它是整個叢集的大腦和控制中心。為了保證叢集的性能和可用性,建議對coordinator節點進行适當的配置和管理,以滿足查詢複雜度和資料量的需求。

2)Trino worker 節點作用

在Trino中,worker節點是叢集中執行任務的節點。它的作用包括:

  • 任務執行:worker節點負責執行coordinator配置設定給它的任務,如資料讀取、資料過濾、資料聚合等。它會将資料處理的結果傳回給coordinator節點,以便進行下一步的處理和計算。
  • 資料存儲:worker節點負責存儲叢集中的資料,包括資料的分片、存儲和管理等。它會維護一個資料存儲倉庫,并根據查詢計劃和任務配置設定來讀取和處理資料,以提高查詢效率和資源使用率。
  • 資源管理:worker節點會根據叢集的資源限制和任務優先級,動态調整資源的配置設定和使用情況,以保證叢集的穩定性和性能。
  • 網絡通信:worker節點負責與coordinator節點進行通信,并根據配置設定的任務來讀取和處理資料。它需要保證和coordinator節點的通信暢通,并及時回報處理結果。

是以,可以看出worker節點在Trino叢集中扮演了至關重要的角色,它是整個叢集的工作機器和資料存儲倉庫。為了保證叢集的性能和可用性,建議對worker節點進行适當的配置和管理,以滿足查詢和資料處理的需求。同時,建議使用者根據自己的業務需求和資料量來增加或降低worker節點的數量和配置,以達到最佳的資源使用率和查詢效率。

三、Trino 參數詳細講解

1)coordinator 節點配置

1、config.properties 配置檔案

config.properties是Trino伺服器的配置檔案,它包含了Trino伺服器的各種配置選項,如節點配置、查詢優化器配置、記憶體和CPU配置、叢集安全配置等。下面是幾個常見的config.properties選項:

  • coordinator=true/false:配置目前節點是否為coordinator節點。
  • node-scheduler.include-coordinator:是Trino協調節點(coordinator)的配置參數之一,用于控制排程器是否包括協調節點自身作為可用的執行節點。預設情況下,node-scheduler.include-coordinator的值為 true,即協調節點被視為可用的執行節點。
  • task.max-memory-per-node:該參數用于設定每個工作節點上單個任務(task)可使用的最大記憶體量。它定義了每個任務在工作節點上可以使用的最大記憶體量。機關可以是位元組(B)、千位元組(KB)、兆位元組(MB)、千兆位元組(GB)或太位元組(TB)。
  • query.max-memory:這個參數設定了每個查詢可使用的最大記憶體量。它控制着整個查詢在所有工作節點上可以使用的總記憶體量。當查詢需要的記憶體超過這個限制時,Trino将抛出記憶體不足的錯誤。
  • query.max-memory-per-node:此參數定義了每個工作節點可使用的最大記憶體量。它限制了單個查詢在單個工作節點上可以使用的最大記憶體量。當單個任務需要的記憶體超過此限制時,Trino将啟動其他任務以利用其他工作節點上的記憶體。
  • query.max-total-memory-per-node: 該參數限制了每個工作節點可使用的最大總記憶體量。它控制着所有正在運作的查詢在單個工作節點上可以使用的總記憶體量。當工作節點上的查詢總記憶體使用超過此限制時,Trino将拒絕新的查詢請求。
  • memory.heap-headroom-per-node:用來配置Trino worker節點的Java堆空間餘量的選項。它指定了每個worker節點JVM堆中保留的額外記憶體空間的大小,用于處理臨時記憶體和查詢的記憶體需求。預設情況下,memory.heap-headroom-per-node的值是0。這意味着Trino使用預設的Java Heap記憶體配置設定政策來處理記憶體,并盡可能避免OOM(記憶體不足)錯誤。
  • query.max-run-time:配置每個查詢的最大運作時間,防止查詢太複雜導緻資源耗盡。
  • http-server.http.port=8080:配置http伺服器的端口号。
  • query.results.max-age=1m:配置查詢結果在記憶體中的最大儲存時間,防止浪費記憶體。
  • query.priority=1:配置查詢的優先級,以便coordinator節點排程任務。
  • exchange.client-threads=2:配置worker節點與coordinator節點之間資料交換的線程數量,以提高網絡通信效率。
  • plugin.<plugin-name>.<option>=<value>:配置插件選項和值,以擴充Trino的功能和支援新的資料源。

是以,config.properties檔案對于Trino伺服器的性能和功能都具有重要的作用,建議管理者和使用者仔細查閱和配置。同時,可以根據業務需求和系統資源情況來适當調整其中的選項,以達到最佳的性能和效率。

示例配置如下:

###################################
## 協調節點配置
###################################
coordinator=true

###################################
## HTTP服務配置
###################################

http-server.http.port=8080

###################################
## 記憶體配置
###################################

query.max-memory=5GB
query.max-memory-per-node=2GB
query.max-total-memory-per-node=10GB

###################################
## 發現服務配置
###################################

discovery-server.enabled=true
discovery.uri=http://localhost:8080

###################################
## 插件配置
###################################

plugin.myplugin.property=value

###################################
## 其他配置
###################################

# 身份驗證配置
http-server.authentication.type=PASSWORD
http-server.authentication.password-user-mapping-file=etc/password-authenticator.properties

# 授權配置
access-control.name=my-access-control
access-control.config-file=etc/access-control.properties

# 中繼資料存儲配置
metadata.store.type=jdbc
metadata.store.jdbc-url=jdbc:postgresql://localhost:5432/trino_metadata
metadata.store.username=trino
metadata.store.password=secret

# 叢集配置
discovery-server.enabled=true
discovery.uri=http://localhost:8080
node-scheduler.include-coordinator=true

# 名額和監控配置
metrics.enabled=true
metrics.reporting-interval=1m
metrics.store.type=prometheus
metrics.store.reporters=prometheus
metrics.store.prometheus.uri=http://localhost:9090/metrics
           

2、jvm.config 配置檔案

Trino協調節點(coordinator)的JVM配置檔案是 jvm.config。它位于Trino安裝目錄的 etc 檔案夾中。

jvm.config 檔案用于配置協調節點的Java虛拟機(JVM)參數,以控制記憶體、垃圾回收、線程等方面的行為。

一些常用的JVM參數及其含義:

-server:啟用伺服器模式,優化性能。

-Xmx8G:設定Java堆的最大記憶體為8GB。最好是配置小于32G。

-XX:+UseG1GC:啟用G1垃圾收集器。

-XX:InitialRAMPercentage:是一個Java虛拟機(JVM)參數,用于設定初始堆記憶體的百分比。它指定了初始堆記憶體大小相對于可用系統記憶體的比例。預設值為64,表示JVM将會使用可用系統記憶體的64%。

`-XX:InitialRAMPercentage` 該參數通常與`-Xmx`(最大堆記憶體)參數一起使用,以確定在應用程式啟動時配置設定足夠的初始堆記憶體。

-XX:InitialRAMPercentage 和 -Xmx 都是用于配置Java虛拟機(JVM)的堆記憶體參數。下面是一個示例配置和相應的換算示例:

-XX:InitialRAMPercentage=25
-Xmx8G

假設可用系統記憶體為16GB(Gigabytes),我們将根據配置計算初始堆記憶體和最大堆記憶體的大小。

首先,我們使用 -XX:InitialRAMPercentage 參數來計算初始堆記憶體的大小:

初始堆記憶體大小 = 可用系統記憶體 * (InitialRAMPercentage / 100)

初始堆記憶體大小 = 16GB * (25 / 100) = 4GB

接下來,我們使用 -Xmx 參數來指定最大堆記憶體的大小,這裡設定為8GB。

是以,根據以上配置和換算示例,初始堆記憶體将為4GB,最大堆記憶體将為8GB。

請注意,確定根據實際系統記憶體大小和應用程式的記憶體需求進行适當的調整。對于初始堆記憶體和最大堆記憶體,建議根據應用程式的性能需求進行合理配置,以確定充分利用系統資源并避免記憶體不足或浪費的情況。

此外,-XX:InitialRAMPercentage 和 -Xmx 參數的可用性和行為可能因JVM的版本和廠商而有所不同。請參考所使用JVM的文檔以擷取準确的資訊。
           
  • -XX:MaxRAMPercentage:是一個JVM參數,用于指定JVM使用系統記憶體的最大百分比。這個參數可以被用于Trino和其他Java應用程式。它的預設值為64,表示JVM将最大使用可用系統記憶體的64%。例如,如果系統有16GB記憶體可用,則預設情況下JVM将使用10.24GB記憶體。
  • -XX:MaxRAMPercentage:是一個JVM參數,用于控制G1垃圾收集器中堆區域的大小。G1垃圾收集器是Java SE 9及更高版本中使用的一種高效的垃圾收集器,可以用于Trino和其他Java應用程式。堆區域是G1垃圾收集器中記憶體配置設定的最小機關。這個參數的預設值是堆大小除以2048,最小值是1MB,最大值是32MB。這意味着如果堆大小是8GB,則每個堆區域的預設大小是4MB。
  • -XX:+ExplicitGCInvokesConcurrent:是一個JVM參數,用于啟用顯式垃圾回收調用時并發處理的垃圾收集器。在此模式下,會在發出垃圾回收調用時,同時運作一個并發垃圾收集器,以優化程式的性能。
  • -XX:+ExitOnOutOfMemoryError:是一個JVM參數,用于在發生OutOfMemoryError錯誤時自動退出JVM。OutOfMemoryError指的是Java程式中無法配置設定足夠的記憶體的情況。預設情況下,JVM在發生OutOfMemoryError時不會終止。如果您使用這個參數,則JVM将在發生OutOfMemoryError時立即退出,進而防止程式繼續運作并進一步損壞資料或系統。
  • -XX:-OmitStackTraceInFastThrow:是一個JVM參數,用于在Java程式中啟用錯誤堆棧跟蹤提示。通常,當Java程式中發生異常或錯誤時,系統會生成一個堆棧跟蹤提示來告訴您程式執行過程中出現了哪些錯誤。預設情況下,當程式中的代碼中發生快速失敗時,JVM會省略異常堆棧跟蹤提示,以提高程式的性能。這意味着,當程式出現錯誤時,您可能無法輕松地DEBUG并查找到底發生了什麼錯誤。
  • -XX:ReservedCodeCacheSize:是一個JVM參數,用于設定JIT編譯器代碼緩存的最大大小。預設情況下,JIT編譯器會将編譯過的代碼存放在代碼緩存中,以加速程式的後續執行。然而,如果緩存大小不夠,JIT編譯器可能會不得不丢棄部分編譯過的代碼,這會導緻程式性能下降。
  • -XX:PerMethodRecompilationCutoff:是一個Java虛拟機(JVM)的參數,用于設定方法重新編譯的門檻值。它指定了一個方法在執行多少次之後需要重新編譯。該參數的值通常是一個正整數,預設值為15000。
  • -XX:PerBytecodeRecompilationCutoff:是一個Java虛拟機(JVM)的參數,用于設定位元組碼重新編譯的門檻值。它指定了一個方法的位元組碼在執行多少次之後需要重新編譯。該參數的值通常是一個正整數,預設值為10000。
  • -Djdk.attach.allowAttachSelf 是一個Java系統屬性,用于允許Java程序自己附加到自己。該屬性通常用于啟用Java程式自我監視和調試的功能。預設情況下,此屬性被設定為"false",禁止Java程序附加到自身。要允許Java程序附加到自身,需要将該屬性設定為"true"。
  • -Djdk.nio.maxCachedBufferSize:是一個Java系統屬性,用于設定NIO緩沖區的最大緩存大小。NIO(New I/O)是Java提供的一種高性能I/O操作方式。該屬性指定了NIO緩沖區在緩存中的最大大小。預設情況下,該屬性未設定,使用JVM内部的預設值。可以通過設定該屬性為一個正整數值來限制NIO緩沖區的最大緩存大小,以控制記憶體的使用。預設值取決于 Java 運作時環境的版本。在 Java 8 及之前的版本中,預設值為 -1,表示不限制 NIO 緩沖區的最大緩存大小。而在 Java 9 及以後的版本中,預設值為 0,表示禁用 NIO 緩沖區的緩存,即不進行緩存。
  • -XX:+UnlockDiagnosticVMOptions:是一個 Java 虛拟機(JVM)選項,用于解鎖診斷性 VM 選項。預設情況下,JVM 中的某些診斷功能是被禁用的,通過使用該選項,可以解鎖并啟用這些診斷功能。這個選項通常用于開發和調試目的。
  • -XX:+UseAESCTRIntrinsics:是一個 Java 虛拟機(JVM)選項,用于啟用AES-CTR加密算法的硬體優化。當該選項被啟用時,JVM會嘗試使用CPU的AES指令集來執行AES-CTR操作,以提高加密和解密的性能。
  • -XX:-G1UsePreventiveGC:是一個 Java 虛拟機(JVM)選項,用于禁用 G1 垃圾收集器的預防性垃圾回收(Preventive GC)機制。預防性垃圾回收是 G1 垃圾收集器的一項特性,旨在在堆記憶體使用率較低時主動觸發垃圾回收,以避免堆記憶體達到極限。

這個選項通常用于開發和

以下是一個示例的 jvm.config 配置檔案:

-server
-Xmx2G
-XX:InitialRAMPercentage=20
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics
# Disable Preventive GC for performance reasons (JDK-8293861)
-XX:-G1UsePreventiveGC
           

請注意,具體的配置取決于您的硬體資源、工作負載和性能需求。您可以根據您的具體情況來調整和優化JVM參數。

3、log.properties 配置檔案

# 設定日志級别,有四個級别:DEBUG, INFO, WARN and ERROR
io.trino=INFO
           

4、node.properties 配置檔案

# 環境的名字。叢集中所有的Trino節點必須具有相同的環境名稱。
node.environment=production
# 此Trino安裝的唯一辨別符。這對于每個節點都必須是唯一的,不填則是随機的。
node.id=trino-coordinator
# 資料目錄的位置(檔案系統路徑)。Trino在這裡存儲日志和其他資料。
node.data-dir=/opt/apache/trino/data
           

2)worker 節點配置

1、config.properties 配置檔案

以下是一個Trino工作節點的配置檔案示例config.properties,用于配置工作節點的基本設定,包括通信、記憶體、線程池以及插件等。

coordinator=false
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=10GB
query.max-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://<your-coordinator-node-hostname>:8080
exchange.http-client.keep-alive-interval=5m
exchange.http-client.idle-timeout=10m
task.concurrency=16
task.writer-count=4
jvm.configured-initial-ram-percent=80
memory.heap-headroom-per-node=1GB
           

以下是示例配置檔案中的各項設定的含義:

  • coordinator=false:設定目前節點為工作節點而非協調器節點。
  • node-scheduler.include-coordinator=false:用于決定協調器節點是否應該納入查詢計算資源的排程範圍。當該參數設定為true時,協調器節點可以作為一個普通的計算節點來執行查詢,進而幫助處理計算負載。當設定false,這将確定協調器節點不會執行查詢,進而避免了性能瓶頸問題,一般是設定false,禁用協調節點又充當worker節點使用。
  • http-server.http.port=8080:HTTP伺服器監聽的端口号,用于接收REST API請求。
  • query.max-memory=10GB:單個查詢可用的最大記憶體數量。

- query.max-memory-per-node=2GB:單個工作節點可用于執行查詢的最大記憶體數量。

  • discovery-server.enabled=true:啟用節點發現伺服器,用于協調 Trino 群集中的各個節點。
  • discovery.uri=http://<your-coordinator-node-hostname>:8080:發現伺服器節點的URL。
  • exchange.http-client.keep-alive-interval=5m:控制通信時,HTTP用戶端保持活動狀态的時間。
  • exchange.http-client.idle-timeout=10m:當HTTP用戶端處于空閑狀态時,用戶端關閉連接配接之前保持空閑的時間量。
  • task.concurrency=16:在工作節點上同時執行的最大任務數。
  • task.writer-count=4:在工作節點上同時寫入資料的最大任務數。
  • jvm.configured-initial-ram-percent=80:JVM初始堆大小作為RAM百分比的設定。
  • memory.heap-headroom-per-node=1GB:為Trino查詢準備的每個節點之外的堆剩餘空間。

請注意,這隻是一個示例配置,您可以根據您自己的需求進行修改。有關更多配置參數和詳細資訊,請參閱官方文檔:https://trino.io/docs/current/installation/deployment.html。

2、jvm.config 配置檔案

下面是一個Trino工作節點的jvm.config示例配置檔案,它包含了一些常用的JVM參數,可以幫助你優化Trino的性能和記憶體使用率:

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=16M
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ErrorFile=/var/log/trino/hs_err_pid%p.log
-Djava.library.path=/usr/lib/hadoop/lib/native
-Djdk.attach.allowAttachSelf=true
           

這裡是每個參數的含義:

  • -server: 使用JVM的服務模式,通常是用于長時間運作的應用程式。
  • -Xmx16G: 設定JVM可用的最大堆記憶體為16GB。
  • -XX:+UseG1GC: 啟用G1垃圾回收器。
  • -XX:G1HeapRegionSize=16M: 設定G1 GC的堆區域大小為16MB。
  • -XX:+HeapDumpOnOutOfMemoryError: 在記憶體溢出時生成堆記憶體轉儲檔案。
  • -XX:OnOutOfMemoryError=kill -9 %p: 在記憶體溢出時強制殺死Trino程序。
  • -XX:ErrorFile=/var/log/trino/hs_err_pid%p.log: 将JVM錯誤資訊輸出到指定的錯誤檔案中。
  • -XX:+ExplicitGCInvokesConcurrent: 啟用顯式垃圾回收操作。
  • -Djava.library.path=/usr/lib/hadoop/lib/native: 指定Hadoop本機庫的路徑。
  • -Djdk.attach.allowAttachSelf=true: 允許JVM附加到它自己的程序,有助于診斷和調試。

這隻是一個基礎配置檔案,使用者可以根據各自的需求和系統資源狀況進行微調。同時需要注意的是,在配置JVM參數時,一定要謹慎,了解每個參數的含義和影響,并進行适當的測試和調優,以確定系統的穩定性和性能。

3、log.properties 配置檔案

# 設定日志級别,有四個級别:DEBUG, INFO, WARN and ERROR
io.trino=INFO
           

4、node.properties 配置檔案

# 環境的名字。叢集中所有的Trino節點必須具有相同的環境名稱。
node.environment=production
# 此Trino安裝的唯一辨別符。這對于每個節點都必須是唯一的,不填則是随機的。
node.id=trino-worker-1
# 資料目錄的位置(檔案系統路徑)。Trino在這裡存儲日志和其他資料。
node.data-dir=/opt/apache/trino/data
           

四、環境準備

如已經有環境了,可以忽略,如想快熟部署Presto(Trino)環境可參考我這篇文章:【大資料】通過 docker-compose 快速部署 Presto(Trino)保姆級教程

docker exec -it trino-coordinator bash

# --catalog:資料源 --schema:資料庫
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop
           

五、Trino 中的 資料源(catalog)

在Trino中,catalog是一種用于管理資料連接配接和資料源的概念。一個catalog可以代表一個資料庫、一個hive執行個體、或者其他支援的資料源。Trino可以通過啟用不同的catalog來連接配接和查詢不同的資料源,這樣你就可以使用一個Trino叢集查詢多個資料源中的資料,而不需要使用不同的工具和語言進行查詢。

Trino中支援的catalog包括:

系統catalog:包括system、memory、information_schema和metadata,用于管理和查詢Trino系統和運作時資訊。

  • Hive catalog:用于連接配接處理Hive資料。
  • Mysql catalog:用于連接配接在Trino中,catalog是一種用于管理資料連接配接和資料源的概念。一個catalog可以代表一個資料庫、一個hive執行個體、或者其他支援的資料源。Trino可以通過啟用不同的catalog來連接配接和查詢不同的資料源,這樣你就可以使用一個Trino叢集查詢多個資料源中的資料,而不需要使用不同的工具和語言進行查詢。

Trino中支援的catalog包括:

  • 系統catalog:包括system、memory、information_schema和metadata,用于管理和查詢Trino系統和運作時資訊。
  • Mysql catalog:用于連接配接Mysql資料源。
  • Hive catalog:用于連接配接處理Hive資料。
  • Kafka catalog:用于連接配接處理Kafka消息資料。
  • Elasticsearch catalog:用于連接配接處理Elasticsearch資料。
  • Jdbc catalog:用于連接配接處理關系型資料庫。
  • Cassandra catalog:用于連接配接處理Cassandra NoSQL資料庫。

除了以上常用的catalog,Trino還支援許多其他的catalog。你可以通過配置檔案或者指令行參數來啟用或禁用不同的catalog,以便連接配接和查詢不同的資料源。當啟用一個catalog時,需要為它配置連接配接參數和身份憑證等資訊。Trino中的catalog提供了一種簡便而靈活的方式來管理連接配接和查詢多種資料源,使得資料查詢和內建變得更加高效和便利。

官方文檔:https://trino.io/docs/current/connector.html

六、Trino 資料類型

官方文檔:https://trino.io/docs/current/language/types.html

1)基礎資料類型

類型 描述 示例
boolean true或false true
tinyint 8位有符号整數,最小值− 2^7 ,最大值 2^7-1 42
smallint 16位有符号整數,最小值− 2^15 ,最大值 2^15-1 42
integer、int 32位有符号整數,最小值− 2^31 ,最大值 2^31-1
bigint 64位有符号整數,最小值− 2^63 ,最大值 2^63-1
real 32位浮點數,遵循IEEE 754二進制浮點數運算标準 2.71828
double 64位浮點數,遵循IEEE 754二進制浮點數運算标準 2.71828
decimal 固定精度小數 123456.7890
varchar、varchar(n) 可變長度字元串。字元長度為m(m < n),則配置設定m個字元 “hello world”
char、char(n) 固定長度字元串。總是配置設定n個字元,不管字元長度是多少。char表示char(1) “hello world”
  • 當字元串cast為char(n),不足的字元用空格填充,多的字元被截斷
  • 當插入字元串到類型為char(n)的列,不足的字元用空格填充,多了就報錯
  • 當插入字元串到類型為varchar(n)的列,多了就報錯

2)集合資料類型

類型 示例
array array[‘apples’, ‘oranges’, ‘pears’]
map map(array[‘a’, ‘b’, ‘c’], array[1, 2, 3])
json
row row(1, 2, 3)

3)日期時間資料類型

官方文檔:https://trino.io/docs/current/functions.html

類型 描述 示例
date 包含年、月、日的日期 2023-05-14
time 包含時、分、秒、毫秒的時間, 時區可選 16:26:08.123 +08:00
timestamp 包含日期和時間, 時區可選 2023-05-14 16:26:08.123 Asia/Shanghai
interval year to month 間隔時間跨度為年、月 interval ‘1-2’ year to month
interval day to second 間隔時間跨度為天、時、分、秒、毫秒 interval ‘5’ day to second

七、Trino 内置函數

Trino(之前叫Presto)提供了豐富的内置函數,可以滿足各種SQL查詢的需求。下面對Trino内置函數進行詳細說明。

1)數學函數

  • abs(numeric):傳回數值參數的絕對值。
  • ceil(numeric):傳回不小于參數的最小整數。
  • floor(numeric):傳回不大于參數的最大整數。
  • exp(numeric):傳回e的幂次方。
  • log(numeric):傳回參數的自然對數。
  • log10(numeric):傳回參數的以10為底的對數。
  • sqrt(numeric):傳回參數的平方根。
  • power(numeric, numeric):傳回第一個參數乘以第二個參數的幂次方。

2)字元串函數

  • concat(string1, string2, ...): 連接配接兩個或多個字元串。
  • length(str):傳回字元串的長度。
  • substring(str, from [, length ]):傳回字元串的子串,從指定位置開始(從1開始計算),如果提供長度參數,則截取固定長度。
  • replace(str, pattern, replacement):将字元串中的符合模式的字元串替換成替換字元串。
  • lower(str) / upper(str):将字元串轉化成小寫/大寫。
  • trim([characters from] string):去掉字元串頭尾指定的空格或字元。
  • regexp_extract(string, pattern, index):指定模式,并傳回特定位置(從1開始計算)的比對結果。
  • regexp_replace(string, pattern, replacement):将字元串中的符合模式的字元串替換成替換字元串。

3)日期時間函數

  • date(date_string):将日期字元串轉化成日期格式。
  • current_date:傳回目前日期。
  • current_time:傳回目前時間。
  • current_timestamp:傳回目前時間戳。
  • year(date):傳回日期的年份。
  • month(date):傳回日期的月份。
  • day(date):傳回日期的日份。
  • hour(timestamp):傳回時間戳的小時部分。
  • minute(timestamp):傳回時間戳的分鐘部分。
  • second(timestamp):傳回時間戳的秒部分。

4)聚合函數

  • count(*) / count(expression):傳回記錄數。count(*)表示所有行的行數,一般用于計算表的行數。count(expression)傳回expression的不同值的數量。
  • sum(number):傳回列數值的總和。
  • avg(numeric):傳回數值列的平均值。
  • max(value) / min(value):傳回列的最大值/最小值。
  • array_agg(expression):将指定表達式的結果合并為一個數組。

5)邏輯函數

  • if(condition, true_value, false_value):如果條件為真,傳回true_value,否則傳回false_value。
  • nullif(expression1, expression2):如果expression1等于expression2,則傳回null。
  • coalesce(expression1, expression2, ...):傳回參數清單中第一個非空的值。
  • and(x1, x2, ...) / or(x1, x2, ...) / not(x):邏輯運算符,傳回相應的邏輯值。

6)類型轉換函數

  • cast(expression AS type):将表達式轉化為指定類型。
  • try_cast(expression AS type):嘗試将表達式轉化為指定類型,如果無法轉化,則傳回null。
  • to_json(expression):将指定的值序列化為JSON字元串。
  • from_json(jsonString, type):将一個JSON字元串反序列化為指定類型。
  • to_array(map) / to_map(array):将一個map(array)轉化為一個數組(map)。

這些内置函數隻是Trino中的部分函數,Trino還支援大量其他内置函數,可以參閱Trino的官方文檔獲得更詳細、更全面的資訊。

八、Trino 中的 SQL 文法

連接配接:

# 如不是通過容器部署,自己有環境,可以忽略下來容器登入的步驟
docker exec -it trino-coordinator bash

# --catalog:資料源 --schema:資料庫
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop
           

官方文檔:https://trino.io/docs/current/sql.html

1)資料源文法

一般資料源配置在${TRINO_HOME}/etc/catalog目錄下

# 檢視資料源
show catalogs;
           

當然也可以通過sql建立,示例如下:

1、配置hive資料源${TRINO_HOME}/etc/catalog/hive.conf

connector.name=hive
hive.metastore.uri=thrift://hive-metastore:9083
hive.config.resources='/opt/apache/trino/etc/catalog/core-site.xml,/opt/apache/trino/etc/catalog/hdfs-site.xml'
           

2、檢視catalog

${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop

SHOW CATALOGS;

# 檢視目前 catalog
SELECT current_catalog;
           

2)資料庫文法(schemas)

在Trino中,catalog用于通路資料源和外部系統。每個catalog都可以包含一個或多個schema,每個schema包含一組相關的表。你可以在Trino中使用CREATE SCHEMA、DROP SCHEMA、RENAME SCHEMA和SHOW SCHEMAS等語句來管理schema。

文法:

CREATE SCHEMA [ IF NOT EXISTS ] schema_name
[ AUTHORIZATION ( user | USER user | ROLE role ) ]
[ WITH ( property_name = expression [, ...] ) ]
           

以下是一些用于操作catalog schema的示例:

  • 建立一個名為schema_test的新schema
#USE 文法,USE catalog.schema 
# USE schema

USE hive.default;
CREATE SCHEMA IF NOT EXISTS schema_test;
# 檢視
show schemas;
           
【注意】如果登入時,沒有帶--scheme,就必須USE切換scheme,才能使用建立schema。
  1. 檢視scheme
show schemas from hive;
show schemas;
           
  1. 删除一個名為my_schema的schema
DROP SCHEMA hive.schema_test;
           
  1. 檢視目前scheme
# 檢視目前catalog
SELECT current_catalog;
# 檢視scheme
SELECT current_schema;
           

3)表 DDL 文法

在Trino中,你可以使用CREATE TABLE語句來建立表,使用ALTER TABLE來修改表的結構和中繼資料,并使用DROP TABLE來删除表。

下面分别介紹一下這幾個操作的文法和參數:

1、建立表 - CREATE TABLE

文法:

CREATE TABLE [ IF NOT EXISTS ]
table_name (
  { column_name data_type [ NOT NULL ]
      [ COMMENT comment ]
      [ WITH ( property_name = expression [, ...] ) ]
  | LIKE existing_table_name
      [ { INCLUDING | EXCLUDING } PROPERTIES ]
  }
  [, ...]
)
[ COMMENT table_comment ]
[ WITH ( property_name = expression [, ...] ) ]
           

使用CREATE TABLE建立一個新的表。下面是一個示例:

CREATE TABLE orders (
  orderkey bigint,
  orderstatus varchar,
  totalprice double,
  orderdate date
)
WITH (format = 'ORC')

# 在Trino中,你可以使用 FORMAT 子句指定查詢結果輸出的格式。Trino支援多種常見格式,包括文本(text)、CSV、JSON、javax.json、Avro、Parquet、ORC、RCFile等。
           

其中,my_table是你想要建立的表名,後面的括号中列出了表的列和對應的資料類型。在Trino中可以定義多種資料類型,如integer、varchar、boolean等等。更多資料類型可以檢視Trino官方文檔。

你可以使用CREATE TABLE的參數進行更進階的操作,例如指定分桶(bucket)、分區(partition)和格式(format),以下是一些常用參數的示例:

CREATE TABLE my_table3 (
  column1 int,
  column2 varchar(64),
  column3 varchar(64),
  column4 varchar(64)
)
WITH (
  format = 'ORC',
  partitioned_by = ARRAY['column3','column4'],
  bucketed_by = ARRAY['column2'],
  bucket_count = 10
);
# 注意:partitioned字段必須是表的最後的字段
           

這個示例中,表使用ORC格式存儲,按照column3和column4列進行了分區,使用column2列進行了分桶,并設定了10個桶。

2、修改表 - ALTER TABLE

使用ALTER TABLE指令修改現有表。下面是一些常見的用法:

  • 添加列
ALTER TABLE my_table ADD COLUMN new_column datatype;
           
  • 修改列
ALTER TABLE my_table ALTER COLUMN column1 TYPE new_datatype;
           
  • 删除列
ALTER TABLE my_table DROP COLUMN column1;
           
  • 添加分區
ALTER TABLE my_table ADD PARTITION (column1 = 'value1', column2 = 'value2');
           
  • 删除分區
ALTER TABLE my_table DROP PARTITION (column1 = 'value1', column2 = 'value2', ...);
           

3、删除表 - DROP TABLE

使用DROP TABLE語句删除現有表。下面是一個示例:

DROP TABLE my_table;

-- 如報錯:io.prestosql.spi.security.AccessDeniedException: Access Denied: Cannot drop table
-- 在catalog hive中添加以下兩行
-- hive.allow-drop-table=true
-- hive.allow-rename-table=true
           

注意:删除一個表将會永久删除該表的全部資料,慎重操作!

4、trino 中的分區分桶

在Trino中,你可以使用分區(partition)和分桶(bucket)來優化查詢性能,提高查詢速度和效率。

1、分區(partition)

  • 分區是指把資料按照一定規則劃分成若幹部分(比如按照日期、地區、類别等),每個部分就是一個分區。在Trino中,你可以使用 CREATE TABLE 語句的 partitioned_by 子句來建立一個分區表,你可以寫入資料到這個表的每個分區。
  • 使用分區對于查詢過濾條件的列進行過濾非常高效。Trino實際上将所有資料按照分區規則分布到磁盤的不同目錄下,當你執行包含了分區過濾的查詢時,Trino會自動發現這個過濾條件,并且隻讀取符合條件的分區資料,這樣就可以大大提高查詢效率。

以下是一個建立一個按照日期分區的示例:

CREATE TABLE my_part_table (
  id bigint,
  name varchar(64),
  event_date date
)
WITH (
partitioned_by = ARRAY['event_date']
);
           

2、分桶(bucket)

  • 分桶是将表中的資料劃分成若幹個桶(bucket)存儲的方式。在Trino中,你可以使用 CREATE TABLE 語句的 bucketed_by 和 bucket_count 子句來建立一個分桶表。在建表時,你需要定義一個或多個bucket列并設定桶的數量,Trino會根據這些設定把表中的資料配置設定到不同的桶中。

使用分桶後,Trino優化器可以将查詢操作配置設定到不同的節點上并行執行,以實作更快的查詢速度。比如,如果你的分桶表中有100個桶,Trino可以把這100個桶配置設定到100個不同的節點上并行執行查詢操作,進而大大提高查詢效率。

以下是一個建立分桶的示例:

CREATE TABLE my_bucket_table (
  id INT,
  name VARCHAR,
  age INT
)
WITH (
  bucket_count = 10,
  bucketed_by = ARRAY['id']
);

CREATE TABLE my_bucket_table_new (
  id INT,
  name VARCHAR,
  age INT
)
WITH (
  bucket_count = 10,
  bucketed_by = ARRAY['id']
);
           

4)添加資料

INSERT INTO my_bucket_table (id, name, age) VALUES (1, 'Tom', 20), (2, 'Jerry', 23);
INSERT INTO my_bucket_table_new SELECT * FROM my_bucket_table;           

Presto(Trino)配置參數以及 SQL文法講解就先到這裡了,有任何疑問歡迎給我留言,也可關注我的公衆号【大資料與雲原生技術分享】加群交流或私信咨詢問題~

繼續閱讀