一、MapReduce详细流程
mapreduce大概工作流程:
1.map task阶段:
-
input数据源切片输入
-
inputformat划分k,v键值对(k偏移量,v输入内容)
-
mapper自定义map函数
2.shuffle阶段:
-
分区:哈希,根据yarn资源调度分配reduce个数设置几个分区
-
进去缓冲区
-
排序,在溢出之前进行排序
-
合并:可选
3.reduce task阶段:
-
reduce自定义reduce函数
-
outputformat将合并的k,v输出
map task个数,决定并行度,根据数据的大小来决定启动多少个map任务
切片与map task并行度
1.一个job的map阶段并行度由客户端在提交job时的切片数量决定
-
一个数据切了几片就启动多少个map task
2.每一个split切片分配一个map task并行实例处理
3.默认情况下,切片大小=BlockSize
-
切片大小跟block块大小一样大,避免本地服务器到其他服务器的连接,加快速率
4.切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
-
一个文件切片:ss.avi一共300M分为0-128,128-256,256-300,这是一个文件,另一个文件有100M但是他不能与第三个map task放到一块,而是另外开一个mpa task
mapreduce详细流程
mapreduce详细的工作流程:
-
待处理文本:一个文件:ss.txt(200M)
-
客户端submit()前,获取待处理数据的信息,然后根据参数配置,形成一个任务分配的规则,默认split大小=block块大小,所以为:0-128,128-200
-
客户端提交信息:job.split(切片工作),wc.jar包,job.xml
-
计算出map task数量:根据yarn资源调度,Mrappmaster计算出要多少个 map task数量
-
默认TextinputFormat:
-
指的是将源文件划分为大小相等的小数据块( Hadoop 2.x 中默认 128MB ),也就是分片( split ), Hadoop 会为每一个分片构建一个 Map 任务,并由该任务运行自定义的 map() 函数,从而处理分片里的每一条记录;
-
将划分好的分片( split )格式化为键值对<key,value>形式的数据,其中, key 代表偏移量, value 代表每一行内容。
-
得到<k1,v1>
-
-
逻辑运算:经过map()自定义函数得到新的键值对<k2,v2>(<a,1>,<b,1>...)
-
向环形缓冲区(默认100M,写道80%后反向溢出)写入<k,v>数据:
-
分区,排序:
-
在写入缓冲区前先进行分区(哈希,根据yarn资源调度分配reduce个数设置几个分区)
-
数据写入后有索引,分区,k开始,v开始,key,valu
-
在达到80%溢出前要进行排序(快速排序):根据索引(描述数据的数据),各个分区自行排序
-
-
溢出到文件:溢出的文件已分区且区内有序
-
Merge归并排序(每个partition中的数据再按key来排序):
-
Combiner合并(可选):
-
减少Mapper输出数据的传输量,以及在Reducer端执行更多的合并操作,从而提高整个作业的性能。具体来说,Combiner可以聚合相同键的部分Mapper输出,以减少数据传输量。通过使用Combiner,可以在Map阶段结束时局部减少数据量,从而降低了MapReduce任务整体的网络传输开销。
-
-
所有map task任务完成后,启动相应数量的reduce task,并告知reduce task处理数据范围(数据分区)
-
下载到reduce task本地磁盘,合并文件,归并排序(将不同分区的文件合并并且排序)
-
一次读取一组
-
分组:相同K值的value值放到同一个集合中<a,{1+1}>
-
默认Textoutputformat:格式输出