Map Reduce:ChainMapper和ChainReducer

时间:2010-06-17 07:41:52

标签: hadoop mapreduce

我需要将Map Reduce jar文件拆分为两个作业,以获得两个不同的输出文件,一个来自两个作业的每个reducers。

我的意思是第一个作业必须生成一个输出文件,该文件将成为链中第二个作业的输入。

我在hadoop版本0.20中读到了有关ChainMapper和ChainReducer的内容(目前我使用的是0.18):那些可能对我的需求有用吗?

有人可以建议我一些链接,在哪里可以找到一些例子来使用这些方法吗?或者也许还有另一种方法来解决我的问题?

谢谢,

卢卡

2 个答案:

答案 0 :(得分:11)

有很多方法可以做到。

  1. 级联工作

    为第一个作业创建JobConf对象“job1”,并将所有参数设置为inputdirectory,将“temp”设置为输出目录。执行这项工作:JobClient.run(job1)

    紧接其下方,为第二个作业创建JobConf对象“job2”,并将所有参数设置为“temp”作为inputdirectory并将“output”设置为输出目录。执行此职位:JobClient.run(job2)

  2. 两个JobConf对象

    创建两个JobConf对象并将其中的所有参数设置为(1),除非您不使用JobClient.run。

    然后使用jobconfs作为参数创建两个Job对象:

    Job job1=new Job(jobconf1); Job job2=new Job(jobconf2);

    使用jobControl对象,指定作业依赖关系,然后运行作业:

    JobControl jbcntrl=new JobControl("jbcntrl");
    jbcntrl.addJob(job1);
    jbcntrl.addJob(job2);
    job2.addDependingJob(job1);
    jbcntrl.run();
    
  3. ChainMapper和ChainReducer

    如果你需要一个像Map + |那样的结构减少| Map *,您可以使用随Hadoop版本0.19及更高版本附带的ChainMapper和ChainReducer类。请注意,在这种情况下,您只能使用一个减速器,但在它之前或之后只能使用任意数量的映射器。

答案 1 :(得分:0)

我认为上述解决方案涉及磁盘I / O操作,因此将使用大型数据集减速。可选择使用Oozie或Cascading。