Hive从入门到精通(十三)Hive和Oozie整合

完整目录、平台简介、安装环境及版本:参考《Hive从入门到精通-概览》

十三、Hive和Oozie整合

Hive可以讲一个查询转化为一个或者多个执行过程,如果某个过程执行失败了,Hive就会清理这个进程并报告错误信息,如果执行成功了,Hive就会执行下一个子过程,直到整个Job执行成功。同时如果在一个HQL文件中放置多个语句,Hive会按照语句次序依次执行,知道文件所有语句都执行成功为止。

但是对于一些复杂的工作流,如开始执行一个传统的MR任务,然后将MR任务的输出作为Hive的输入,最后将Hive的输出使用distcp输出到远程集群,这个时候就需要一个工作流引擎Oozie来进行处理。

Oozie就满足了这一点,Oozie是大数据工作流引擎引入的一个必须条件,这个调度器和之前做的Java调度器是不一样的,Oozie调度器是针对大数据处理的调度器,适合现有大数据处理框架功能而生的,比如有Spark的、Hive的、Hadoop的等,这是一套大数据处理所特有的框架,而不仅仅是做一个可视化工作流的工作。

13.1 架构

基本架构如图,Oozie的客户端、命令行或者RESET接口提交JOB给Oozie服务器,Oozie服务器上的调度器调度任务在hadoop集群上执行,因此Oozie服务端需要有一个做相应大数据处理的lib库,支撑Oozie客户端提交的任务在集群上执行,此外还有针对工作流引擎的关系型数据库为存储工作流细节做支撑。

右边图为客户端提交任务之后的详细情况,将JOB提交到HDFS后,集群上所有的节点就可以通过HDFS下载JOB的详细配置信息和执行代码,由Oozie的服务器调度执行。然后提交到集群上,由YARN的ResourceManager去Launcher JOB,JOB有MR、Hive、Pig、Java、Shell、Sqoop、SSH以及Spark等等,这些JOB都会是做支撑的Action单元,其中需要和文件系统HDFS做相应的集成。

13.2 流程

如图为Oozie的流程,开始后,需要做一个MR job,再做一个Pig job,接着fork两个job,一个是MR job,一个是Pig job,将两个Job的结果做一次join后结束。反映的是下面的流程,工作流基本都类似。流程图上每个流程都是一个节点action,做什么动作,这个动作是和什么动作并发的执行,或者说它的输入是什么,输出是什么,输出结果产生什么样的工作,这个就是工作流引擎的基本点。Oozie是专门为大数据处理所定制的,最起码需要集成相应的库,比如MR、Hive、Pig、Spark等相应库,或者说它要支持这些框架的任务在其调度器上执行。

流程部分就是一个个action,也可以认为是一个个的任务,action包括:Email Action、Action、Shell Action、Hive Action、Hive2 Action、Sqoop Action、Ssh Action、DistCp Action、Sparm Action、new Custom Action Executor 。最核心点就是编写action,针对不同的任务编写不同的action。

13.3 环境搭建

集群搭详细安装方式参考《Spark平台(高级版)》,目前该集群环境已经安装了Oozie,只需求在启动时,启动即可。

13.3.1 启停配置

在hadoop用户在,修改app-11节点的/hadoop/config.conf文件,并保存.

命令:vi config.conf

需要启动的应用程序,则将前面的#删除,不启动的保留即可。此处由于需要使用Oozie。

13.3.2 启动集群

用ssh连接到app-11节点,切换到hadoop用户,同时切换到/hadoop目录。

执行命令:./startAll.sh

分别在三个节点查看启动进程:jps

13.3.3 停止集群

在app-11节点切换到haoop用户,进入/hadoop目录。

执行命令:./stopAll.sh

分别在三个节点查看进程:jps

13.3.4 集群进程说明

三个节点各进程情况说明

序号进程名app-11app-12app-13描述
1QuorumPeerMainZookeeper进程
2DFSZKFailoverControllerNameNode HA
3JournalNodes数据同步
4NameNodeMaster节点
5DataNode存储数据块
6ResourceManager中心服务
7NodeManager节点代理
8JobHistoryServer历史服务器
9RunJarHive
10MasterSpark主进程
11WorkerSpark工作进程
12EmbeddedOozieServerOozie进程

13.4 案例

