java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧
概述
Presto架構(gòu)
Presto是一個(gè)分布式的查詢引擎,本身并不存儲(chǔ)數(shù)據(jù),但是可以接入多種數(shù)據(jù)源,并且支持跨數(shù)據(jù)源的級(jí)聯(lián)查詢。
Presto的架構(gòu)分為:
Coodinator:解析SQL語(yǔ)句,生成執(zhí)行計(jì)劃,分發(fā)執(zhí)行任務(wù)給Worker節(jié)點(diǎn)執(zhí)行。
Discovery Server:Worker節(jié)點(diǎn)啟動(dòng)后向Discovery Server服務(wù)注冊(cè),Coordinator從Discovery Server獲得可以正常工作的Worker節(jié)點(diǎn)。
Worker:負(fù)責(zé)執(zhí)行實(shí)際查詢?nèi)蝿?wù),訪問(wèn)底層存儲(chǔ)系統(tǒng)。
存儲(chǔ):Presto的數(shù)據(jù)可以存儲(chǔ)在HDFS/OBS,推薦熱數(shù)據(jù)存儲(chǔ)在HDFS,冷數(shù)據(jù)存儲(chǔ)在OBS。
內(nèi)存調(diào)優(yōu)
內(nèi)存管理原理
Presto有三種內(nèi)存池,分別為GENERAL_POOL、RESERVED_POOL、SYSTEM_POOL。
GENERAL_POOL:用于普通查詢的physical operators。GENERAL_POOL值為 總內(nèi)存(Xmx值)- 預(yù)留的(max-memory-per-node)- 系統(tǒng)的(0.4 * Xmx)。
SYSTEM_POOL:系統(tǒng)預(yù)留內(nèi)存,用于讀寫(xiě)buffer,worker初始化以及執(zhí)行任務(wù)必要的內(nèi)存。大小由config.properties里的resources.reserved-system-memory指定。默認(rèn)值為JVM
max memory * 0.4。
RESERVED_POOL:大部分時(shí)間里是不參與計(jì)算的,只有當(dāng)同時(shí)滿足如下情形下,才會(huì)被使用,然后從所有查詢里獲取占用內(nèi)存最大的那個(gè)查詢,然后將該查詢放到
RESERVED_POOL
里執(zhí)行,同時(shí)注意RESERVED_POOL只能用于一個(gè)Query。大小由config.properties里的query.max-memory-per-node指定,默認(rèn)值為:JVM
max memory * 0.1。
1、GENERAL_POOL有節(jié)點(diǎn)出現(xiàn)阻塞節(jié)點(diǎn)(block node)情況,即該node內(nèi)存不
2、RESERVED_POOL沒(méi)有被使用query.max-memory:表示單個(gè)查詢?cè)诜植荚谒邢嚓P(guān)節(jié)點(diǎn)上能用的內(nèi)存之和的最大值。
query.max-memory-per-node:表示單個(gè)查詢?cè)趩蝹€(gè)節(jié)點(diǎn)上用戶內(nèi)存能用的最大值。
query.max-total-memory-per-node:表示單個(gè)查詢?cè)趩蝹€(gè)節(jié)點(diǎn)上用戶內(nèi)存能用的最大值和系統(tǒng)內(nèi)存量。其中系統(tǒng)內(nèi)存是讀取器、寫(xiě)入器和網(wǎng)絡(luò)緩沖區(qū)等在執(zhí)行期間使用的內(nèi)存。
memory.heap-headroom-per-node:這個(gè)內(nèi)存主要是第三方庫(kù)的內(nèi)存分配,無(wú)法被統(tǒng)計(jì)跟蹤,默認(rèn)值是-Xmx * 0.3
注意點(diǎn):
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內(nèi)存配置
內(nèi)存調(diào)優(yōu)參數(shù)
操作場(chǎng)景
Presto由于是完全基于內(nèi)存的計(jì)算,經(jīng)常出現(xiàn)OOM,需要調(diào)整內(nèi)存。
修改參數(shù)
常見(jiàn)OOM報(bào)錯(cuò)
Query exceeded per-node total memory limit of xx
適當(dāng)增加query.max-total-memory-per-node。
Query exceeded distributed user memory limit of xx
適當(dāng)增加query.max-memory。
Could not communicate with the remote task. The node may have crashed or be under too much load
內(nèi)存不夠,導(dǎo)致節(jié)點(diǎn)crash,可以查看/var/log/message。
并行度
操作場(chǎng)景
調(diào)整線程數(shù)增大task的并發(fā)以提高效率。
修改參數(shù)
元數(shù)據(jù)緩存
操作場(chǎng)景
Presto支持Hive connector,元數(shù)據(jù)存儲(chǔ)在Hive metastore中,調(diào)整元數(shù)據(jù)緩存的相關(guān)參數(shù)可以提高訪問(wèn)元數(shù)據(jù)的效率。
修改參數(shù)
總結(jié)
以上是生活随笔為你收集整理的java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 曼哈顿距离java实现_基于javasc
- 下一篇: java创建阻塞_如何从HttpsURL