Summarization Patterns(总结归纳模式):数值聚合、倒排索引、单词计数
相同Key的数据分组汇聚是MapReduce核心,所以总结归纳模式是最容易想到的,书中提到了数值归纳,倒排索引的例子.单词计数就是这类应用的典型,计算过程中高度并行化,Map阶段产出的数据行是信息完备的,后续阶段计算不需要参考其它数据行;这就保证了计算是可以并行实施:不依赖其它数据行,不依赖计算顺序.中值,均值,标准差,最大值,最小值,倒排索引都可以如法炮制;
Filtering Patterns(过滤模式):TopK、Filtering、Bloom Filtering(布隆过滤)、Distinct(去重)
该模式的作用是寻找一个小数据集,这个小数据集合可能是取Top,做Distinct,做filtering 或者Bloom filtering. 直接做Filtering应该是这些模式里面最简单的,每条记录都做一下去留判断,Reduce的过程都没有.但这确有非常经典的应用案例:Distributed grep
Data Organization Patterns(数据重组模式):Partitioning、Binning(分箱)、总体排序、shuffle(混洗)
Structuredto Hierarchical 由于只是改变的数据的视图,Combiner帮不了多少忙; 行结构数据外键关联,这样的数据结构构造成类似XML或BSON的结构.
Partitioning 移动数据,并不关心数据的顺序,书中的例子就很典型:3年的日志数据并不是日期排序,取一段时间数据,如果数据按照时间分区,就可以避免全表扫描.如果是按照月分区,该分区内数据顺序并不重要.
Binning和Partitioning的区别在于它是将同一条数据分到一个或多个类别.. 分箱是在map阶段分割数据而不是在partitioner阶段。主要的优势是消除了reduce阶段的使用。
TotalOrder Sorting 整体并行排序,善用Partitioner重定结果,说起来简单实际操作过程中要注意的细节还是非常多的.
Shuffling除了书中提到的"隐藏用户信息" "随机取样"还有什么使用场景?好奇
Join Patterns(Join模式):Reduce端Join(常规)、Replicated Join(无Reduce阶段)
ReduceSide Join 将数据映射为外键为Key的形式,在Reduce阶段完成Join. 大量数据发送到Reduce Reduce端join需要大量的网络传输 .如果并不太关注执行时间就可以用它. 如果要join的数据非常巨大,就只能选这种join. join是在reduce完成,Local优化起不了什么作用
Replicated Join 解决的是Join数据集规模不对称的情况,把小数据集分发出去,消除了Reduce阶段的Shuffle.
组合式MapReduce计算(迭代模式、顺序组合模式、具有依赖关系的组合模式、链式模式)
迭代模式:通过事先不确定的迭代轮数后,保证前后两轮的结果在用户给定的误差范围之内(通过迭代逼近结果),则MapReduce认为结束,例如:频繁项集的挖掘时,事先不知道需要多少轮挖掘,可以先假设一个挖掘轮数;(PageRank是最著名的迭代方法)
顺序组合模式:轮数事先已知,顺序执行MapReduce任务,第(n-1)阶段的输出作为第n阶段的输入;(具体如下图左图所示)
具有依赖关系的组合模式:通过A.addDependingJob(B),添加任务间的依赖关系,并通过JobConf对相互依赖的任务进行封装;(作业X, Y相互独立,而作业Z依赖于作业X,Y,Z需要将作业X和作业Y产生的结果进行一个join处理,即Z一定要等到X和Y执行完毕才能开始执行→依赖关系,具体如下图右图所示)
链式模式:ChainMapper包括若干个Mapper,ChainReducer包含唯一的Reducer和若干个Mapper(在核心Map和Reduce之外,把前后处理步骤实现为一些辅助的Map过程,将这些辅助Map过程与核心Map和Reduce过程合并为一个链式MapReduce任务),其中ChainMapper和ChainReducer都提供了addMapper方法以便加入一系列的Mapper,例如:ChainMapper.addMapper(…);ChainReducer.addMapper(…);