mapreduce链接job流

来源:互联网 发布:淘宝steam充值卡 编辑:程序博客网 时间:2024/06/05 20:11

在我们的日常的数据处理中,往往不是一个MapReduce就可以把需求解决,而是要用多个MR作业来完成对一个问题的求解。但是多个MR作业是如何链接的呢?
在MR框架中提供了三种方法,分别是线性MR job流,复杂MR job流,job设置预处理和后处理。
1.线性MR job流:一个MR作业是将数据输入经过处理输出到hdfs上,在处理复杂的问题时,我们可以用多个MR作业,让他们按一定的顺序执行,上一个MR的输出作为下一个MR的输入。

Configuration conf=new Configuration();        Job job1=new Job(conf,"job1");        /*         * 省略map,reduce类等的设置         */        FileInputFormat.addInputPath(job,new Path("/input"));        FileOutputFormat.setOutputPath(job,new Path("/output1"));        Job job2=new Job(conf, "job2");        /*         * 省略map,reduce类等的设置         */        //job2的输入时job1的输出        FileInputFormat.addInputPath(job,new Path("/output1"));        FileOutputFormat.setOutputPath(job,new Path("/output2"));

2.复杂的MR job流:在处理复杂的问题时,多个MR作业并不是一定按顺序执行的,比如:有三个作业,job1,job2,job3,job3的执行是要job1和job2的数据作为输入数据时,job1和job2是并没有关系的。这个时候就要使用,ControlledJob类和JobControl类了。

Configuration conf=new Configuration();        Job job1=new Job(conf,"job1");        /*         * 省略map,reduce类等的设置         */        //把job封装到ControledJob对象中        ControlledJob controlledJob1=new ControlledJob(conf);        controlledJob1.setJob(job1);        Job job2=new Job(conf,"job2");        /*         * 省略map,reduce类等的设置         */        //把job封装到ControledJob对象中        ControlledJob controlledJob2=new ControlledJob(conf);        controlledJob2.setJob(job2);        Job job3=new Job(conf,"job3");        /*         * 省略map,reduce类等的设置         */        //把job封装到ControledJob对象中        ControlledJob controlledJob3=new ControlledJob(conf);        controlledJob2.setJob(job3);        //设置各个job之间的关系        controlledJob2.addDependingJob(controlledJob1);        controlledJob3.addDependingJob(controlledJob2);        //添加对各个job的控制        JobControl jobControl=new JobControl("jobcontrol");        jobControl.addJob(controlledJob1);        jobControl.addJob(controlledJob2);        jobControl.addJob(controlledJob3);        //启动job流        jobControl.run();        System.exit(0);

3.job设置预处理和后处理:在job处理前和处理后要进行一些处理,用第一种方法也能实现,但是显得很复杂。这个时候,我们可以使用MR中提供的ChainMapper和ChainReducer两个静态类(ChainMapper和ChainReducer目前只支持以前的API)来实现了,该方法最终是形成一个job,并且针对的是job的输入输出流,会自动组织。

Configuration conf=new Configuration();        JobConf jobConf=new JobConf(conf);        jobConf.setJobName("jobConf");        FileInputFormat.addInputPath(jobConf,new Path("/input"));        FileOutputFormat.setOutputPath(jobConf,new Path("/newoutput"));        //设置为不加载本地数据        JobConf mapConf1=new JobConf(false);        ChainMapper.addMapper(jobConf, Map1.class,Text.class, Text.class, Text.class, Text.class, true,mapConf1);        JobConf mapConf2=new JobConf(false);        ChainMapper.addMapper(jobConf, Map2.class,Text.class, Text.class, Text.class, Text.class, true,mapConf2);        //设置为不加载本地数据        JobConf reduceJob=new JobConf(false);        ChainReducer.setReducer(reduceJob, Reducer.class,Text.class, Text.class, Text.class, Text.class, true, reduceJob);        JobConf mapConf3=new JobConf(false);        ChainMapper.addMapper(jobConf, Map3.class,Text.class, Text.class, Text.class, Text.class, true,mapConf3);        JobClient.runJob(jobConf);

三中链接job流的方法在此介绍结束,如果有不对的地方请指正。

原创粉丝点击