MapReduce是一种处理海量数据的并行编程模型和计算框架,用于对大数据及的并行计算。
1、MapReduce基础
1)MapReduce处理数据集过程,如下图:
a)Map阶段:
MapReduce 框架将任务的输入分割成固定大小的片段(splits),随后将每个split进一步分解成一批键值对<K1,V1>。Hadoop为每个split创建一个Map任务用于执行用户自定义的map函数,并将对应split中的<K1,V1>对作为输入,得到计算的中间结果<K2,V2>.接着将中间结果按照K2进行排序,并将key值相同的value放在一起形成<K2,list(V2)>元组。最后再根据Key值的范围将这些元组进行分组,对应不同的Reduce任务。
b)Reduce阶段:
Reducer把从不同Mapper接收来的数据整合在一起并进行排序,然后调用用户自定义的reduce函数,对输入的<K2,list(V2)>对进行相应处理,得到键值对<K3,V3>并输出到HDFS上。 job.setNumReduceTasks()方法设置reduce数。
2、MapReduce的集群行为
1)、任务调度与执行:有一个JobTracker和多个TaskTracker两类节点控制完成
2)、本地计算:split通常应小于或等于HDFS数据块的大小,从而保证split不会跨越两台计算机存储,便于本地计算。
3)、Shuffle过程:将Mapper的输出结果按照key值分成R份(R是设定的Reduce的个数)划分时使用哈希函数,保证某一范围内的key由某个Reduce来处理。
4)、合并Mapper输出:在Shuffle之前闲的结果进行合并(Combine过程)即将中间结果相同key值的多组<key,value>对合并成一对。可以减少中间结果数量,从而减少数据传输过程中的网络流量。
5)、读取中间结果:Mapper的输出结果被直接写到本地磁盘而非HDFS,
6)、任务管道:有时R个Reduce会产生R个结果,会将这R个结果作为另一个计算任务的输入开始两一个任务
3、Map/Reduce个数
1)Mappers的数目直接有splits来决定
2)Reducers的数目略小于reducer slots的总数
a.所有的Reducers可以并行执行,减少排队时间
b.对于未执行reducer的slots,可以在其他reducer发生故障时立即分配给新创建的reducer
3)Reducers的个数要小于Mappers的个数