完整目录、平台简介、安装环境及版本:参考《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-11 | app-12 | app-13 | 描述 |
1 | QuorumPeerMain | 是 | 是 | 是 | Zookeeper进程 |
2 | DFSZKFailoverController | 是 | 是 | 否 | NameNode HA |
3 | JournalNodes | 是 | 是 | 是 | 数据同步 |
4 | NameNode | 是 | 是 | 否 | Master节点 |
5 | DataNode | 是 | 是 | 是 | 存储数据块 |
6 | ResourceManager | 是 | 是 | 否 | 中心服务 |
7 | NodeManager | 是 | 是 | 是 | 节点代理 |
8 | JobHistoryServer | 否 | 是 | 否 | 历史服务器 |
9 | RunJar | 否 | 是 | 否 | Hive |
10 | Master | 是 | 否 | 否 | Spark主进程 |
11 | Worker | 是 | 是 | 是 | Spark工作进程 |
12 | EmbeddedOozieServer | 是 | 否 | 否 | Oozie进程 |
13.4 案例
Oozie最关键的两个文件就是:job.properties和workflow.xml,这是定义Workflow的两要素。其中job.properties是作业的相关属性配置,作业中需要用到的变量都需要定义在这里,workflow.xml就是定义工作流的文件。
13.4.1 配置文件解析
13.4.1.1 job.properties
流程的属性定义文件,定义了流程运行期间使用的外部参数值对。
参数 | 含义 |
nameNode | HDFS NameNode集群地址 |
jobTracker | MapReduce ResourceManager地址 |
queueName | 流程任务处理时使用的MapReduce队列名 |
dataLoadRoot | 流程任务所在目录名 |
oozie.coord.application.path | Coordinator流程任务在HDFS上的存放路径 |
Start | 定时流程任务启动时间 |
End | 定时流程任务终止时间 |
workflowAppUri | Workflow流程任务在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 | 定时流程任务终止时间 |
workflowAppUri | Workflow流程任务在HDFS上的存放路径 |
jobTracker | MapReduce ResourceManager地址 |
queueName | 任务处理时使用的Mapreduce队列名 |
nameNode | HDFS 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,查看输出
显示命令的执行结果