说起MapReduce,可以从思想、模型和运算及应用过程等几个方面来进行理解。首先,来简单说说它的思想。MapReduce可以说是凝结了人类对数据处理工作的基本思想,即分类与汇总。我们都知道,MapReduce其实分为两个阶段,即map阶段和reduce阶段。map阶段即映射阶段,该阶段主要负责对数据进行切分处理,reduce阶段即归约阶段,也就是在map阶段的处理结果上进行汇总。我们可以把它定位成一种用于大规模数据集并行运算的编程(算法)模型。
在实际应用中,MapReduce是Hadoop框架集群的核心之一,在HDFS的基础上对海量数据进行运算。先来分别看一下map和reduce的详细运算过程。
Map过程:
@Override
public void map(KEYIN key,VALUEIN value,Context context)
throws IOException,InterruptedException{
System.out.println("进入Map");
context.write(KEYOUT, VALUEOUT);
}
这里KEYIN,VALUEIN就是在RecordReader中生成的Key和Value;这里KEYOUT,VALUEOUT就是map的输出。之后,Map的输出到Reduce的输入中间经过了一个复杂的过程:map的每个输出都会先写入缓存(buffer in memory,默认100MB,可以在job提交前通过io.sort.mb修改),该100MB的缓存有个阈值80MB(默认0.8)。注意,这里引入了第三个类Partition。
Reduce过程:
在map过程中强调数据在本地计算,即优先数据在哪就把map任务分配到哪。而reducer是需要从所有map的输出文件中把属于自己的copy过来,所以会占用网络带宽。从不同task tracker拿到的文件也是先写入buffer(原理同map的写入buffer),当buffer中的数据达到阈值,就写入磁盘。存数据的过程叫merge,merge过程可以发生在:
(1)内存到内存的merge。默认关闭,如果开启表示最后如果内存有数据,不会先全部写入磁盘再回头跟磁盘上的其它数据一起merge,而是直接在内存中merge,再与磁盘中的其它数据merge。
(2)内存到磁盘的merge。与map端的spill类似。
(3)磁盘到磁盘的merge。最后将所有(2)之后的文件进行最终merge,注意(1)的情况。
之后开始reduce的过程,即merge的最终输出是reduce的输入,reduce的输出默认是输出到HDFS上。输出格式由OutputFormat类确定。
在这里需要提及的是Yarn并不是MapReduce的替代者,它只是作为一种计算框架的资源管理系统而存在,所以在理解MapReduce的过程中,也应该了解其与Yarn的关系。尚学堂陈老师指出Yarn的存在有时会对MapReduce存在的问题进行一些补充:
1. Job Tracker存在单点故障;
2. Job Tracker完成太多任务,当MR任务非常多时,造成很大的内存开销;
3.Task Tracker端,如果两个大内存消耗的任务一起调度,容易出现OOM,如果只有Map任务或Reduce任务时会造成资源浪费。
那么Yarn的机制与MapReduce相比有哪些优势呢? 首先旧的MapReduce主要包括Job Tracker和Task Tracker,Yarn中主要是三个组件:Resource Manager、Node Manager和Application Master。Resource Manager负责全局资源分配,Application Master每个节点一个,负责当前节点的调度和协调。Node Manager是每台机器的代理,监控应用程序的资源使用情况,并汇报给Resource Manager。因此与MapReduce相比,Yarn把资源管理与任务调度的工作分离开来,减少了MapReduce中Job Tracker的压力。
从上面的讲述中不难看出,相对于MapReduce,Yarn也有其自身的优势:
1.Yarn大大减少了Job Tracker的资源消耗,并且让监测每个Job子任务状态的程序分布式化了;
2.YARN中Application Master是一个可变更部分,用户可以对不同编程模型编写自己的AppMst,让更多类型的编程模型能跑在Hadoop集群中;
3.在旧的框架里,Job Tracker一个很大的负担就是监控Job下任务的运行状况,现在由Application Master去做,而Resource Manager是监测Application Master的运行状况,如果出问题,会将其在其他机器上重启。