Hadoop学习笔记1 -大白话MapReduce

Hadoop在大数据领域可以说是元老级别的人物,无人不知无人不晓。然鹅作为Hadoop系列的开山之作,本文并不涉及Hadoop的安装配置以及基础概念,本文就利用Linux的pipe简单解释一下Hadoop中的MapReduce到底干了什么,包你一看就懂。

Hadoop有四大组件:

  • HDFS:分布式存储系统
  • MapReduce:分布式计算系统
  • YARN: hadoop 的资源调度系统
  • Common: 以上三大组件的底层支撑组件,主要提供基础工具包和 RPC 框架等

本文先来讲讲MapReduce的那些事,从是什么,为什么以及怎么做三个方面来讲。

1 什么是MapReduce

说起Hadoop就必须得提MapReduce,MapReduce是一种编程模型,其理论来自Google公司发表的MapReduce论文,主要应用于海量数据的并行计算。MapReduce又可以分为map和reduce(暂时忽略中间的shuffle,partition等内容)

  • Map:map有个中文释义就是映射,是一个映射过程,把一组数据按照某种Map函数映射成新的数据。
  • Reduce:reduce有个中文释义就是归约,是一个归约过程,把若干组映射结果进行汇总并输出。

听上面的概念听的满头包?放心,举个MR界的hello world帮助理解:比如现在给你一堆学生写的英文作文,需要让你统计这么多份英文作文中每个单词出现的次数,应该怎么做呢?你有如下选择:

  • 选择自己默默承担一切,加班熬夜一份一份的数
  • 找几个学生帮你一起数,Emmmm

反正如果是我,我肯定选择后者。但是这样就会产生一个新的问题,如果现在找到了10个学生来帮你完成这个任务,每个人负责十分之一,那么他们十个人统计的结果最后还需要再求个并集,这又是好大一份工作量,好烦怎么办?这时候就可以利用MR的思想,先找几个学生作为报数员,他们的工作非常简单,只需要从前往后浏览每篇文章,看到一个词就读出来这个单词,然后有对应的计数员在那对报数员念出来的单词进行记录。如有一篇文章是这么写的:

I have a pen, I have an apple.

那么计数员就会记下:

I			1
have		1
a			1
pen,		1
I			1
have		1
an			1
apple.		1

嗯看起来很简单,但你要清楚这只是从一个报数员那得到的结果,现在老师找来了n个报数员,他们每个人读完一篇文章计数员都会生成这么一个单词和出现次数的key/value对。因此还需要第三组同学对所有的key/value对进行处理并排序。

假如现在只有两篇作文,另一篇作文是:

I am so sad.

计数员得到:

I			1
am			1
so			1
sad.		1

在对上面两篇作文进行归并并排序之后得到:

I			1
I			1
I			1
a			1
am			1
an			1
apple.		1
have		1
have		1
pen,		1
sad.		1
so			1

接下来我们只需要最后一名同学,对上面的数据进行最后的合并,即将key值相同的结果合为一个key/value对。最后得到如下结果:

I			3
a			1
am			1
an			1
apple.		1
have		2
pen,		1
sad.		1
so			1

如此就完成了整个统计任务,上面的流程可以用下图表示:
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvOTgwNTc1LzE1ODczOTQwMzQxNDMtNTQ1ZGU0OWEtOWNkNi00MDU5LTgzZjctYjMxNTFjZDlmMTY2LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=430&margin=[object Object]&name=image.png&originHeight=693&originWidth=1151&size=59641&status=done&style=none&width=712)

至于每一阶段的细节,本文先不介绍,只需要有个大概的理解就行。

2 为什么需要MapReduce

其实上面的例子已经解释了这个问题,因为数据多,数据存储在多个机器上,使用MR能够让每种类型的Worker专注于他自己要做的简单的事情,同时高效的解决数据多数据分步在多个主机的问题。

3 MapReduce在做什么

上面的例子也已经解释了这个问题,MapReduce主要可以拆分为Map和Reduce,map从输入读取数据,将数据做拆分,reduce负责对具有相同key的数据进行拼装;中间隐藏的部分可以简单理解为对数据进行整理,按照key的值进行排序,叫做shuffle,这几个部分协同合作完成一个可能并不复杂但是数据量很大的任务。

4 MapReduce应用举例

在本文中我们借助Linux的管道模拟一下MapReduce的工作流程,首先实现一个WordCount,这里我用python脚本做示范,准备数据文件:

I have a pen, I have an apple.
I am so sad.

mapper.py

import sys

for line in sys.stdin:
    words = line.strip().split()
    for word in words:
        print "%s\t%s" % (word, 1)

reducer.py

import sys

cur_word = None
cur_count = 0

for line in sys.stdin:
    data = line.strip().split()
    
    if data[0] != cur_word:
        if cur_word != None and cur_count != 0:
            print "%s\t%s" % (cur_word, cur_count)
        cur_word = data[0]
        cur_count = 0
    
    cur_count += 1
    
if data[0] == cur_word and cur_count != 0:
     print "%s\t%s" % (cur_word, cur_count)

在Linux中执行如下命令:

cat ./data | python mapper.py | sort | python reducer.py

即可得到在第一小节我们最终得到的结果。

解释一下 这里需要解释以下两个问题:

  • 为什么在reducer.py中要那样写?这是由于MapReduce的特性决定的,具有相同key的key/value对会被送给同一个reducer;而且同一个reducer可以接收多个key值得key/value对。因此需要判断当前读取到的键值对的key是否和之前一样,如果读取到新的key就需要将之前的统计结果写到输出文件中,并重置统计结果。这一块对新人来说,可能不是很好理解。
  • 为什么上面的命令要加上sort?这也是由MapReduce的特性决定的,送给reducer的数据就是按照key排好序的,这样才能确保把具有相同key的键值对送给了同一个reducer,从而确保计算结果没有出错。

5 更多

本文只是对MapReduce的工作流程做了一个简单的口语化的解释,而且给的例子也是Hello World级别的了,实际中的MR代码逻辑会复杂的多,比如在map端对数据做join,在reduce端对数据做join,多个MR的串联等等,后面的文章会更加深入的介绍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章