顺序组合式MapReduce任务、具有依赖关系的组合式MapReduce任务以及专门用于Map和Reduce主过程前处理和后处理的链式MapReduce任务。其中顺序组合式MapReduce任务可以经过变形成为迭代式的MapReduce任务。

(1)顺序组合式MapReduce

前一个MR的输出作为后一个MR的输入,自动的完成顺序化的执行。顺序组合式MR中的每一个子任务都需要专门的设置独立的配置代码,并安装任务的执行顺序设置job的运行顺序,任务完成后所有的中间结果输出目录都可以进行删除操作。
    格式: MapReduce1 -> MapReduce2 -> MapReduce3....,每个子任务都必须调用job.waitForCompletion(true)等待job执行完成才可以。
    优点:结构简单,容易实现。
    缺点:由于后一个MR任务必须等待前一个MR任务完成才可以进行,导致集群利用率不高;无法实现多重依赖的关系(或者说多依赖关系的实现比较麻烦)。

  (2)依赖关系组合式MapReduce

Job除了维护配置信息外,还需要维护子任务的依赖关系。而JobControl类主要用来控制整个作业的执行过程。JobControl是一个Runnable子类,通过线程来调用start方法进行作业的执行流程控制。
    Job完整类名为: org.apache.hadoop.mapred.jobcontrol.Job
    JobControl完整类名为: org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl
    优点:实现相对而言简单,提高了集群利用率。
    缺点:需要自己实现job执行流管理(job失败后执行流失败等操作)

 (3)链式MapReduce

    一个MR任务可能会有一些前处理和后处理,比如说文档倒序索引中可能前处理需要去掉一些“停用词”,后处理需要将一些同义词进行归并,这些处理可以通过增加MR作业来实现,但是这样会增加整个作业的生命周期,而且还会增加IO操作,效率不高。
    Hadoop为此提供了专门的链式Mapper(ChainMapper)和链式Reducer(ChainReducer)来完成这种处理。这种作业的执行流程为:map1-->map2-...-->reducer-->map1-->map2-...

   在创建完job后,需要使用hadoop提供的专门类设置链路中的map-reduce执行顺序。使用ChainMapper.addMapper添加Map阶段的mapper,按照添加顺序执行,在Reducer阶段必须先使用ChainReducer.setReducer添加reducer处理类,然后才可以使用ChainReducer.addMapper添加mapper处理类,也是按照添加顺序执行job。

    链式MR要求一个链路中只能有一个reduce操作,可以有多个map操作。
    优点:对于前处理和后处理有要求的MR任务,减轻了操作,提高了效率。
    缺点:需要指定额外的参数信息(也可以说没有什么大的缺点)。