通过Hadoop的API对Job进行管理

来源:互联网 发布:百度云盘数据空间成本 编辑:程序博客网 时间:2024/04/30 10:06

一、需求背景

由于我们在做一些业务的时候,可能需要多个Job来组合才能满足一个也许需求,而每个Job之间都有依赖关系,所以产生了需要对Job顺序的控制。总结一下需求,大体如下:

1、Job之间有先后的顺序执行问题。

2、需要对每个Job的状态进行监控(是否完成以及失败情况处理等等)

3、对可以并发执行的Job调整。

4、每个Job处理时的信息的采集以及记录。

5、能够灵活添加或删除要执行的Job队列。

如果以上需求去掉2和4,那么,我们通过脚本就可以做到(如shell)。但是如果要获取Job的详细信息以及Job运行时的状态,那么还是需要调用Hadoop的API来实现。所以,这里我选择了Java语言来实现以上需求。

二、环境简述

1、操作系统Linux、JDK1.6

2、Hadoop 0.20.2

3、开发工具选择eclipse 3.3.2(可配合使用hadoop的插件)

三、设计思路

这里的设计必须要满足以上的需求,设计内容大体如下:

1、通过周期的遍历时间,获得Job队列启动时间,并在启动之前加载Job配置文件。

2、通过配置Job的列表来确定Job执行的先后顺序以及哪些可以并发哪些不能并发。

3、通过JobClinet来采集相关的Job信息。

4、对失败的Job有重新尝试执行的机制。

四、实现关键点

设计出来了,那么实现就需要一些关键点的考虑,一下是我总结的一些关键点:

1、Job配置文件设计。我这里对每个Job都有自己的编号,在队列任务启动之间都会加载该配置文件,根据用户自己配置的Job顺序来依次的启动Job。

2、上面提到的是典型的FIFO模式,hadoop本身通过配置可以实现公平调度模式,那么只要把集群配置完成,我们通过修改Job执行的配置文件也可以实现并发启动。这里的配置文件我就不详细列出来,各自的定义也不尽相同。关键点就是通过配置文件可以明显的标识出那一些Job是需要顺序执行,哪一些Job是可以并发执行就可以。读取文件之后程序获得了此信息就可以按照配置文件执行。在这里我通过java.util.concurrent.Semaphore类来实现。具体代码不写了。

3、如何通过java代码启动Job,这里我考虑的是使用Hadoop的API来实现。最早我也犯了个错误,采用exec的方式执行,后来我跟踪源代码找到我们在控制台输入hadoop jar的启动原理之后,将代码做了修改,采用了org.apache.hadoop.util.RunJar这个类,具体方法可以自己细看。

4、对于信息的采集,这里比较麻烦,应为我要采集到确定是通过我启动的Job,那么我必须有一个依据,这里我的依据就是JobName。在队列配置文件中将配置此JobName。同Job内部代码编写的Job job = new Job(conf, "JobName");需要一直。这样,通过JobName我能获取JobID,这样,最终就能定位并获取该Job的详细信息。

5、失败任务尝试。这里需要说明如果Job执行返回状态是fail,那么可以参照设定的失败次数进行重复尝试。也就是递归的调用。

6、Job启动之前还需要做一系列的检查工作。例如集群是否正常、输入和输出目录是否存在以及处理办法、指定的Jar文件是否存在等等。这些通过调用API都能实现。

五、总结

1、代码已编写完成,也经过了一些测试,基本没有大的问题。

2、一些信息的采集可能不够完成,只能做到一些基本状态的采集,不能作为性能监控和硬件监控的依据。

3、可能还存在一些漏洞和不完整的地方,后面我会持续的改进。

4、对于Hive我在这里还未提到,不使用Hive和不使用shell理由基本一致。如果做简单的业务,个人认为Hive还是首选。

5、写的不对或是有疑问的地方欢迎发邮件讨论。dajuezhao@gmail.com