Hue中Job Designer的运行流程
本次调研的主要目的是了解Hue中底层工作流引擎Oozie运行MapReduce Job的流程的并且评估下未来在这方面开发的难点和工时。
一.Hue中Job Designer介绍
Hue做为一个开源框架(https://github.com/cloudera/hue),底层使用python进行实现。它以web形式展示给用户,使用框架为python Django。
在Hue整体模块中,本文主要调研Job Designer模块,该模块主要应用于管理MR Job以及将Job提交给Oozie工作流引擎的过程。其具体界面如下:
Oozie可以执行许多不同的任务如MR,Pig,HIVE,java application等,同时它也能监控底层任务的运行。
二.Job Designer的源码
首先,我们需要了解每个Job在后台的管理过程。操作了Hue网站后,其具体流程如下:
1.创建一个Designer。
2.保存并展示。
3.将Designer提交至流程引擎并计算结果。
根据以上的流程进行源码阅读。
2.1 新建一个Designer
当新建一个Designer时,主要是建立了workflow和一堆actions之间的关联。Designer在创建(方法位于jobsub\views.py)时主要生成了:
(1)workflow,其主要属性如下:位于Oozie\models.py
属性名 |
类型 |
解释 |
Is_single |
Boolen |
是否单独一个工作流,default false |
Start |
对象和自身多对一的关系 递归 |
起始节点 |
End |
ForeignKey |
结束节点 |
Job_xml |
Char |
Hadoop JobConf 文件可以重定义其中的配置 |
Job_properties |
Text String[] |
hadoop工作流中所有执行的配置 |
(2)action 操作行为,由ActionForm生成,ActionForm主要属性:位于oozie\form.py。
动作节点会根据输入的节点类型进行判断。Oozie本身会维护一个hashmap:
每一种不同的node_type对应着一个Form类。根据以上map可以定义动作action的类型。Workflow和actions组成了一个DAG图,保证了actions之间的关联和依赖。
这里workflow和actions的存储都是放置在用户指定的hdfs上,存储的文件名字为:username-oozie-jobId-time。
2.2 提交一个Designer
在如下页面中我们可以选择提交某个Designer。
提交的代码主要位于oozie.views.editor.submit_workflow。这个方法的具体流程如下:
1.Request.GET 方式提交,会渲染submit_job_popup.mako模板,在此处可以填写提交代码的参数,例如MR JOB里sleep时长并确认提交。
2.Request.POST方式。会调用_submit_workflow方法,这个方法首先会生成一个Submission对象,此对象位于liboozie.submittion下,主要的属性包含:
属性名 |
解释 |
Job |
操作的job |
User |
用户 |
Fs |
通过requst.fs获取 |
Jt |
jobTracker?通过request获取 |
Oozie_id |
id |
Api |
输入参数user,返回OozieApi对象,见下图 |
Properties |
配置文件 |
OozieApi对象,此对象中包含通信信息,具体的属性如下:
生成Submission之后会调用其run()方法进行和服务器的通信并返回job_id(这个jobId用于在下个重定向的页面中获取job的详细信息),其中使用HttpClient进行rest通信,本地操作做为一个client,发送post请求给服务器处理,请求的主要参数如下:
Jobid,参数(包含用户的信息以及执行时间timeout值),配置文件(用户定义的配置文件,在Submission中),以及数据提交方式(默认为application/json;charset=utf-8)。
三.总结
Hue做为中介将运行的作业是放置在Oozie上,提交的数据包含作业的jar包和workflow.xml文件。Oozie提供了远程的RestApi,用户可以通过Client(Hue)通信,提交,执行并管理查询作业信息。
如果未来做数据平台,在定义workflow.xml文件时会比较麻烦,需要定于节点直接的关联。具体的开发过程是,首先将workflow和相应的jar包放置在hdfs上。其次,在开发的平台上提交执行的用户标识和执行作业的位置(用户标识进行权限验证,作业位置Oozie会找到相应的作业,生成工作流然后提交给hadoop集群进行计算)。