6-druid源码分析之 Hadoop-index 过程
2017-04-17 15:21
459 查看
druid 中数据批处理生成segment是通过 hadoop_index 方式来完成的.
hadoop_index 主要划分成两个过程,由两个 job 来分别完成.
hadoop-index 过程有两个 MR , 但是它们 Map 操作都是依赖于同一个抽象类HadoopDruidIndexerMapper.
这个类主要实现了 map 的前半段过程。
主要功能是 :
解析每一行数据,得到 timestamp, demenssion, metric 列。
将不在获取时间范围内的数据剔除掉
这样使得每个 reduce 的操作数据不至于过大。
map 的操作:
map 的数量通过文件数量来决定, 每一个map对应一个文件.
map 中主要有一个 hyperLogLogs 对象, 这个对象在 setup 中创建, 它使用segment(interval)作为key, 然后一个类似 list 的结构作为value,
list 中的每一个值都具有唯一性,hyperLogLogs 是一个基数估计器,用来计算大量数据中不同元素的个数, 我们将 map 的时间戳跟维度列散列计算后,放到相对应的segment 中。
最终,我们通过计算hyperLogLogs 中每个segment 的元素个数,就确定去大致有多少条数据了。
map 中主要的操作如下 :
map 从文件中读取的每一行数据,将时间戳在时间范围之外的数据排除掉, 然后将时间戳按照查询粒度进行规整,与维度列一起构成groupKey,groupKey 作为元素的计数标准, 求出每一个文件中每个segment中总共有的记录数量.
解析每一条数据,根据时间戳确定数据所属segment,然后将 groupKey 进行散列获取一个字节序列,将这个值add到 按照 segment 作为 key 的 hyperLogLogs 中。
当map的所有的数据解析完成后,遍历这个 hyperLogLogs 的所有的 key(segment), 将每一个 key 对应的值转字节数组后发送到对应的 reduce 中去。
数据从 map 中出来后就确定 reduce , 在DetermineHashedPartitionsJob中的partition 过程是依据 segment(interval) 的,及每个 segment 对应一个reduce.
reduce 中主要操作如下:
reduce 端汇总指定的 segment 中的所有的hyperLogLogs 的输出数据,分析出总的记录条数写入文件。
当 job 运行完后, 我们便可以直到每个segment 中有多少条数据,然后我们可以根据配置,将每个 segment 划分桶
这样我们就分配好了当真正执行 segment 转换时需要多少个 reduce .
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 中主要的操作如下 :
map 从文件中读取的每一行数据,将时间戳在时间范围之外的数据排除掉, 然后将时间戳按照查询粒度进行规整,与维度列一起构成groupKey,groupKey 作为元素的计数标准, 求出每一个文件中每个segment中总共有的记录数量.
解析每一条数据,根据时间戳确定数据所属segment,然后将 groupKey 进行散列获取一个字节序列,将这个值add到 按照 segment 作为 key 的 hyperLogLogs 中。
当map的所有的数据解析完成后,遍历这个 hyperLogLogs 的所有的 key(segment), 将每一个 key 对应的值转字节数组后发送到对应的 reduce 中去。
数据从 map 中出来后就确定 reduce , 在DetermineHashedPartitionsJob中的partition 过程是依据 segment(interval) 的,及每个 segment 对应一个reduce.
reduce 中主要操作如下:
reduce 端汇总指定的 segment 中的所有的hyperLogLogs 的输出数据,分析出总的记录条数写入文件。
当 job 运行完后, 我们便可以直到每个segment 中有多少条数据,然后我们可以根据配置,将每个 segment 划分桶
桶的数量 = 总的数量/maxPartitionSize[配置属性]
这样我们就分配好了当真正执行 segment 转换时需要多少个 reduce .
相关文章推荐
- Hadoop源码分析之_NameNode regular过程分析1
- Hadoop源码分析23:MapReduce的Job提交过程
- Hadoop-源码分析--FileSystem的创建过程
- Hadoop源码分析之_NameNode regular过程分析2
- hadoop源码分析(2):Map-Reduce的过程解析
- Hadoop2 使用 YARN 运行 MapReduce 的过程源码分析
- hadoop源码分析(2):Map-Reduce的过程解析
- hadoop作业初始化过程详解(源码分析第三篇) 推荐
- Hadoop-2.4.1源码分析--MapReduce作业切片(Split)过程
- Hadoop源码分析(三)--------------job提交过程分析(3)之job的split过程
- Hadoop源码分析HDFS Client向HDFS写入数据的过程解析
- Hadoop源码分析之读文件时NameNode和DataNode的处理过程
- Hadoop源码分析之读文件时NameNode和DataNode的处理过程
- Hadoop源码分析--FileSystem的创建过程
- Hadoop读写过程的源码分析
- Hadoop源码分析(1):HDFS读写过程解析
- Hadoop中Mapper过程的源码分析
- 【hadoop】 2006-hdfs源码分析下载初始化、下载过程
- 细水长流Hadoop源码分析(3)RPC Server初始化启动过程
- hadoop1.x作业提交过程分析(源码分析第二篇) 推荐