原文链接:
https://data-flair.training/blogs/how-hadoop-mapreduce-works/
1、什么是MapReduce?
MapReduce是Hadoop的数据处理层. 它作为一个框架被设计地能让用户轻松简单地处理位于HDFS上的大量的结构化或者非结构化数据. 它会利用由提交任务分割出来子任务或者task来并行地处理大量的数据。基于这种并行机制,集群的处理数据的速度和可靠性得到改善。在使用Hadoop过程中,我们只需要以某种方式提交我们的业务代码,后面的事情将都由引擎来完成。
2、MapReduce是如何工作的?
在Hadoop中,MapReduce会被分解成两个阶段:Map阶段和Reduce阶段。Map阶段是处理数据的第一个阶段,我们会将复杂的业务逻辑或者耗时的代码放在这个阶段。Reduce是第二个阶段,这个阶段我们做一些轻量级的操作,比如聚合或者求和。
3、MapReduce的数据流
3.1、Input Files
MapReduce所依赖的数据都来自输入文件中,这个文件一般都是存在HDFS中。这些文件的格式是任意的,比如基于行的日志或者二进制格式。
3.2、InputFormat
现在,InputFormat定义如何分割和读取输入文件,它选择了一些文件或者其他对象作为输入。InputFormat创建InputSplit。
3.3、InputSplits
它是由InputFormat创建的,是Mapper处理的数据的逻辑视图。一个map任务会为每一个split而创建,因此map任务的数量和InputSplit的数量相同。split会被分割成records,每个records都会被mapper处理。
3.4、RecordReader
它和InputSplit通信,然后将数据转换成适合mapper读取的key-value键值对。默认情况下,它会用TextInputFormat来将数据转换为key-value对,RecordReader会和InputSplit持续通信直到文件读取结束。
It assigns byte offset (unique number) to each line present in the file(没读懂). 接着, 这些key-value键值对会发送给mapper做后续处理。
3.5、Mapper
它处理每一个输入的record(来自RecordReader)然后生成一个新的key-value对,这个新的key-value对和输入的键值对完全不同。Mapper的输出会被写入本地磁盘上,它被称为中间输出。Mapper的输出不会存储在HDFS上,因为这些都是临时数据,而且写到HDFS上还会生成没有比如的副本(另外HDFS是高延迟系统)。Mapper的输出会传递给combiner处理。
3.6、Combiner
Combiner也被称为“mini-reducer”。Combiner对mapper的输出执行本地的聚合,这有助于降低mapper和reducer之间的数据传输量。一旦combiner的功能被执行,它的输出会被传递给partitioner。
3.7、Partitioner
Partitioning allows even distribution of the map output over the reducer.
当我们的解决方案中需要多个reducer时,Partitioner就会派上用场。Partitioner接收combiners的输出,然后执行分区。Partitioning of output takes place on the basis of the key and then sorted. 依靠hash函数,键(或者部分键)会被用来指派分区。
根据MapReduce中的键值,每一个combiner输出会被分区,相同的键的记录会被分配到相同的分区中,然后每个分区的数据会发送到一个reducer。分区能让mapper的输入均匀地分布到reduce中。
3.8、Shuffling and Sorting
现在,输出已经被shuffle到reduce节点(运行reduce阶段的任务slave节点被称为reduce节点)。Shuffling是一个实质的基于网络的数据移动。一旦所有的mapper都结束了,且他们的输出都被shuffle到了reduce节点,接着的就是合并与排序这些中间数据数据,然后作为reduce阶段的输入。
3.9、Reducer
它用由mapper生成key-value对的集合作为输入,并且运行reducer函数处理每一个键值对然后生成输出。reducer的输出是最后的输出,它会被存储于HDFS。