原理
1、对数据进行Split分片,把数据分为512M或者1G每片;
2、每一个数据分片起一个线程对其进行Map操作,将数据转化成Key-Value对;(每个线程相互独立,线程之间无需通信,可以并行操作)
3、Shuffle将hash值相同的Key放到一个桶里面;
4、再起一个线程对每个桶里面Hash值相同的Value进行Reduce(规约)操作;
截一张PPT,能够很好地讲清楚MapReduce的过程:
数据从HDFS上来,InputFormat进行数据切片,Map操作形成Key-value对,Partitioner按照Hash值将数据放到不同的分片中,将数据写到本地磁盘。Shuffle完成数据远程拷贝,将存在各节点的Hash值相同的分片数据拉取到一个Reduce Task中,然后进行Sort排序实现分组,最后进行Reduce操作进行规约,将结果写回到HDFS上。
PS:Combiner可以看做local reducer,数据在本地先规约。有些可用Sum( ),有些不能Average( )。
Partitoner默认实现Hash取模,hash(key) mod R ,默认R是Reduce Task数。
一、MapReduce将整个运行过程分为两个阶段:Map阶段和Reduce阶段(红色是用户可编写)
1、Map阶段由一定数量的Map Task组成
输入数据格式解析:InputFormat(默认TextInputFormat)
输入数据处理:Mapper
数据分组:Partitioner
2、Reduce阶段由一定数量的Reduce Task组成
数据远程拷贝
数据按照key排序
数据处理:Reducer
数据输出格式:OutputFormat(默认TextOutputFormat)
二、MapReduce编程模型的物理结构:
运行流程
1、Client将应用程序提交到ResourceManager上;
2、Yarn负责资源管理,RM会寻找到对应的NM;
3、NM会将MR AppMaster启动起来;
4、MR AppMaster知道需要启动多少个MapTask、ReduceTask,这时候会向RM申请资源。RM会将资源的分配告诉给MR AppMaster;
5、MR AppMaster和申请分配资源对应的NM进行通信,要求启动相应的MapTask和ReduceTask;
6、各个NM就会启动相应的MapTask和ReduceTask完成任务。