6-druid源码分析之 Hadoop-index 过程

来源:互联网 发布:视频数据采集 编辑:程序博客网 时间:2024/05/29 17:10

druid 中数据批处理生成segment是通过 hadoop_index 方式来完成的.

hadoop_index 主要划分成两个过程,由两个 job 来分别完成.


hadoop-index 过程有两个 MR , 但是它们 Map 操作都是依赖于同一个抽象类HadoopDruidIndexerMapper.
这个类主要实现了 map 的前半段过程。

主要功能是 :

  • 解析每一行数据,得到 timestamp, demenssion, metric 列。
  • 将不在获取时间范围内的数据剔除掉

估算数据量

实现类

io.druid.indexer.DetermineHashedPartitionsJob

主要工作

DetermineHashedPartitionsJob 的工作主要是分析数据量并为数据转segment过程分配合理的桶的数量,每个桶有一个 reduce 去执行,
这样使得每个 reduce 的操作数据不至于过大。

  • map 的操作:

map 的数量通过文件数量来决定, 每一个map对应一个文件.

map 中主要有一个 hyperLogLogs 对象, 这个对象在 setup 中创建, 它使用segment(interval)作为key, 然后一个类似 list 的结构作为value,
list 中的每一个值都具有唯一性,hyperLogLogs 是一个基数估计器,用来计算大量数据中不同元素的个数, 我们将 map 的时间戳跟维度列散列计算后,放到相对应的segment 中。
最终,我们通过计算hyperLogLogs 中每个segment 的元素个数,就确定去大致有多少条数据了。

map 中主要的操作如下 :

  1. map 从文件中读取的每一行数据,将时间戳在时间范围之外的数据排除掉, 然后将时间戳按照查询粒度进行规整,与维度列一起构成groupKey,groupKey 作为元素的计数标准, 求出每一个文件中每个segment中总共有的记录数量.
  2. 解析每一条数据,根据时间戳确定数据所属segment,然后将 groupKey 进行散列获取一个字节序列,将这个值add到 按照 segment 作为 key 的 hyperLogLogs 中。
  3. 当map的所有的数据解析完成后,遍历这个 hyperLogLogs 的所有的 key(segment), 将每一个 key 对应的值转字节数组后发送到对应的 reduce 中去。

数据从 map 中出来后就确定 reduce , 在DetermineHashedPartitionsJob中的partition 过程是依据 segment(interval) 的,及每个 segment 对应一个reduce.

reduce 中主要操作如下:

  • reduce 端汇总指定的 segment 中的所有的hyperLogLogs 的输出数据,分析出总的记录条数写入文件。

当 job 运行完后, 我们便可以直到每个segment 中有多少条数据,然后我们可以根据配置,将每个 segment 划分桶

桶的数量 = 总的数量/maxPartitionSize[配置属性]

这样我们就分配好了当真正执行 segment 转换时需要多少个 reduce .

0 0