实例阐述MapReduce中的基本概念

来源:互联网 发布:马勒第六交响曲知乎 编辑:程序博客网 时间:2024/06/06 08:54
MapReduce是一种全新的编程模型,对于第一次接触MapReduce的人来讲,其中有些概念不是很容易理解。本文将运用一个实例来阐述MapReduce中涉及到的基本概念,包括InputSplit, Mapper, Combiner, Shuffle, Reducer。不足之处还请高手指正。

假设现在高考成绩出来了,领导让你统计学校有多少考生上了一本线,考生的成绩打印在20张纸上。格式如下:
姓名 成绩张三 600李四 580王五 610...

你找来了4位学生(甲乙丙丁)来帮忙。首先,你把20张成绩单分成了4份,每份交给1位学生,同时还给了他们一张白纸。你告诉他们,数一下有多少人过了一本线,把结果用“正”字的形式写在白纸上,完成后把结果交还给你。等到4位学生都完成后,你数一下有多少个“正”字就统计出多少考生上了一本线。

在这个例子中,
  • 把成绩分成4份就类似于Hadoop在处理数据时将输入数据分成多个InputSplit。
  • 每份成绩单交给一位学生来统计就类似于Hadoop将每个InputSplit分配给一台机器去处理。
  • 每位学生在统计成绩时,将原始的成绩转换为“正”字就是Mapper。
  • 你在拿到了所有学生的统计结果后,通过数有多少个“正”字,就是Reducer。

假设领导让你统计有多少考生上了一本线,有多少考生上了二本线而没有上一本线,同时又有多少考生上了三本线而没有上二本线。你觉得这有点复杂了,所以除了前面的4位学生(甲乙丙丁)外,你又另外找了3位学生(ABC)来帮忙。你还是先把成绩分成4份,分别交给前面甲乙丙丁,同时给了他们每人三张白纸,告诉他们分别在每张白纸上用“正”字的形式统计上了一本线、二本线和三本线的人数。待完成后,将包含有一本考生的人数的纸交给学生A,二本考生的人数的纸交给学生B,三本学生的人数交给学生C。学生ABC在拿到甲乙丙丁的结果后,学生A统计有多少考生上一本线,学生B统计有多少考生上了二本线,学生C统计有多少考生上了三本线。而你在分配完任务后就在旁边喝茶,等到学生ABC向你报告结果。
在这个例子中:
  • ​学生甲乙丙丁所做的事情依然Mapper。
  • 学生甲乙丙丁将其统计结果分别交给学生ABC的过程就是Shuffle。
  • 学生ABC所做的事情就是Reducer。
如果学生ABC抗议说,能不能让学生甲乙丙丁先数一下“正”字,然后告诉他们一个结果,这样他们在统计最终结果时就会更快一些,这就是Combiner。Combiner就是Mapper完成任务后先把结果做进一步的处理后再交给Reducer。需要注意的是,并不是每种任务都能有Combiner,如果我们统计上了一本线考生的平均成绩,Combiner就不能用了,因为只有等到所有考生的成绩都统计完了之后才能计算平均值。

从上面的例子中看到,学生甲乙丙丁都将其统计的一本成绩交给学生A,在Hadoop中也是一样,所有Mapper处理后的结果,同一个Key的结果只能交给一个Reducer,原因是Reducer要拿到同一个Key的所有结果才能运行。

后记:领导知道你这样统计结果后大怒,这点小事还要找那么多学生来帮忙,遂一怒之下将你解雇了。后来统计局知道后,这就是我们要找的处理大数据人才啊,然后你就直接进了统计局工作了。
原创粉丝点击