MapReduce对数据流的处理流程

输入数据和分片阶段:


输入数据
:根据Namenode返回的路径信息,job将输入的数据分成若干独立的数据块,将数据传送到对应的DataNode进行存储。NameNode只保存有数据的元数据,真正的数据不会经过NameNode,也不会保存在NameNode上。

切片Hadoop把输入数据根据SplitSize(设置的片的大小,默认是64M)对文件进行切分后发送到MapReduce,切分成的每一个InputSplit对应一个Map。

 

如图所示:

 


注意事项:
明确两个概念:block(块)和InputSplit(输入片)
1.block这个概念我们不陌生,是hdfs存储文件的单位(默认的64M)。
2.InputSplit是一个逻辑概念,InputSplit只记录了要处理的数据的长度和地址(对于大多数的作业,一个理想的分片往往就是block的大小64M)。

因此,以行记录为形式的文本,一行记录可能会被切成两个block,甚至被分到不同的DataNode上。某行记录同样也可能被分到两个InputSplit。这里要跟大家阐述的是,即使一行记录可能会被划分到两个不同的Inputsplit中。但是与FileInputFormat关联的RecordReader被设计的足够健壮,当一行记录跨InputSplit时,其能够到读取不同的InputSplit,直到把这一行记录读取完成。至于具体过程是怎样,恐怕要仔细的分析源代码才能够知晓。http://blog.csdn.net/wh62592855/article/details/6583364这里有源代码解析。


Mapper<将输入的数值集对转换为中间格式的数据集>


数据处理流程:
Mapper包括5个主要的阶段Map,partion,sort,spill,merge几个主要过程
执行Map任务的节点和输入数据存储的节点是同一个节点,Map将数据计算后先放在内存中(内存的默认大小为100M当然这是可以设置的),当内存中的数据超过一定的百分比(默认的80%当然也可以进行设置)时才spill到本地磁盘,当Maptask计算部分结束后,Map在正常结束之前,会将这些spill合并(merge)成一个。
parting是通过hash函数对数据进行分区,将来会交给同一个reduce处理。因为不同的DataNode会产生具有相同的key的中间记录,而reduce的计算必须包含同一个key的所有values。sort是对数据进行排序。类似<key values>---<key (list of values)>。这里partion和sort具体的发送阶段,根据部分书籍记载,应该是发生在spill to disk之前。


具体流程如图:

注意事项:
1:可以自定义一个combiner,可以对中间过程的输出进行聚集,
2:程序也可以通过jobconf控制对这些中间结果进行压缩两者都可以降低从mapper到reducer数据传输量,
3:Map的输出结果是存储在本地。


Reducer<将中间格式的数值集(归约)reduce为更小的数值集>


数据处理流程
reducer包括3个主要的阶段 shuffle,sort,reduce
shuffle:可以理解为洗牌,将各Mapper中的输出结果对应的分区交给之前partion部分确定好的reduce。
sort:可以理解为排序,mapper的输出结果虽然已经排好序了,但是不同Mapper可能会有相同的key。
reduce:可以理解为归约,即对<key(list of values)>中的list of values进行计算然后输出想要的数据集。

注意事项:
1:所有reduce可以在maps一结束就立即启动,
2:shuffle和sort过程是同时进行的,reducer的输出是没有排序的,
3:reducde的输出结果通常存储在HDFS上。

 

本文如有错误之处,请各位大侠多加提点,不甚感激!

猜你喜欢

转载自644156440-qq-com.iteye.com/blog/1399396