- 基于apache-druid-0.17
- Attention:
Indexer是一個(gè)可選的實(shí)驗(yàn)性特性。它的內(nèi)存管理系統(tǒng)仍在開(kāi)發(fā)中,并將在以后的版本中得到顯著增強(qiáng)。 - Apache Druid Indexer進(jìn)程是 MiddleManager + Peon任務(wù)執(zhí)行系統(tǒng)的替代方案。Indexer不是為每個(gè)任務(wù)創(chuàng)建單獨(dú)的JVM進(jìn)程,而是在單個(gè)JVM進(jìn)程中作為單獨(dú)的線程運(yùn)行任務(wù)。
- 與MiddleManager + Peon系統(tǒng)相比,Indexer設(shè)計(jì)得更易于配置和部署,并更好地支持任務(wù)間的資源共享。
- 配置文件和api接口詳見(jiàn)官方文檔。
啟動(dòng)命令
org.apache.druid.cli.Main server indexer
task資源共享
- 以下資源在Indexer進(jìn)程中運(yùn)行的所有任務(wù)之間共享。
Query資源
- 查詢處理線程和緩沖區(qū)在所有任務(wù)之間共享。Indexer將為所有任務(wù)共享的單個(gè)端點(diǎn)提供查詢。
- 如果啟用了查詢緩存,那么還可以在所有任務(wù)之間共享查詢緩存。
服務(wù)器的HTTP線程
- Indexer維護(hù)兩個(gè)大小相等的HTTP線程池。
- 一個(gè)線程池專門用于Overlord和Indexer之間的任務(wù)控制消息(“chat handler threads”)。另一個(gè)池用于處理所有其他HTTP請(qǐng)求。
- 池的大小由
druid.server.http.numThreads配置。numThreads配置(例如,如果將其設(shè)置為10,則將有10個(gè)聊天處理程序線程和10個(gè)非聊天處理程序線程)。 - 除了這兩個(gè)池之外,還為查找處理分配了兩個(gè)單獨(dú)的線程。如果不使用查找,就不會(huì)使用這些線程。
內(nèi)存共享
- Indexer使用配置
druid.worker.globalIngestionHeapLimitBytes對(duì)所運(yùn)行的任務(wù)加全局堆限制。 - 這個(gè)全局限制是由
druid.worker.capacity配置的任務(wù)槽的數(shù)量平均分配的。 - 要應(yīng)用每個(gè)任務(wù)堆(heap)的限制,Indexer將在任務(wù)調(diào)優(yōu)配置中覆蓋
maxBytesInMemory(即,忽略默認(rèn)值或任何用戶配置的值)。maxRowsInMemory也將被覆蓋到一個(gè)實(shí)質(zhì)上不受限制的值:索引器不支持行限制。 - 默認(rèn)情況下:
druid.worker.globalIngestionHeapLimitBytes設(shè)定為JVM堆內(nèi)存的1/6;選擇此默認(rèn)值是為了在使用MiddleManager/Peon系統(tǒng)(也占JVM堆的1/6)時(shí),與任務(wù)調(diào)優(yōu)配置中的maxBytesInMemory的默認(rèn)值保持一致。 - 堆內(nèi)存中保存的原始數(shù)據(jù)的峰值使用量與任務(wù)調(diào)優(yōu)配置中的
maxBytesInMemory和maxpendingpersist屬性之間的交互有關(guān)。當(dāng)任務(wù)在堆中保存的原始數(shù)據(jù)量達(dá)到maxBytesInMemory指定的限制時(shí),任務(wù)將持久化堆中的行數(shù)據(jù)。在persist啟動(dòng)后,任務(wù)可以在運(yùn)行persist時(shí)再次讀取maxBytesInMemory字節(jié)數(shù)的原始數(shù)據(jù)。 - 這意味著,原始數(shù)據(jù)的堆內(nèi)峰值使用量可以達(dá)到
maxBytesInMemory * (2 + maxpendingpersist)。maxpendingpersist的默認(rèn)值是0,這允許一個(gè)persist與數(shù)據(jù)提取工作并發(fā)運(yùn)行。 - 堆的其余部分用于查詢處理和段持久化/合并操作,以及其他堆的使用。
并發(fā)Segment緩存和合并限制
- 為了幫助降低峰值內(nèi)存使用量,Indexer對(duì)所有運(yùn)行任務(wù)的并發(fā)Segment
perstis/merge 操作的數(shù)量施加了限制。 - 默認(rèn)情況下,并發(fā)Segment的 perstis/merge 操作的數(shù)量限制為
(druid.worker.capacity / 2),四舍五入。參數(shù)配置druid.worker.numConcurrentMerges。
當(dāng)前限制
- 使用Indexer時(shí),當(dāng)前不支持單獨(dú)的任務(wù)日志;所有任務(wù)日志消息都將記錄在Indexer進(jìn)程日志中。
- Indexer當(dāng)前對(duì)每個(gè)任務(wù)施加相同的內(nèi)存限制。在以后的版本中,將刪除每個(gè)任務(wù)的內(nèi)存限制,只應(yīng)用全局限制。并發(fā)合并的限制也將被取消。
- 在以后的版本中,每個(gè)任務(wù)的內(nèi)存使用將被動(dòng)態(tài)管理。詳見(jiàn):https://github.com/apache/druid/issues/7900