首先有三个文件 a.txt ,b.txt,c.txt,放在hdfs上
maptask0 读取a.txt的 0-100M
maptask1读取a.txt 100M-200M
maptask2 读取b.txt 的0-100M
maptask3 读取c.txt的0-100M
maptask4 读取c.txt的100M-60M
每个maptask分别计算自己的wordcount
每处理一个单词,先用这个单词的hashcode模除以3 取余数,因为相同单词的hashcode肯定是一样的,这样就能把单词先在自己的maptask中做一下分类
对于maptask0来说,如果是余数是0就放到 m0r0.txt中,如果是1就放到 m0r1.txt中,如果是2就放到 m0r2.txt中
对于maptask1来说,如果是余数是0就放到 m1r0.txt中,如果是1就放到 m1r1.txt中,如果是2就放到 m1r2.txt中
对于maptask2来说,如果是余数是0就放到 m2r0.txt中,如果是1就放到 m2r1.txt中,如果是2就放到 m2r2.txt中
这里可能不太好理解,为什么每个maptask都要分三个文件去写呢? 我所有的maptask,遇到余数为0的都放到一个文件中,
遇到余数为1的都放到一个文件中,遇到余数为2的都放到一个文件中,直接就分好类了,最后三个reducetask没用啊,
但是要知道 一个文件只可能有一个进程在处理,不可能两个进程一块处理啊。所以只能先分着放,用reducetask去把他们在汇聚起来。理解了这个才能真正明白reducetask的意义 ,Map 分类,reduce汇总
最后reducetask分别取 maptask上拉去自己的文件
reducetask0 m0r0.txt,m1r0.txt,m2r0.txt ...0.txt
reducetask1 m0r1.txt,m1r1.txt,m2r1.txt ...1.txt
reducetask2 m0r2.txt,m1r2.txt,m2r2.txt ...2.txt
每个reduce读取到之后自己的文件之后,把各个文件中的结果,相同的单词加起来,获得自己的结果,r0,r1,r2
最后汇总一下所有 r0 r1 r2 的结果就行了