MapReduce介绍
MapReduce是hadoop的一种分布式计算框架,用于大规模的并行计算。
MapReduce的工作阶段可以分为Map阶段和Reduce阶段,这也是MapReduce名字的由来,每一个阶段都是以键值对(key/value)作为输入和输出。
在实际编程中,底层的东西框架已经帮我们写好了,我们只要定义Map和Reduce任务,实现几个接口就好了。
MapReduce的运行机制
如上图所示,MapReduce的运行过程按照时间顺序可以分为:
input
在进行Map运算前,MapReduce会根据输入文件计算输入分片(input split),每个输入分片对应一个map任务。
input split 和 blocks
输入分片存储的并非数据本身,而是一个分片的长度和记录数据位置的数组。前面HDFS的博客,我们谈到了数据块(blocks)的概念,实际上分片的数量跟数据块的数量是有联系的。
假设我们使用的是hadoop 2.x以后的版本,每个数据块的大小为128MB。我们在输入两个大小分别为100MB和200MB的文件时,MapReduce会把100MB的文件分进一个输入分片,而200MB的文件需要两个输入分片,然后我们将会有3个Map任务将被执行,而且每个Map执行的数据大小不均,这也是MapReduce优化计算的一个关键点。
map
map的本质是分割,将分割好的数据通过我们定义的映射函数来产生输出。
后面我们将会举一个具体的例子来说明:统计出现的每个单词的数量。
shuffle
shufflle的过程是maphereduce的中间过程,主要实现3大功能:分区、分组和排序。
- 分区:决定当前的key应该交给哪个reduce任务来进行处理,相同的key必须由同一reduce任务来处理。默认情况下,根据key的hash值,对reduce个数取余,来决定哪个reduce任务处理。
- 分组:将相同的key的value进行合并。
- 排序:按照key的字典顺序进行排序。
reduce
reduce的本质是聚合,和map是对应关系。经过合并后的键值对,按照我们定义的逻辑关系,生产另一系列的键值对。
output
将reduce输出的键值对储存在HDFS上。
WordCount实例
结合一个实例来解释MapReduce的工作过程:
- Input:输入一个文档,文档每一行有很多不同的单词;
- split:按每一行分割文档的过程;
- Map:切分出单词和单词的频数,以键值对的形式存在;
- Shuffle:按key将相同的单词聚集到一起;
- Reduce:将键值对进行合并;
- ouput:完成整个WordCount的过程。