我需要将我的 Map Reduce jar 文件拆分为两个作业,以获得两个不同的输出文件,一个来自两个作业的每个 reducer。
我的意思是第一个作业必须生成一个输出文件,该文件将作为链中第二个作业的输入。
我在 hadoop 版本 0.20(目前我使用的是 0.18)中阅读了一些关于 ChainMapper 和 ChainReducer 的内容:那些可能对我的需求有好处?
任何人都可以建议我一些链接,在哪里可以找到一些示例以使用这些方法?或者也许有另一种方法可以解决我的问题?
谢谢,
卢卡
最佳答案
有很多方法可以做到。
为第一个作业创建 JobConf 对象“job1”,并将所有参数设置为“input”为输入目录,“temp”为输出目录。执行此作业:
JobClient.run(job1)
。在它的正下方,为第二个作业创建 JobConf 对象“job2”,并将所有参数设置为“temp”作为输入目录,“输出”作为输出目录。执行此作业:
JobClient.run(job2)
。 创建两个 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();
如果你需要一个类似于 Map+ 的结构 |减少 | Map*,您可以使用 Hadoop 0.19 及更高版本附带的 ChainMapper 和 ChainReducer 类。请注意,在这种情况下,您只能使用一个 reducer ,但可以在它之前或之后使用任意数量的映射器。
关于hadoop - 映射减少 : ChainMapper and ChainReducer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3059736/