- 基于apache-druid-0.17
概述
- Druid中所有的数据被组织成Segment。这些Segment是数据文件,通常一个Segment文件有几百万行。Druid中加载数据或从源数据中加载数据且基于这些数据创建Segment均被称为
ingestion
或indexing
。 - Druid中,大多数的数据抽取工作是由MiddleManager(或 Indexer 进程)。不过基于Hadoop的数据提取工作是例外的,它是使用Yarn上的MapReduce进程来完成的。(尽管启动和监视Hadoop任务时仍然涉及到MiddleManger或Index进程)。一旦Segment被生成并存储在DeepStorage中,这些Segment将会被Historical进程。
抽取方法
流式
![](https://img.haomeiwen.com/i16969231/285fdb4992ad7eeb.png)
批处理
- 当从文件进行批处理加载时,应该使用one-time task,并且有三个选项:index_parallel(本机批处理;并行)、index_hadoop(基于hadoop)或index(本机批处理;单一任务)。
-
一般来说,只要本机批处理满足需求,我们就会推荐它,因为它的设置更简单(它不依赖于外部Hadoop集群)。但是,仍然存在基于Hadoop的批处理可能是更好的选择的场景,例如,您已经有一个正在运行的Hadoop集群,并且希望使用现有集群的集群资源进行批处理。
批处理
Druid中数据模型
数据源DataSource
- Druid数据存储在DataSource中,这与传统RDBMS中的表类似。Druid提供了一个独特的数据建模系统,具有相似的关系和timeseries模型。
Primary timestamp
- Druid的schema中必须包含一个
Primary timestamp
,用于数据的排序或分区。Druid可以根据timestamp在查询时准确定位到查询时间范围对应的时间戳。Druid还可以将Primary timestamp
列用于基于时间的数据管理操作,比如删除时间块、覆盖时间块和基于时间的保留规则。 -
Primary timestamp
是根据timestampSpec
解析的。此外,granularitySpec
还控制基于Primary timestamp
的其他重要操作。无论Primary timestamp
是从哪个输入字段读取的,它都将作为Druid数据源中的一个名为_time
的列存储。
分区partition
为什么分区
- 在DataSource中对Segment进行最优的分区和排序会对内存占用和性能产生很大的影响。
- Druid的DataSource总是被时间分割成时间块(time chunks),每个时间块包含一个或多个Segment。这种划分发生在所有的抽取数据方法中,并且基于
dataSchema
中的segmentGranularity
参数。 - 特定时间快(time chunks)内的Segment也可以进一步分区,使用的选项和选择的抽取类型时不一样。一般情况下,采用特定维度进行二次分区将会局部优化。因为这样会使相同维度的行存储在一起,可以快速访问。
- 通过将数据划分到某个“自然”维度上(如果存在的话),通常可以获得最佳性能和最小的总体占用空间。这样会减少存储,提升查询性能。
- 分区和排序通常是在一起使用的!如果你有一个“自然”的分区维度,你也应该考虑把它放在你的维度列表的第一个维度,这告诉Druid在每一列中排序。这通常会进一步改进压缩,而不仅仅是单独分区所带来的改进。
- 然而,注意到现在,Druid总是先按时间戳来排序一个Segment中的行,甚至在你的维度说明中列出的第一个维度之前。这可能会妨碍维度排序的最大效率。如果有必要,您可以通过在
granularitySpec
中将queryGranularity
设置为与segmentGranularity
相等的时间粒度来解决这个限制。该设置将把Segment中的所有时间戳设置为相同的值,并将“实际”时间戳保存为次要时间戳。这个限制可能会在未来的Druid版本中被移除。
如何设定分区
-
并不是所有的摄取方法都支持显式分区配置,也不是所有方法都具有同等的灵活性。在当前的Druid版本中,如果你是通过一种不太灵活的方法(比如kafka)来进行最初的抽取,那么你可以使用reindex技术来重新划分最初抽取的数据。这个功能很强大,可以使用它来确保对任何超过某个阈值的数据进行最优分区,即使有不断地从流中添加新数据。
处理分区
- 当然,请注意,划分数据的一种方法是将其加载到单独的数据源中。这是一种完全可行的方法,当数据源的数量不会导致每个数据源产生过多的开销时,这种方法非常有效。如果采用这种方法,则可以忽略此部分,因为它描述了如何在单个数据源中设置分区。
- 详情请阅读:Multitenancy considerations
网友评论