(六)MapReduce特点

来源:互联网 发布:汽车导航软件安装 编辑:程序博客网 时间:2024/06/08 07:01

MapReduce特点

适合数据复杂度运算
不适合算法复杂度的运算
不适合实时计算、流式计算、DAG有向图计算
综上,要求算法足够简单,数据可以足够大!

MapReduce架构

采用Master/Slave
这里写图片描述

执行流程

MapReduce包含四个组成部分
Client
JobTracker
TaskTracker
Task
Map算法Reduce数据
从HDFS出来Split[0,1,……],用getsplit()分片。Split数量决定MapTask数量,即MapTask数量无法自己决定。
Map主要就是用来对数据进行切分。
Partitioner通过返回确定reduce数量,

hello world --无需split-->hello world---recordreader-->hello hadoop             hello hadoop<O,hello word>---map---><hello,1><world,1>---无需partitioner---><O,hello word>         <hello,1><hadoop,1> ---combine---><hello,1,1><world,1><hadoop,1>---无需copy--->---reduce---><hello,2><world,1><hadoop,1>--->output
1.23 0.91--split-->10000点坐标--recordreader--><0,1.23 0.91>1.45 1.11                                    <0,1.45 1.11 >0.22 0.25                                    <0,0.22 0.25 >--map-->截取浮点数,算出距离,记录是否在圆内--><O,1>--无需partitioner-->                                         <O,0>                                         <O,1>--combine--><0,1 1 1 1 1>--无需copy-->--reduce--><0,n> n*4/10000

MapReduce完整执行流程如图所示
这里写图片描述

Map流程
Inputformat:首先将 HDFS 中的数据以 Split 方式作为 MapReduce 的输入
Mapper:每个Mapper 将输入(key,value)数据解析成输出(key,value)
Partition:根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理( Partitioner接口,默认自动完成,可定制)
Combine:缓存溢写时完成,如果有很多个相同key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录(reducer接口,默认自动完成,可定制)
Merge:溢写文件合并,同时再次执行Combiner(默认自动完成)
注:
HDFS中的数据是以 block存储,这里怎么又变成了以Split 作为输入呢?其实 block 是 HDFS 中的术语,Split 是 MapReduce 中的术语。默认的情况下,一个 Split 可以对应一个 block,当然也可以对应多个block,它们之间的对应关系是由 InputFormat 决定的。默认情况下,使用的是 TextInputFormat,这时一个Split对应一个block。 假设这里有4个block,也就是4个Split,分别为Split0、Split1、Split2和Split3。这时通过 InputFormat 来读每个Split里面的数据,它会把数据解析成一个个的(key,value),然后交给已经编写好的Mapper 函数来处理。

默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。
Map流程图
这里写图片描述
Reduce流程
Copy:简单地拉取数据
Merge:同map Merge,文件合并
Reducer:每个Reducer将输入(key,value)数据解析成输出(key,value)
把结果放到HDFS上
这里写图片描述