阅读建议
建议你耐心仔细阅读本文,先对JOB的结构有整体概念,然后研究每个文件的意义,过程中请多翻看案例代
码demo-cd。至此,你一定能够深刻理解JOB的构造。
案例demo-cd的模拟场景简述:每日从上游业务系统同步增量数据到HADOOP,然后运行数据分析模型,
对新过来的数据进行分析,得出分析结果后,把结果导出到前端系统,供前端做人工审查。
阅读本文之前,建议你对SHELL、HIVE、SQOOP有所了解,这些都是零部件,而本文所述是整体结构。
1 / 10
一、JOB的文件结构
JOB的文件结构通常是这样的:
在SVN目录oozie-app下,有各种JOB,他们是相对独立的,每个JOB都可以提取下来单独发布到HADOOP平台上运行(部署过程另外讲解)。比如我们的经典案例demo-cd,就是一个JOB。
hql目录用于存放hive脚本,hive脚本习惯后缀.q;shell目录用于存放shell脚本,shell脚本习惯后缀.sh。 文件coordinator.xml、demo-cd.properties、runJob.sh、workflow.xml,是一个JOB所必需的,文件removeJob.sh不是必需的,它们的意义下面详解。
2 / 10
二、JOB的文件分解
在讲解JOB的各个文件意义之前,我们思考一个业务场景:当客户提出一个数据模型,我们首先要通过SQOOP
工具,把业务数据从业务系统同步到HADOOP平台供数据分析使用,然后通过HIVE实现数据模型,这过程中可能形成多个HIVE.q脚本和SHELL.sh脚本,它们之间相互依赖,必须有序地、且可能要求按一定的频率重复执行。目前这些脚本都还只是零散的工作部件(action),我们希望这些脚本被组织起来,按照预设的执行顺序和调度频率执行,谁来负责这个事情?预设脚本的执行顺序,是工作流(workflow)要解决的问题;预设工作流的执行频率,是调度机制(coordinator)要解决的问题。Coordinator和workflow一起让工作变得有组织和有序。 1)workflow.xml
它负责组织一个工作流。文件中,你可以看到多个action,每个action都有各自负责执行的内容(通常是执
行一个SHELL脚本),多个action之间的流向是预设的,而且是单向的非闭合的。
以下我们截取一段workflow.xml做详解:
…… 省略workflow中间多个action,详看案例代码
${file_model_001}
${nominalformate_Date} ${mapred_job_queue_name}
…… 省略workflow中间多个action,详看案例代码
3 / 10
2)coordinator.xml
上面讲到workflow是一个工作流,但它是单向的非闭合的,它没有回路,换言之,一遍跑完它就真的完了,
workflow无法帮助你轮循工作流。Coordinator作为弥补,它是一个调度器,负责将workflow按预设的频率有序地重复执行。
start=\ end=\timezone=\xmlns=\> initial-instance=\timezone=\> ${application_path} 3)demo-cd.properties 定义了JOB私有的参数配置,不作详解。但以下几个参数需要注意: job_start=2014-09-02T01:00+0800 job_end=2099-12-31T02:00+0800 4 / 10 4)runJob.sh 这个文件的作用就是启动JOB,理解这个文件,可以分三部分: A、读取公共配置文件/appcom/apps/hduser0006/server.env,获取所需参数值 j_username=`grep j_username /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` j_password=`grep j_password /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` oozie_url=`grep oozie_url /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` process_user=`grep process_user /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` namenode_address=`grep namenode_address /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` jobtracker_address=`grep jobtracker_address /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` mapred_job_queue_name=`grep mapred_job_queue_name /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` data_db_username=`grep data_db_fxq_username /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` data_db_password=`grep data_db_fxq_password /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` data_db_url=`grep data_db_fxq_url /appcom/apps/hduser0006/server.env|awk 'BEGIN{FS=\` B、提交JOB cd /appcom/apps/hduser0006/demo-cd/; chmod 775 *.* dos2unix *.sh; hadoop fs -rmr /apps/hduser0006/demo-cd; hadoop fs -put /appcom/apps/hduser0006/demo-cd/ /apps/hduser0006/demo-cd/; C、通过Oozie启动JOB,只需一条Oozie启动命令 oozie -Dheader:j_username=$j_username -Dheader:j_password=$j_password job -Dnamenode_address=$namenode_address -Djobtracker_address=$jobtracker_address -Dmapred_job_queue_name=$mapred_job_queue_name -Ddata_db_username=$data_db_username -Ddata_db_password=$data_db_password -Ddata_db_url=$data_db_url -Dprocess_user=$process_user --oozie $oozie_url -config /appcom/apps/hduser0006/demo-cd/demo-cd.properties -auth ldap -run -doas $process_user 5)removeJob.sh 它仅仅是一个杀JOB的工具,从来不需要修改它,而且它不是必须的。当我们通过执行runJob.sh启动JOB 之后,会返回一个JOB-ID,我们可以把JOB-ID交给removeJob.sh,把JOB杀掉。 ……/demo-cd/removeJob.sh [JOB-ID] 另外,我们也可以通过如下命令,杀JOB: /appcom/oozie/bin/killJob.sh [JOB-ID] 5 / 10