Druid-Druid中的数据抽取-Ingestion

  • 基于apache-druid-0.17

概述

  • Druid中所有的数据被组织成Segment。这些Segment是数据文件,通常一个Segment文件有几百万行。Druid中加载数据或从源数据中加载数据且基于这些数据创建Segment均被称为ingestionindexing
  • Druid中,大多数的数据抽取工作是由MiddleManager(或 Indexer 进程)。不过基于Hadoop的数据提取工作是例外的,它是使用Yarn上的MapReduce进程来完成的。(尽管启动和监视Hadoop任务时仍然涉及到MiddleManger或Index进程)。一旦Segment被生成并存储在DeepStorage中,这些Segment将会被Historical进程。

抽取方法

流式

Druid-Druid中的数据抽取-Ingestion_第1张图片
流式中间件

批处理

  • 当从文件进行批处理加载时,应该使用one-time task,并且有三个选项:index_parallel(本机批处理;并行)、index_hadoop(基于hadoop)或index(本机批处理;单一任务)。
  • 一般来说,只要本机批处理满足需求,我们就会推荐它,因为它的设置更简单(它不依赖于外部Hadoop集群)。但是,仍然存在基于Hadoop的批处理可能是更好的选择的场景,例如,您已经有一个正在运行的Hadoop集群,并且希望使用现有集群的集群资源进行批处理。


    Druid-Druid中的数据抽取-Ingestion_第2张图片
    批处理

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技术来重新划分最初抽取的数据。这个功能很强大,可以使用它来确保对任何超过某个阈值的数据进行最优分区,即使有不断地从流中添加新数据。


    Druid-Druid中的数据抽取-Ingestion_第3张图片
    处理分区
  • 当然,请注意,划分数据的一种方法是将其加载到单独的数据源中。这是一种完全可行的方法,当数据源的数量不会导致每个数据源产生过多的开销时,这种方法非常有效。如果采用这种方法,则可以忽略此部分,因为它描述了如何在单个数据源中设置分区。
  • 详情请阅读:Multitenancy considerations

你可能感兴趣的:(Druid-Druid中的数据抽取-Ingestion)