Oozie最关键的两个文件就是:job.properties和workflow.xml,这是定义Workflow的两要素。其中job.properties是作业的相关属性配置,作业中需要用到的变量都需要定义在这里,workflow.xml就是定义工作流的文件。

13.4.1 配置文件解析

13.4.1.1 job.properties

流程的属性定义文件,定义了流程运行期间使用的外部参数值对。

参数含义
nameNodeHDFS NameNode集群地址
jobTrackerMapReduce ResourceManager地址
queueName流程任务处理时使用的MapReduce队列名
dataLoadRoot流程任务所在目录名
oozie.coord.application.pathCoordinator流程任务在HDFS上的存放路径
Start定时流程任务启动时间
End定时流程任务终止时间
workflowAppUriWorkflow流程任务在HDFS上的存放路径
13.4.1.2 workflow.xml

描述了一个完整业务的流程定义文件。一般由一个start节点、一个end节点和多个实现具体业务的action节点组成。

参数含义
name流程文件名
start流程开始节点
end流程结束节点
action实现具体业务动作的节点(可以是多个)
13.4.1.3 coordinator.xml

周期性执行workflow类型任务的流程定义文件。

多个workflow可以组成一个coordinator,可以把前几个workflow的输出作为后一个workflow的输入,也可以定义workflow的触发条件,来做定时触发。

参数含义
Frequency流程定时执行的时间间隔
Start定时流程任务启动时间
End定时流程任务终止时间
workflowAppUriWorkflow流程任务在HDFS上的存放路径
jobTrackerMapReduce ResourceManager地址
queueName任务处理时使用的Mapreduce队列名
nameNodeHDFS NameNode地址

13.4.2 Hive2 Action

Hive分为hive和hive2,这个并不是代表版本。Hive是指通过metastore方式解析提交集群,需要借助hive的Jar包和规范等。Hive2可以让hive master完成工作,而oozie只是负责任务的调度和提交工作。Hive2代表一个主流的方式,可以减少和hive的更多耦合工作,耦合越小,整个架构体系才能够更健壮。

13.4.2.1 代码文件

编写job.properties,通过jdbc访问server,访问data_query库

nameNode=hdfs://dmcluster
resourceManager=rm1,rm2
queueName=default
examplesRoot=hive2-oozie
oozie.use.system.libpath=true

jdbcURL=jdbc:hive2://app-12:10000/data_query

oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/hive2
master=yarn-cluster

编写workflow.xml定义库位置和执行文件。

<workflow-app xmlns="uri:oozie:workflow:1.0" name="hive2-wf">
    <start to="hive2-node"/>

    <action name="hive2-node">
        <hive2 xmlns="uri:oozie:hive2-action:1.0">
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <jdbc-url>${jdbcURL}</jdbc-url>
            <script>script.q</script>
        </hive2>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Hive2 (Beeline) action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

编写script.q所需要做的操作

SELECT count(*) FROM stu_basic;
13.4.2.2 上传文件

在app-11节点的/tmp目录下新/hive/oozie目录

命令:mkdir -p /tmp/hive/oozie

将三个代码文件上传到/tmp/hive/oozie目录

由于job.properties文件中定义了路径oozie.wf.application.path= hdfs://dmcluster /user/hadoop/hive2-oozie/apps/hive2,需要在HDFS目录上新建该路径目录

命令:hdfs dfs -mkdir -p /user/hadoop/hive2-oozie/apps/hive2

上传/tmp/hive/ooze三个代码文件到HDFS的/user/hadoop/hive2-oozie/apps/hive2目录

命令:hdfs dfs -copyFromLocal /tmp/hive/oozie/* /user/hadoop/hive2-oozie/apps/hive2/
13.4.2.3 运行文件

切换到oozie的bin目录,使用oozie命令

命令:cd /hadoop/Oozie/oozie-5.0.0/bin/

运行代码文件:

命令:./oozie job -oozie http://app-11:11000/oozie -config /tmp/hive/oozie/ job.properties -run

Web页面查看:app-11:11000

注意,如果现实不了,查看附件A,修改hosts文件,或者直接用IP地址访问

可以看到命令行中的Job ID已经执行成功,双击JOB ID查看执行信息

Hadoop集群查看:app-12:8088

显示都执行完成且成功,双击ID:application_1567653145881_0002

注意,如果现实不了,查看附件A,修改hosts文件,或者直接用IP地址访问

点击Logs,查看日志

点击stdout,查看输出

显示命令的执行结果

发表回复