乌兹天下第一【dog】
文章目录
各种调度工具特性对比
Ooize 是一个重量级,功能全面
Azkaban 轻量级
linux crontab 最轻量,最简单
Oozie
使用Oozie的主要目的是为了管理不同类型的作业在Hadoop系统中处理。
Oozie基于hadoop集群
原生通过xml配置,很麻烦 ; 建议配合hue使用
安装
安装依赖:tomcat,mysql,hadoop htfs,
-
使用tomcat等服务器作为web页面展示容器,
-
使用关系型数据库存储Oozie的工作流元数据,
默认使用derby,由于derby的缺点,一般情况使用mysql作为Oozie的元数据库, -
使用extjs来作为报表展示js框架
-
在hadoop执行具体任务
Oozie Client:提供命令行、java api、rest等方式,对Oozie的工作流流程的提交、启动、运行等操作;
本质上是发HTTP请求向OozieServer提交作业
Oozie Server /Oozie webapp:java web应用
元数据库:定义了action执行的一些状态信息,一般存放在Mysql数据库中
hadoop: Oozie是依赖于HDFS进行调度的,作业的具体执行是放在Hadoop执行的
概念
执行流程
client向 oozie webapp 提交命令,
oozie执行hadoop程序编排流程:
1. 向yarn集群申请 启动一个mr作业**launcher job**,map-only的MR作业
2. 通过launcher job提交、监控 其他各种类型的action任务
工作流类型
bundle包含多个coordinator,coordinator包含一个workflow,workflow定义具体的action动作
- 总体组件图
WorkFlow
最基本的工作流,只能按流程顺序执行
job组成
job.properties
:记录了job的属性
workflow.xml
:使用hPDL 定义任务的流程和分支
lib目录
:用来执行具体的任务的jar包,sh文件等
workflow.xml
有两大类节点构成:
控制流节点(Control flow nodes)
- start,end,fail,kill
开始节点, 指定的工作流程作业的开始。
结束节点, 作业的结束信号。
错误节点, 指定要打印错误和相应的错误信息的发生。
-
decision,fork,join 控制工作流执行路径
-
不可以自定义
<workflow-app name="[WF-DEF-NAME]" xlmns="uri:oozie:workflow:0.1">
<!-- 启动 -->
<start to="[NODE-NAME]" />
<!-- 条件判断 选择执行 -->
<decision name="[NODE-NAME]">
<switch>
<case to="[NODE_NAME]">[PREDICATE]</case>
...
<case to="[NODE_NAME]">[PREDICATE]</case>
<default to="[NODE_NAME]"/>
</switch>
</decision>
<!-- fork和join必须一起使用 -->
<!-- 并发执行路径 -->
<fork name="[FORK-NODE-NAME]">
<path start="[NODE-NAME_1]" />
...
<path start="[NODE-NAME_N]" />
</fork>
<!-- fork所有的路径都到达后,才会继续执行join节点 -->
<join name="[JOIN-NODE-NAME]" to="[NODE-NAME]" />
<kill name="[NODE-NAME]" />
<message>[MESSAGE-TO-LOG]</message>
</kill>
<end to="[NODE-NAME]" />
</workflow-app>
动作节点(Action nodes)
执行具体动作,支持多种类型的Hadoop作业(如Java map-reduce、流式map-reduce、Pig、Hive、Sqoop和Distcp)以及特定于系统的工作(如Java程序和shell脚本)
-
操作节点的执行都是远程的
-
异步执行,通过 回调(call backs)或者 轮询(polling)探测状态
-
恢复执行的策略(定时重试,人工干预)
-
执行成功,则会转向ok节点;失败 则会转向error节点。
- 可以自定义
<action name="shell-node">
<!-- 执行shell脚本 -->
<shell xmlns="uri:oozie:shell-action:1.0">
<!-- 交给yarn执行 -->
<resource-manager>${resourceManager}</resource-manager>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<!-- 执行 echo 脚本 -->
<exec>echo</exec>
<!-- 执行 echo 脚本的参数 -->
<argument>my_output=Hello Oozie</argument>
<capture-output/>
</shell>
<!-- 执行结果 -->
<ok to="check-output"/>
<error to="fail"/>
</action>
Coordinator
定时触发WorkFlow
- 基于时间【起始时间,结束时间,频率】
- 基于数据【有了数据才会触发】
coordinator.xml
<coordinator-app name="cron-coord" frequency="${coord:minutes(10) 频率,支持crontab表达式}" start="${起始时间}" end="${结束时间}" timezone="UTC 时区"
xmlns="uri:oozie:coordinator:0.2">
<action>
<workflow>
<app-path>${workflow.xml文件路径}</app-path>
<configuration>
<property>
<name>resourceManager</name>
<value>${resourceManager}</value>
</property>
<property>
<name>nameNode</name>
<value>${nameNode}</value>
</property>
<property>
<name>queueName</name>
<value>${queueName}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
Bundle Job
批处理,绑定多个Coordinator
bundle.xml
<bundle-app name='bundle-app' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:bundle:0.1'>
<coordinator name='coord-1'>
<app-path>${coordinator.xml路径}</app-path>
<configuration>
<property>
<name>start</name>
<value>${start}</value>
</property>
<property>
<name>end</name>
<value>${end}</value>
</property>
</configuration>
</coordinator>
</bundle-app>
生命周期,Job状态
- PREP,一个工作流第一次创建就处于PREP状态,表示工作流已经创建,但是还没有运行。
- RUNNIG,当一个已经被创建的工作流job开始执行的时候,就处于RUNNING状态。它不会达到结束状态,只能因为出错而结束或者被挂起。
- SUSPENDED,一个RUNNING状态的工作流Job会变成SUSPENDED状态,而且它会一直处于该状态,除非这个工作流Job被重启开始执行或者被杀死。
- SUCCESSEDED,当一个RUNNING状态的工作流Job达到了end节点,他就变成了SUCCESSEDED最终完成状态。
- KILLED,当一个工作流Job处于被创建后的状态。或者处于RUNNING,SUSPENDED状态时,被杀死,则工作流Job的状态变为了KILLED状态。
- FAILED,当一个工作流Job不可预期的错误失败而终止,就会变成FAILED状态。
执行workflow应用程序
工作流应用程序由工作流定义和所有相关资源组成,例如MapReduce Jar文件,Pig脚本等。应用程序需要遵循简单的目录结构并部署到HDFS,以便Oozie可以访问它们。
|- apps #任务
| | shell # 执行shell脚本
| | |- job.properties
| | |- workflow.xm
| |- cron # 定时
| | |- coordinator.xml
| | |- job.properties
| | |- workflow.xml
| |- bundle # 批处理
| | |- bundle.xml
| | |- job.properties
|- input-data #数据源
|- src
job.properties
工作流参数配置
#任务执行路径:hdfs
nameNode=hdfs://localhost:8020
examplesRoot=examples
#oozie资源存储路径
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/shell
#交给谁调度:yarn
resourceManager=localhost:8032
#mr任务队列名称
queueName=default
hadoop1是 ,hadoop2是
-
上传workFlow资源到
oozie.wf.application.path
-
执行任务
$ oozie job -oozie http://oozie-server-ip:11000/oozie -config job.properties路径 -run
>返回Job ID
#oozie job -oozie http://172.16.5.32:12000/oozie -config /usr/local/service/oozie/examples/apps/shell/job.properties -run
- 查看结果
$ oozie job -info <Job ID>
oozie的具体执行提交到了yarn,可以从yarn看具体日志
hue
(Hadoop User Experience)
开源的Apache Hadoop UI系统,统一了各个项目的开发方式放在一个接口里
Hue出自CDH
- SQL编辑器,支持Hive, Impala, MySQL, Oracle, PostgreSQL, SparkSQL, Solr SQL, Phoenix…
- 搜索引擎Solr的各种图表
- Spark和Hadoop的友好界面支持
- 支持调度系统Apache Oozie,可进行workflow的编辑、查看