通过Hadoop的API管理Job

 

一、背景

前些时候写了一篇这样的文档,由于当时的时间比较紧,且有些细节内容不太好细说,于是写的比较粗。之后也有些朋友发邮件给我,问我要详细的过程以及管理方式。于是,今天就像把这个内容细化,写在这里,供大家参考。

二、环境简述

Ø  操作系统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是一

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Python提供了hadoop api来操作HDFS、MapReduce等,主要是通过`hadoop`包来实现。以下是使用Python hadoop api操作HDFS的示例代码: ```python from hadoop.fs import HdfsClient client = HdfsClient(host='your_hdfs_host', port=your_hdfs_port) client.makedirs('/path/on/hdfs') client.upload('/path/on/hdfs/file.txt', '/path/on/local/file.txt') client.download('/path/on/hdfs/file.txt', '/path/on/local/file.txt') client.delete('/path/on/hdfs/file.txt') ``` 其中,`your_hdfs_host`和`your_hdfs_port`需要替换为实际的HDFS主机和端口,`/path/on/hdfs`是HDFS上的目录路径,`/path/on/local`是本地目录路径。`makedirs`方法用于创建目录,`upload`方法用于上传文件,`download`方法用于下载文件,`delete`方法用于删除文件。 使用Python hadoop api操作MapReduce的示例代码如下: ```python from hadoop.mapred import JobConf, StreamingJob conf = JobConf() conf.set('mapreduce.job.inputformat.class', 'org.apache.hadoop.mapreduce.lib.input.TextInputFormat') conf.set('mapreduce.job.outputformat.class', 'org.apache.hadoop.mapreduce.lib.output.TextOutputFormat') conf.set('mapreduce.job.name', 'word_count') conf.set_mapper('python mapper.py') conf.set_reducer('python reducer.py') job = StreamingJob(args=['/path/on/hdfs/input', '/path/on/hdfs/output'], conf=conf) job.run() ``` 其中,`/path/on/hdfs/input`是输入路径,`/path/on/hdfs/output`是输出路径,`mapper.py`和`reducer.py`是Map和Reduce函数的实现。`JobConf`用于配置MapReduce作业,`StreamingJob`用于运行MapReduce作业。 需要注意的是,使用Python hadoop api操作HDFS和MapReduce需要先安装`hadoop`包和相关的依赖库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值