对hue中Job Designer源码解析

时间:2021-03-23 20:08:39

HueJob Designer的运行流程

本次调研的主要目的是了解Hue中底层工作流引擎Oozie运行MapReduce Job的流程的并且评估下未来在这方面开发的难点和工时。

一.HueJob Designer介绍

Hue做为一个开源框架(https://github.com/cloudera/hue),底层使用python进行实现。它以web形式展示给用户,使用框架为python Django

Hue整体模块中,本文主要调研Job Designer模块,该模块主要应用于管理MR Job以及将Job提交给Oozie工作流引擎的过程。其具体界面如下:

 

Oozie可以执行许多不同的任务如MRPigHIVEjava 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的类型。Workflowactions组成了一个DAG图,保证了actions之间的关联和依赖。

这里workflowactions的存储都是放置在用户指定的hdfs上,存储的文件名字为:username-oozie-jobId-time。

2.2 提交一个Designer

在如下页面中我们可以选择提交某个Designer

 

 

提交的代码主要位于oozie.views.editor.submit_workflow。这个方法的具体流程如下:

1.Request.GET 方式提交,会渲染submit_job_popup.mako模板,在此处可以填写提交代码的参数,例如MR JOBsleep时长并确认提交。

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,用户可以通过ClientHue)通信,提交,执行并管理查询作业信息。

如果未来做数据平台,在定义workflow.xml文件时会比较麻烦,需要定于节点直接的关联。具体的开发过程是,首先将workflow和相应的jar包放置在hdfs上。其次,在开发的平台上提交执行的用户标识和执行作业的位置(用户标识进行权限验证,作业位置Oozie会找到相应的作业,生成工作流然后提交给hadoop集群进行计算)。