MapReduce原理

    MapReduce是Hadoop一个用于处理大规模数据集并行运算的编程模型,它采用“分而治之”的思想将海量的数据切分为很多小数据进行处理,从而达到在最短的时间内处理海量的数据。

    MapReduce原理

(图摘自Hadoop权威指南)

    上图是MapReduce的整个执行原理,在我们了解Map任务的原理之前我们先要知道交给Map任务处理的数据有多大或者说怎么划分。

    一个非常庞大的数据直接交给Map任务处理,显然处理速度会非常非常慢,所以数据在处理之前,首先会被逻辑的划分为多个数据切片(input split),再将每个input split交给每一个Map任务并发执行,这样数据处理的速度就非常快,同时也反应出input split的数量决定了Map任务的数量。

    Map任务开始:

    1、每个Map任务接收一个input split,将数据内容每一行解析成每一对key/value的格式

    2、每一对key/value调用一次map()函数,产生新的key/value进行输出(这里就是我们能对数据进行逻辑处理的地方)

    3、map()函数的每一次输出会在内存缓存中(看图buffer in memory处)

    4、当内存缓存中存放的数据即将满时会写到磁盘上,写到磁盘之前会进行分区再排序,当文件达到一定的大小时还会溢出,溢出时会写到另一个文件,写入前也执行分区和排序步骤,然后才写入(看图partition sort and split 处)

    5、最后到输出时将很多的内容分区和排序好的小文件进行归并,然后输出给Reduce节点(看图 merge on disk 处)

    Reduce任务开始:

    1、通过MRAppMaster节点得知各个Map任务的数据,通过网络对这些数据进行下载到Reduce节点本地

    2、将各个Map节点上处理完成的数据进行合并、排序

    3、调用reduce函数,对输入的key/values进行处理产生新的key/value进行输出(此处进行我们的逻辑处理)

    4、将处理完成的数据写入到文件系统中(HDFS)

    以上就是真个MR的执行原理,其中Map任务的3、4、5步骤,Reduce任务的1、2步骤就是MR程序的Shuffle机制.

    Shuffle机制的应用或者调优:

    每个Map有一个环形缓冲区,用于存储任务的输出,默认为100M(io.sort.mb 属性可以设置),一旦达到阀值0.8(io.sort.split.percent 属性设置),一个后台线程会将内容写到磁盘指定的目录(mapred.local.dir属性设置)下新建的一个溢出写文件

你可能感兴趣的:(mapreduce,hadoop,shuffle)