hadoop 之 wordCount流程详解

云计算 waitig 519℃ 百度已收录 0评论

作为Hadoop的入门程序,我相信大家对wordCount一定不陌生。但是对于刚刚接触Hadoop的人来说,可能很难理解程序运行过程中具体流程是怎么样的。这篇博客我讲讲我对其流程的理解,有错误的地方尽情拍砖。

MapTask

首先我在HDFS上新建了多个word.txt文件,我们知道HDFS作为分布式存储结构,多个word.txt是被随机分布在dataNode上的。效果如图:

这里写图片描述

其中nameNod作为管理dataNode不参与数据的存储。在运行执行程序时,先来介绍一下MapTask、MrAppMaster的作用。MrAppMaster就像nameNode管理着一个个节点dataNode似的,管理者MapTask。在开始的时候,会选择在某个空闲的dataNode上运行,其他的dataNode上运行着MapTask。

MapTask读取HDFS中的提供的数据源,对数据进行处理。处理的过程如下:读取到的word1.txt中的内容为:
java
c++
jee
hadoop

对其进行读取分析,处理的结果为:
“java”:1,” java”.hashCode%ReduceCount
“c++”:1, “c++”.hashCode%ReduceCount
“jee”:1, “jee”.hashCode%ReduceCount
“hadoop”:1, “hadoop”.hashCode%ReduceCount

“java”:1我想大家是看的明白的,就是表示”java”字符串为一个。hashCode%ReduceCount又是什么东西呢?

解释一下hashCode%ReduceCount是什么意思,针对每个MapTask的执行结果,我们需要将他们交给某个Reducetask执行,Maptask1中的java作为key然后对其做hash再对Reducetask的数量做取余的运算,假设”java”.hashCode%ReduceCount的结果为1那么表示”java”的统计都到第一个ReduceTask中去。这个过程被称为Partitioner。

那么为什么需要这样做呢?随机分给不同的ReduceTask不行吗?这样做是为了保证一个key的输出结果就只有一条,因为如果一个ReduceTask处理了”java”最后统计完会输出比如”java”:8,另外一个Reducetask输出”java”:2,这样在输出的文本就会有两条java的记录存在,达不到统计的效果。把所有的”java”都交给第一个ReduceTask处理,那么最后的结果就是”java”:10。

shuffle

现在已经知道了把哪些数据交给哪个reducetask处理了,但是这样的输出结果还不能作为ReduceTask的输入,需要进过一次shuffle。这里不解释shuffle的细节。我们只需要知道在shuffle会经历Merger的过程,将原本是”java”:1,”java”:1这样的格式转为”java”:{1,1}。因为java在partition的过程已经确定是被第一个ReduceTask处理,所以就到了相应的ReduceTask中去了。

for (IntWritable val : values) {//这就是为什么在count的时候是一个循环遍历了
    sum += val.get(); // {1,1}得到sum的值为2
}

这里写图片描述

MrAppMaster中的word.txt是不会被MrAppMaster处理的,因为它是一个管理者,所以会被第二个MapTask执行。当然这些过程都是内置好的,我们不需要关心。

ReduceTask

最后只要每个Reduce去遍历得到的key,然后统计这个key里面的value值的合即可。然后每一个reducetask把结果输出到HDFS即可。

这里写图片描述


本文由【waitig】发表在等英博客
本文固定链接:hadoop 之 wordCount流程详解
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)