标签:
前面讲的 分区、分箱模式 都是不关心数据的顺序。 接下来 全排序、混排序模式 关心的是数据按照指定键进行并行排序。
全排序解释;
排序在顺序结构程序中容易实现, 但是在MapReduce 中,或者说在并行编程中不易实现。这是典型的 “分治法”。
每个 reduce 将按照键对他的数据排序,但这种排序并不是全局意义上的排序。 这里想做的是全排序,记录是整个数据集按照顺序排列好的。
作用:
排序号的数据有很多有用的特性,比如时间排序可以提供一个基于时间轴的视图。在一个已排序好的数据集中查找某条记录可以采用二分查找法替代线性查找。如 MR例子中通过查看文件第一条和最后一条知道数据的上界和下界。 该特性在查找记录时非常有用,同时这也是 HBase 的主要特性之一。 如果数据已经按主键或索引列排好序,那么一些数据在批量加载这些数据时将更快。
不过一般不推荐使用 MR 进行数据排序, 这类操作代价高昂。 需要扫描 1+(x~N)*次的全量扫描。(好的设计干嘛还需要第二次排序呢?)
使用范围:
被排序的键必须具有可比较性,另外此数据如果需要补齐位数则需要抽样时补充好。
结构:
全排序需要先根据值的取值范围划分一组分区,并且每个分区将获得相同规模的数据子集, 整体数据数量(上界、下界)的大小决定 每个 reduce 将对多少数据进行排序。 然后通过自定义的分区器按照排序键将数据分区。
全排序模式包含两个阶段:
1 分析阶段
分析阶段确定每个分区的范围
如果数据分布不随时间变化而快速变化, 那么分析阶段仅需执行一次。
猜分区: 如果数据是均匀分布的就可以猜到大致分区。 如 ID增量排序 100W ID。假设用1000 个 reduce 处理,那么就是 1000 个ID 一个分区。
分析阶段首先对数据随机采样,然后基于 随机样本进行分区。 原理是分区能够均匀的拆分随机样本,那么也就能均匀的拆分更大的数据集。
2 排序阶段
排序阶段对数据进行排序
全排序例:
1 分析
假设有 10亿 条数据进行排序, 计划用 1000 个reduce 运行排序, 那么采样(10亿 / 1000=10W) 10W 条记录没个分区将能获取很平均。 也就是分析阶段(采样)只需要覆盖 0.01% 的记录。
这里只需要一个 reduce 用来存储分析之后的数据。 这些数据的键就是数据属性。 值为 Null 节省空间。 此数据保存为数据的范围边界。
2 排序
mapper 阶段 : 遍历 10亿数据,逐条对比 分析阶段的边界值 list 。 根据边界值分配 partitioner 。
如果想有一个主排序加第二排序,那么可以将两个键连接起来 并用分隔符分开。 例如 省^市 。
性能分析:
这是一个代价高昂的操作,因为实际上该模式需要加载两和解析数据两次。 第一次是建立分区范围。 第二次才是真正的对数据排序。
由于所有数据都需要通过网络传输,并且这些数据都将被写入磁盘,因此需要使用相对较多的 reduce。
混排:
混排效果与 全排序效果是对立的。但后者也关心数据在数据集中的顺序。(需要乱序、匿名,随机数据中获得可重复的随机采样。)
结构:
所有 mapper 均是将输入记录作为值 和一个随机键一起输出。
reduce 负责对随机键排序,进而使得数据随机分布。
性能分析:
混排模式有非常好的性能,因为 reduce 的每条记录都是随机的,因此 reduce 的数据将会分布十分平衡。 reduce 越多, 数据的展开越快。 并且该模式数据文件的大小也可预测。 即为整个数据集的大小除以 reduce 数。
五 数据组织模式 4)全排序、混排。
标签:
原文地址:http://www.cnblogs.com/rocky24/p/300879610aac8adc791a11668dfa5ab0.html