本文将从三个方面讨论关于Druid 索引服务的资源精细化调度:
一、Druid索引服务的简介
介绍了Druid 索引服务的架构和调度细节。(介绍原理)
二、实践中出现的问题
经过线上生产环境的实践,旧的调度方案出现的问题。(提出问题)
三、资源精细化调度的设计与实现
提出了资源精细化调度方案的设计与实现对问题进行了解决,并做了实际效果评估。(解决问题)
一、Druid索引服务的简介
索引服务是Druid提供用于导入并创建segments 数据文件的服务,索引服务是一个高可用的分布式服务,并以主从结构作为架构模式,索引服务由三大组件构成,overlord作为主节点,middlemanager是从节点,peon用于运行一个task。
1、索引服务三大组件
(1)overlord : 负责创建task、分发task到middlemanager上运行,为task创建锁以及跟踪task运行状态并反馈给用户。
(2)middlemanager : 作为从节点,负责接收主节点分配的任务,然后为每个task启动一个独立的JVM进程来完成具体的任务。
(3)speon : 由middlemanager启动的一个进程用于运行一个task任务。
其中task的类型有很多,其中包括:
index hadoop task : 是Hadoop的索引任务,利用Hadoop集群执行MapReduce任务以完成segment数据文件的创建,适合体量比较大的segments数据文件的创建任务,一般我们的公司的离线任务基本上都是周期性调度index_hadoop task来完成数据的导入。
index kafka task : 专门用于Kafka数据的实时摄入,通过Kafka索引服务可以在Overlord上配置一个KafkaSupervisor,通过管理Kafka索引任务的创建和生命周期来促进Kafka的摄取。 这些索引任务使用Kafka自己的分区和偏移机制读取事件,因此能够提供完全一次摄取的保证。 他们还能够从Kafka读取非近期事件,并且不受其他摄取机制强加的窗口期限的影响。
merge task : 是一个合并索引任务,将多个segments数据文件按照指定的聚合方法合并为一个segments数据文件。
kill task : 销毁索引任务,将执行时间范围内的数据从Druid集群的深度存储中删除。
2、overlord基于槽位的调度过程
如图所示:
每台middlemager设置固定的capacity(能调度的最大任务个数),overlord基于一定策略(如剩余可用capacity),分配任务交由middlemanager执行。
1)备选worker的过滤
版本过滤:当一个middlemanager 在灰度升级的时候一般会先发送disable命令给middlemanager,middlemanager会把自己的版本标记为空字符串,overlord在调度的时候过滤该版本的worker。
黑名单过滤:overlord将对失败次数达到一定阀值的middlemanager列为黑名单,默认黑名单的比例不会超过20%,并且被列为黑名单的middlemanager会被定期回放到白名单
槽位空闲过滤:如果该middlemanager的没有空闲槽位来满足运行一个task的时候就会被过滤掉。
2)worker的选择策略&