概述
Presto架構
Presto是一個分布式的查詢引擎,本身並不存儲數據,但是可以接入多種數據源,並且支持跨數據源的級聯查詢。
Presto的架構分為:
Coodinator:解析SQL語句,生成執行計划,分發執行任務給Worker節點執行。
Discovery Server:Worker節點啟動后向Discovery Server服務注冊,Coordinator從Discovery Server獲得可以正常工作的Worker節點。
Worker:負責執行實際查詢任務,訪問底層存儲系統。
存儲:Presto的數據可以存儲在HDFS/OBS,推薦熱數據存儲在HDFS,冷數據存儲在OBS。
內存調優
內存管理原理
Presto有三種內存池,分別為GENERAL_POOL、RESERVED_POOL、SYSTEM_POOL。
GENERAL_POOL:用於普通查詢的physical operators。GENERAL_POOL值為 總內存(Xmx值)- 預留的(max-memory-per-node)- 系統的(0.4 * Xmx)。
SYSTEM_POOL:系統預留內存,用於讀寫buffer,worker初始化以及執行任務必要的內存。大小由config.properties里的resources.reserved-system-memory指定。默認值為JVM max memory * 0.4。
RESERVED_POOL:大部分時間里是不參與計算的,只有當同時滿足如下情形下,才會被使用,然后從所有查詢里獲取占用內存最大的那個查詢,然后將該查詢放到 RESERVED_POOL 里執行,同時注意RESERVED_POOL只能用於一個Query。大小由config.properties里的query.max-memory-per-node指定,默認值為:JVM max memory * 0.1。
1、GENERAL_POOL有節點出現阻塞節點(block node)情況,即該node內存不
2、RESERVED_POOL沒有被使用
- query.max-memory:表示單個查詢在分布在所有相關節點上能用的內存之和的最大值。
- query.max-memory-per-node:表示單個查詢在單個節點上用戶內存能用的最大值。
- query.max-total-memory-per-node:表示單個查詢在單個節點上用戶內存能用的最大值和系統內存量。其中系統內存是讀取器、寫入器和網絡緩沖區等在執行期間使用的內存。
- memory.heap-headroom-per-node:這個內存主要是第三方庫的內存分配,無法被統計跟蹤,默認值是-Xmx * 0.3
注意點:
1、query.max-memory-per-node小於query.max-total-memory-per-node。
2、query.max-total-memory-per-node 與memory.heap-headroom-per-node 之和必須小於 jvm max memory 也就是jvm.config 中配置的-Xmx。
Presto內存配置
內存調優參數
操作場景
Presto由於是完全基於內存的計算,經常出現OOM,需要調整內存。
修改參數
常見OOM報錯
Query exceeded per-node total memory limit of xx
適當增加query.max-total-memory-per-node。
Query exceeded distributed user memory limit of xx
適當增加query.max-memory。
Could not communicate with the remote task. The node may have crashed or be under too much load
內存不夠,導致節點crash,可以查看/var/log/message。
並行度
操作場景
調整線程數增大task的並發以提高效率。
修改參數
元數據緩存
操作場景
Presto支持Hive connector,元數據存儲在Hive metastore中,調整元數據緩存的相關參數可以提高訪問元數據的效率。
修改參數
Hash優化
操作場景
針對Hash場景的優化。
修改參數
優化OBS相關參數
操作場景
Presto支持on OBS,讀寫OBS過程中可以調整OBS客戶端參數來提交讀寫效率。
修改參數