我需要编写一个map-reduce程序,连续调用两个reducer。即,第一个减速机的输出将作为第二个减速机的输入。我如何做到这一点?
到目前为止,我发现需要在驱动程序代码(下面的代码)中配置两个map reduce作业。
这看起来很浪费,原因有二-
我真的不需要一个Map绘制在第二份工作
有两份工作看起来太过分了。
有没有更好的方法来实现这一点?
此外,还有一个关于以下方法的问题:job1的输出将是output\u path目录中的多个文件。这个目录作为job2的输入传入,可以吗?它不一定是一个文件吗?job2会处理给定目录下的所有文件吗?
Configuration conf = getConf();
FileSystem fs = FileSystem.get(conf);
Job job = new Job(conf, "Job1");
job.setJarByClass(ChainJobs.class);
job.setMapperClass(MyMapper1.class);
job.setReducerClass(MyReducer1.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
TextInputFormat.addInputPath(job, new Path(args[0]));
TextOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));
job.waitForCompletion(true); /*this goes to next command after this job is completed. your second job is dependent on your first job.*/
/*
* Job 2
*/
Configuration conf2 = getConf();
Job job2 = new Job(conf2, "Job 2");
job2.setJarByClass(ChainJobs.class);
job2.setMapperClass(MyMapper2.class);
job2.setReducerClass(MyReducer2.class);
job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(Text.class);
job2.setInputFormatClass(TextInputFormat.class);
job2.setOutputFormatClass(TextOutputFormat.class);
TextInputFormat.addInputPath(job2, new Path(OUTPUT_PATH));
TextOutputFormat.setOutputPath(job2, new Path(args[1]));
return job2.waitForCompletion(true) ? 0 : 1;
1条答案
按热度按时间nue99wik1#
不需要在第二个工作Map绘制
不过,框架确实如此
有两份工作看起来太过分了。。。有没有更好的方法来实现这一点?
那就不要用mapreduce。。。例如,spark可能更快,代码更少
job2会处理给定目录下的所有文件吗?
对