关于Mapreduce中多任务串联执行的认识

来源:互联网 发布:阿里云修改dns 编辑:程序博客网 时间:2024/05/22 17:30

最近学习了Mapreduce的分布计算框架,处理一些业务逻辑时,发现需要多个mapreduce程序才能完成。为了降低代码执行的繁琐度,将多个main文件合成一个,研究了下多任务的串联执行。下面就开始说说我的认识吧!


业务逻辑是比较普遍的求共同好友的测试。一般而言,根据业务逻辑,需要编写两个mapreduce程序,分别放在两个java文件中,先后执行才能获取最终的结果。下面是我将两个mapreduce程序放到一个java文件中,然后对main类的改造。


首先分别创建两个controlledJob对象,处理两个mapreduce程序。

ControlledJob controlledJob1 = new ControlledJob(job1.getConfiguration());
ControlledJob controlledJob2 = new ControlledJob(job2.getConfiguration());

创建一个管理组cf,用于管理创建的controlledJob对象,自定义组名,然后用addJob方法添加进组。

JobControl jc = new JobControl("cf");

jc.addJob(controlledJob1);
jc.addJob(controlledJob2);

创建好了管理组和job对象,我们还需要建立他们之间的关系,因为是串联的关系,两个job之间存在依赖关系。因此,通过addDependingJob()方法,建立依赖关系。

controlledJob2.addDependingJob(controlledJob1);

至此,我们就将两个job串联在了一起,并且制定了他们之间的相互依赖。然后设置线程对象来启动job。通过start方法。此时还不关闭线程,退出。

Thread thread = new Thread(jc);
thread.start();

注意到我们的main线程和job线程执行效率问题,往往会出现job线程还在执行,而main线程已经结束。因此我们需要加上下面这一行代码,通过判断job线程是否执行完毕,来决定是否退出jvm。通常job线程执行时间较长,因此我们让当前线程(main线程)在发现job线程没结束的情况下,稍微等他一秒钟。

while(!jc.allFinished()){
Thread.sleep(1000);
}
System.exit(0);


重点总结:多任务的串联执行问题,主要是要建立controlledjob,然后建组管理起来。留意多线程因效率而导致执行结束时间不一致的问题。

原创粉丝点击