借助一位大牛的图:
我们可以看到图中的几大步骤(大致上分成6步):
Map: Split[拆解] —— Partition[分区] —— Sort[排序] —— Combine[初次整合]——Copy[拷贝下载]——Reduce:Merge[二次整合]
Split:将文件中的行信息分拆成若干split,再将行信息打散成独立部分,以信息内容为key,以“1”为value;每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相同的。如果数据块(Block)的大小是默认值64MB,输入文件有两个,一个是32MB,一个是72MB。那么小的文件是一个输入片,大文件会分为两个数据块,那么是两个输入片。一共产生三个输入片。每一个输入片由一个Mapper进程处理。
(ex:如两行数据,第一行 a b c d a b c d ;
第二行a b c d a b c d ;
经过Split后为Split0:Partition1 a 1,a 1 ,b 1,b 1
Partition2 c 1,c 1 , d 1,d 1
Split2:Partition1 a 1,a 1 ,b 1,b 1
Partition2 c 1,c 1 , d 1,d 1 )
Partition:用hash将key散列为若干区,方便后面的拷贝下载;默认是只有一个区。分区的数量就是Reducer任务运行的数量。
(ex:将Split0中的数据分成Partition1、Partition2,
将Split1中的数据分成Partition1、Partition2)
Sort:将key排序;
Combine:将key相同的整合,并更新value为其出现频率,其实质是压缩数据,方便后续数据的传输;
(ex:整合后的Split0:Partition1 a 2 ,b 2 Partition2 c 2 , d 2;
Split1:Partition1 a 2 ,b 2 Partition2 c 2 , d 2;)
Copy:由不同的Reduce节点下载各自分区的数据;
(ex:Reduce1节点 下载 Split0中的Partition1和Split1中的Partition1 ,
由Reduce2节点 下载 Split0中的Partition2和Split1中的Partition2 )
Merge:将各个Reduce节点中的Partition整合,有相同的key的就合并,并更新value值为其频率;当然Merge完了之 后也会进行一次排序;最后生成HDFS文件。
(ex:整合后的Reduce1:Partition1 a 4,b 4 ;
Reduce2: Partition2 c 4 ,d 4 ;)