一、背景
前些时候写了一篇这样的文档,由于当时的时间比较紧,且有些细节内容不太好细说,于是写的比较粗。之后也有些朋友发邮件给我,问我要详细的过程以及管理方式。于是,今天就像把这个内容细化,写在这里,供大家参考。
二、环境简述
Ø 操作系统Linux、JDK1.6
Ø Hadoop 0.20.2
Ø 开发工具选择eclipse 3.3.2(可配合使用hadoop的插件)
三、需求
首先还是要说一下需求,为什么要用hadoop的API来对Job进行管理。对此,我列举出了以下需求内容:
1、Job之间有先后的顺序执行问题(一个业务可能是多个Job才能完成)。
2、需要对每个Job的状态进行监控(是否完成以及失败情况处理等等)
3、有些无先后依赖关系的Job可以并发执行。
4、每个Job执行时的信息采集和记录。
5、能够灵活添加或删除要执行的Job队列。
如果以上需求去掉2和4,那么,我们通过脚本就可以做到(如shell)。但是如果要获取Job的详细信息以及Job运行时的状态,那么还是需要调用Hadoop的API来实现。所以,这里我选择了Java语言来实现以上需求。
四、设计思路
这里的设计必须要满足以上的需求(名字暂定为pipeline),设计内容大体如下:
Ø 通过周期的遍历时间,获得Job队列启动时间,并在启动之前加载Job配置文件。
Ø 通过配置Job的列表来确定Job执行的先后顺序以及哪些可以并发哪些不能并发。
Ø 通过JobClinet来采集相关的Job信息。
Ø 对失败的Job有重新尝试执行的机制。
因为考虑到pipeline是和Job的MR代码是剥离的,不能存在于一个工程下,这样,才能实现MR的灵活增删。那么,我们还要设计如何通过pipeline来管理MR生成好的JAR包。下面,我们将就以上思路来逐步设计。
五、配置文件
首先是配置文件,如果要满足以上的设计思路,那么需要2个配置文件。一个是pipeline自身的配置文件,包含了周期遍历时间、pipeline启动时间、任务失败尝试次数、最大并发任务数、调度模式(FIFO还是FAIR)以及日志输出目录。将这个配置文件命名为pipeline.ini,见下图:
上面的是pipeline自己的配置文件,那么,接下来我们还要考虑,如何将JAR加载到pipeline中,从而按照我们制定的顺序启动。我们设计了一下配置文件,暂定pipeline.joblist,这个配置文件通过序号来区分哪些任务是需要顺序执行,哪些任务是可以并发执行的。例如当前有5个任务,分别是A,B,C,D,E。AB是一个业务,CDE是一个业务。那么配置文件如下(字段间以\t划分):
01001 A 后面是输入、输出以及自定义的一些参数。 01002 B 后面是输入、输出以及自定义的一些参数。 02001 C 后面是输入、输出以及自定义的一些参数。 02002 D 后面是输入、输出以及自定义的一些参数。 02003 E 后面是输入、输出以及自定义的一些参数。 |
可以通过编号看出,01是一个业务,02是一