Druid--Druid中Indexer Process
2020-02-28 本文已影响0人
李小李的路
- 基于apache-druid-0.17
- Attention:
Indexer
是一个可选的实验性特性。它的内存管理系统仍在开发中,并将在以后的版本中得到显著增强。 - Apache Druid Indexer进程是 MiddleManager + Peon任务执行系统的替代方案。Indexer不是为每个任务创建单独的JVM进程,而是在单个JVM进程中作为单独的线程运行任务。
- 与MiddleManager + Peon系统相比,Indexer设计得更易于配置和部署,并更好地支持任务间的资源共享。
- 配置文件和api接口详见官方文档。
启动命令
org.apache.druid.cli.Main server indexer
task资源共享
- 以下资源在Indexer进程中运行的所有任务之间共享。
Query资源
- 查询处理线程和缓冲区在所有任务之间共享。Indexer将为所有任务共享的单个端点提供查询。
- 如果启用了查询缓存,那么还可以在所有任务之间共享查询缓存。
服务器的HTTP线程
- Indexer维护两个大小相等的HTTP线程池。
- 一个线程池专门用于Overlord和Indexer之间的任务控制消息(“chat handler threads”)。另一个池用于处理所有其他HTTP请求。
- 池的大小由
druid.server.http.numThreads
配置。numThreads配置(例如,如果将其设置为10,则将有10个聊天处理程序线程和10个非聊天处理程序线程)。 - 除了这两个池之外,还为查找处理分配了两个单独的线程。如果不使用查找,就不会使用这些线程。
内存共享
- Indexer使用配置
druid.worker.globalIngestionHeapLimitBytes
对所运行的任务加全局堆限制。 - 这个全局限制是由
druid.worker.capacity
配置的任务槽的数量平均分配的。 - 要应用每个任务堆(heap)的限制,Indexer将在任务调优配置中覆盖
maxBytesInMemory
(即,忽略默认值或任何用户配置的值)。maxRowsInMemory
也将被覆盖到一个实质上不受限制的值:索引器不支持行限制。 - 默认情况下:
druid.worker.globalIngestionHeapLimitBytes
设定为JVM堆内存的1/6;选择此默认值是为了在使用MiddleManager/Peon
系统(也占JVM堆的1/6)时,与任务调优配置中的maxBytesInMemory
的默认值保持一致。 - 堆内存中保存的原始数据的峰值使用量与任务调优配置中的
maxBytesInMemory
和maxpendingpersist
属性之间的交互有关。当任务在堆中保存的原始数据量达到maxBytesInMemory
指定的限制时,任务将持久化堆中的行数据。在persist
启动后,任务可以在运行persist
时再次读取maxBytesInMemory
字节数的原始数据。 - 这意味着,原始数据的堆内峰值使用量可以达到
maxBytesInMemory * (2 + maxpendingpersist)
。maxpendingpersist
的默认值是0,这允许一个persist与数据提取工作并发运行。 - 堆的其余部分用于查询处理和段持久化/合并操作,以及其他堆的使用。
并发Segment缓存和合并限制
- 为了帮助降低峰值内存使用量,Indexer对所有运行任务的并发Segment
perstis/merge 操作的数量施加了限制。 - 默认情况下,并发Segment的 perstis/merge 操作的数量限制为
(druid.worker.capacity / 2)
,四舍五入。参数配置druid.worker.numConcurrentMerges
。
当前限制
- 使用Indexer时,当前不支持单独的任务日志;所有任务日志消息都将记录在Indexer进程日志中。
- Indexer当前对每个任务施加相同的内存限制。在以后的版本中,将删除每个任务的内存限制,只应用全局限制。并发合并的限制也将被取消。
- 在以后的版本中,每个任务的内存使用将被动态管理。详见:https://github.com/apache/druid/issues/7900