3.2.3 MapReduce的数据流和控制流
前面已经提到了MapReduce的数据流和控制流的关系,本节将结合WordCount实例具体解释它们的含义。图3-2是上例中WordCount程序的执行流程。
图 3-2 MapReduce工作的简易图
由前面的内容知道,负责控制及调度MapReduce的Job的是JobTracker,负责运行MapReduce的Job的是TaskTracker。当然,MapReduce在运行时是分成Map Task和Reduce Task来处理的,而不是完整的Job。简单的控制流大概是这样的:JobTracker调度任务给TaskTracker, TaskTracker执行任务时,会返回进度报告。JobTracker则会记录进度的进行状况,如果某个TaskTracker上的任务执行失败,那么JobTracker会把这个任务分配给另一台TaskTracker,直到任务执行完成。
这里更详细地解释一下数据流。上例中有两个Map任务及一个Reduce任务。数据首先按照TextInputFormat形式被处理成两个InputSplit,然后输入到两个Map中,Map程序会读取InputSplit指定位置的数据,然后按照设定的方式处理该数据,最后写入到本地磁盘中。注意,这里并不是写到HDFS上,这应该很好理解,因为Map的输出在Job完成后即可删除了,因此不需要存储到HDFS上,虽然存储到HDFS上会更安全,但是因为网络传输会降低MapReduce任务的执行效率,因此Map的输出文件是写在本地磁盘上的。如果Map程序在没来得及将数据传送给Reduce时就崩溃了(程序出错或机器崩溃),那么JobTracker只需要另选一台机器重新执行这个Task就可以了。
Reduce会读取Map的输出数据,合并value,然后将它们输出到HDFS上。Reduce的输出会占用很多的网络带宽,不过这与上传数据一样是不可避免的。如果大家还是不能很好地理解数据流的话,下面有一个更具体的图(WordCount执行时的数据流),如图3-3所示。
图 3-3 WordCount数据流程图
相信看到图3-3,大家就会对MapReduce的执行过程有更深刻的了解了。
除此之外,还有两种情况需要注意:
1)MapReduce在执行过程中往往不止一个Reduce Task, Reduce Task的数量是可以程序指定的。当存在多个Reduce Task时,每个Reduce会搜集一个或多个key值。需要注意的是,当出现多个Reduce Task时,每个Reduce Task都会生成一个输出文件。
2)另外,没有Reduce任务的时候,系统会直接将Map的输出结果作为最终结果,同时Map Task的数量可以看做是Reduce Task的数量,即有多少个Map Task就有多少个输出文件。