oozie (会用!)
任务调度框架
当一个项目中出现多个shell、MapReduce、hql、sqoop类型的任务时
并且这些任务之前存在一种依赖关系时,需要借助专业的任务调度框架完成任务流的定义控制
oozie可以实现
多个任务执行的顺序控制
job1->job2->job3/job4->job7 ..
多个任务组成的一个任务流的执行频率控制
每天、每小时、每周执行一个任务流
一个循环执行的任务流的生命周期
在以后的哪段时间范围内循环的执行
oozie
cloudera公司开源,贡献给Apache基金会,TM
http://oozie.apache.org/
其他常用的任务调度工具/框架
linux crontab
最简单的调度服务,也是最常用
周期性、定时执行调度某个命令或者shell脚本任务
服务名称为crond
编辑任务:
crontab -e
分 小时 日 月 星期 + shell命令
举例:
定期每周三凌晨一点清空服务器的/tmp目录
0 1 * * 3 /bin/rm -rf /tmp/*
对单一的定时任务调度比较方便,对于一个项目中同时存在的多个有依赖关系的任务调度时不能满足
Azkaban
https://azkaban.github.io/
https://zhuanlan.zhihu.com/p/22184691?refer=dataeye
领英公司开源的一款针对hadoop任务(MapReduce、sqoop、hql、pig、spark..)的调度框架
适合小公司使用,有用户交互界面,功能简单实用
为crontab的界面化工具,但可以解决多任务依赖
zeus(宙斯)
阿里开源
有中文文档
国内大公司有使用
oozie组件架构 (PPT-14)
物理组件
oozie server / Tomcat server =》
oozie的核心服务进程
提供了与其他框架或客户端的交互通道
oozie database
oozie需要一个数据库的支撑存储到调度的任务元数据信息
功能组件
workflow:任务流
控制流节点 ->控制任务的流向
start
kill
fork
end
……
动作节点 ->要调度执行的任务本身
action
shell
MapReduce
hql
sqoop
email
动作节点的任务的执行结果会影响到任务的流向
coordinator
定义一个workflow任务流的执行循环条件及生命长度
执行循环条件
基于时间的循环 =》每小时、每天、每月
基于数据的循环 =》当目标文件多大时开始执行workflow
循环执行的生命长度
bundle
将多个coordinator调度任务打包执行
oozie的安装部署
http://oozie.apache.org/docs/4.1.0/DG_QuickStart.html - 官方安装文档
System Requirements
jdk
hadoop -》oozie依赖hadoop
oozie的任务流中的action节点的执行本身就是一个MapReduce任务
oozie需要在hdfs上创建一个jar包共享库,将所有可能调度到的框架的相关jar包上传到hdfs上
在本地开发编辑的workflow任务app最终需要上传到hdfs上,oozie最终需要到hdfs上读取相关任务的配置文件
1、确保hadoop已经安装成功
2、上传解压oozie的tar包
$ tar zxf /opt/softwares/oozie-4.1.0-cdh5.14.2.tar.gz -C /opt/cdh-5.14.2/
3、为oozie服务在hadoop集群上配置一个代理用户
在hadoop的core-site.xml中添加一下配置
注意:两个属性中的用户名需要修改为当前的普通用户
hadoop.proxyuser.xxx.hosts
*
hadoop.proxyuser.xxx.groups
*
4、重启hadoop服务进程
hdfs
yarn
$ sbin/stop-all.sh
5、将oozie安装目录下的oozie-hadooplibs-4.1.0-cdh5.14.2.tar.gz解压到oozie框架所解压的目录,会在oozie的安装目录下发现一个hadooplibs 目录
$ tar zxf /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/oozie-hadooplibs-4.1.0-cdh5.14.2.tar.gz -C /opt/cdh-5.14.2/
6、在oozie的安装目录下创建一个libext目录,并将hadooplibs/hadooplib-2.6.0-cdh5.14.2.oozie-4.1.0-cdh5.14.2/目录下的所有的jar包拷贝到libext目录下
$ mkdir /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/libext
$ cp /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/hadooplibs/hadooplib-2.6.0-cdh5.14.2.oozie-4.1.0-cdh5.14.2/* /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/libext/
7、将oozie web控制台所需要的js 库添加到 libext目录下
8、安装mysql并创建一个oozie所需要的数据库
> create database oozie;
9、将访问mysql的驱动包放入到oozie的libext目录下
$ cp /opt/cdh-5.14.2/hive-1.1.0-cdh5.14.2/lib/mysql-connector-java-5.1.27-bin.jar /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/libext/
10、配置oozie访问mysql的权限
$ vi conf/oozie-site.xml
oozie.service.JPAService.jdbc.driver
com.mysql.jdbc.Driver
JDBC driver class.
oozie.service.JPAService.jdbc.url
jdbc:mysql://192.168.134.101:3306/oozie
JDBC URL.
oozie.service.JPAService.jdbc.username
root
DB user name.
oozie.service.JPAService.jdbc.password
123456
DB user password.
IMPORTANT: if password is emtpy leave a 1 space string, the service trims the value,
if empty Configuration assumes it is NULL.
IMPORTANT: if the StoreServicePasswordService is active, it will reset this value with the value given in
the console.
注意:
jdbc.url的路径中的主机名修改
确认使用的用户名和密码是否有效
11、oozie关联hadoop的配置文件
$ vi conf/oozie-site.xml
oozie.service.HadoopAccessorService.hadoop.configurations *=/opt/cdh-5.14.2/hadoop-2.6.0-cdh5.14.2/etc/hadoop
12、依次执行以下三个命令
$ bin/oozie-setup.sh prepare-war [-d directory] [-secure]
sharelib create -fs
db create|upgrade|postupgrade -run [-sqlfile ]
1)使用oozie自带脚本将本地的所有框架的jar包上传到hdfs上某个路径下(hdfs上的共享jar包库路径)
$ bin/oozie-setup.sh sharelib create -fs hdfs://192.168.134.101:8020 -locallib /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/oozie-sharelib-4.1.0-cdh5.14.2-yarn.tar.gz
the destination path for sharelib is: /user/beifeng/share/lib/lib_20181202230508 --hdfs上的共享jar包库路径
2)初始化oozie在mysql中状态(创建一些oozie所需要用到的表)
$ bin/oozie-setup.sh db create -run -sqlfile ./oozie.sql
3)生成oozie的Tomcat web工程 war包 – 打war包
# yum -y install unzip zip
$ bin/oozie-setup.sh prepare-war
13、启动 oozie server (Tomcat server )
$ bin/oozied.sh start
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cdh-5.14.2/hive-1.1.0-cdh5.14.2/lib/*
14、访问oozie的web控制台
http://192.168.134.101:11000/oozie/
案例
案例一 :配置一个只包含一个shell脚本任务的workflow
案例二 :配置一个包含多个shell脚本任务的workflow
案例三 :配置一个包含MapReduce任务的workflow
案例四 :配置一个coordinator应用,去周期性调度执行案例二中的workflow任务流
============================================
案例一:
配置一个只包含一个shell脚本任务的workflow
$ tar zxf oozie-examples.tar.gz 解压oozie应用模板
$ cp -r /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/examples/apps/shell/ /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell 拷贝shell任务模板
shell任务模板文件
job.properties
java属性文件
内部定义了多个被workflow.xml调用的变量值
workflow.xml
xml文件
定义了任务流的执行逻辑及具体要调度执行的任务的具体信息
自定义shell脚本
$ vi check_mem.sh
#!/bin/sh
/usr/bin/free -m >> /tmp/mem.log
/bin/date +"%Y%m%d-%H:%M:%S" >> /tmp/mem.log
/bin/echo “~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~” >> /tmp/mem.log
1、 修改job.properties
nameNode=hdfs://192.168.134.101:8020
jobTracker=192.168.134.101:8032
queueName=default
examplesRoot=oozie-apps
oozie.wf.application.path= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/myshell
check_mem=check_mem.sh
${check_mem} ---要调度执行的脚本的名称
/${examplesRoot}/myshell/${check_mem}#${check_mem}
--要执行的脚本所在的hdfs上路径
--#${check_mem} 表示oozie会将hdfs上的要执行的shell脚本拷贝给最终执行该脚本的服务器节点一份
2、修改workflow.xml
${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${check_mem} /${examplesRoot}/myshell/${check_mem}#${check_mem} Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]3、上传自定义的myshell 应用到hdfs上
$ bin/hdfs dfs -mkdir /oozie-apps
$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/ /oozie-apps
注意:
在所有的oozie app应用中,job.properties属于应用的属性文件,该文件不需要上传到hfds上,在本地提交给oozie执行workflow应用时会在本地直接加载读取该文件
workflow.xml及对应要调度执行的脚本必须上传到hdfs上,并且后续对其修改后一定要将hdfs上的原文件进行替换
4、提交oozie workflow应用
$ sbin/mr-jobhistory-daemon.sh start historyserver
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -config /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/job.properties -run
JA006: Call From bigdata01.project.com/192.168.134.101 to bigdata01.project.com:10020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
$ sbin/mr-jobhistory-daemon.sh start historyserver
kill掉某个workflow任务
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -kill 0000000-181202231324729-oozie-beif-W
案例二:
在案例一基础上添加另外一个shell脚本任务
任务流:
start -》
检查内存脚本
ok-》 检查磁盘空间脚本
error-》检查磁盘空间脚本
检查磁盘空间脚本
ok-》 end
error-》kill
定义另外一个检查磁盘空间脚本
$ vi check_disk.sh
#!/bin/sh
/bin/df -h >> /tmp/disk.log
/bin/date +"%Y%m%d-%H:%M:%S" >> /tmp/disk.log
/bin/echo “~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~” >> /tmp/disk.log
修改案例一的job.properties属性文件
check_disk=check_disk.sh
修改案例一的workflow.xml
${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${check_mem} /${examplesRoot}/myshell/${check_mem}#${check_mem} ${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${check_disk} /${examplesRoot}/myshell/${check_disk}#${check_disk} Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
替换hdfs上原workflow.xml 并上传新的check_disk.sh脚本
$ bin/hdfs dfs -rm /oozie-apps/myshell/workflow.xml
$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/check_disk.sh /oozie-apps/myshell/
提交workflow应用给oozie执行
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -config /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/myshell/job.properties -run
查看两个脚本执行结果
$ tail -f /tmp/mem.log
# tail -f /tmp/disk.log
如何排错:
首先找11000web上的对应的action的提示信息
到oozie安装目录下找logs/oozie.log
案例三
如何调度执行MapReduce任务
配置一个包含MapReduce任务的任务流
1、拷贝模板并修改文件
$ cp -r examples/apps/map-reduce/ myapps/my-map-reduce
$ rm job-with-config-class.properties workflow-with-config-class.xml
job.properties lib workflow.xml
lib – 存放了所要调度执行的MapReduce程序jar包
$ rm lib/oozie-examples-4.1.0-cdh5.14.2.jar
将之前开发过的MapReduce-wordcount jar包上传此lib目录下
2、修改job.properties
nameNode=hdfs://192.168.134.101:8020
jobTracker=192.168.134.101:8032
queueName=default
examplesRoot=oozie-apps
#定义workflow应用在hdfs上的路径
oozie.wf.application.path= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/my-map-reduce
#定义MapReduce程序的hdfs上输出目录
outputdir=/oozie-apps/output/output1
#定义MapReduce程序的输入目录
inputDir=/oozie-apps/inputdir
3、修改workflow.xml
本地造数据并上传到MapReduce-wc的输入目录下
$ vi wc.txt
$ bin/hdfs dfs -mkdir -p /oozie-apps/inputdir
$ bin/hdfs dfs -put wc.txt /oozie-apps/inputdir
4、上传oozie wf应用到hdfs上
$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/my-map-reduce/ /oozie-apps/
5、提交oozie wf应用
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -config /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/my-mr/job.properties -run
其他类型任务的action如何定义
Action Extensions
Email Action
Shell Action
MapReduce Action
Hive Action
Sqoop Action
Ssh Action
DistCp Action
Writing a Custom Action Executor
案例四
如何借助coordinator功能模块周期性定时执行一个workflow任务流
基于时间使用coordinator功能模块时需要进行的配置修改
1、修改本地系统时间及时区
$ date -R 查看时区 应该 +0800
$ sudo rm -rf /etc/localtime
$ sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# ntpdate -u cn.pool.ntp.org
2、修改oozie框架所使用的时区
默认使用的UTC(时间统一协调时)=》改成中国使用 +0800
$ vi conf/oozie-site.xml
oozie.processing.timezone
GMT+0800
3、修改oozie web控制器前端的js时区
$ vi oozie-server/webapps/oozie/oozie-console.js
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
4、重启oozie server
$ bin/oozied.sh stop
$ bin/oozied.sh start
需求:
要求从2020年1月6号12点开始到17点之间,每5分钟检查一次服务器的内存资源及磁盘资源并将检查结果记录到本地的/tmp目录下的日志文件中
(使用coordinator功能模块定义一个coordinator应用,在指定的生命周期内每5分钟执行一次案例二中的workflow应用)
1、拷贝coordinator模板
$ cp -r examples/apps/cron myapps/mycron
coordinator.xml job.properties workflow.xml
coordinator.xml --
用来定义所要执行的的workflow应用所在hdfs上的路径
定义要执行的workflow应用的频率及生命周期
2、删除模板中的workflow.xml文件
因为当前此案例二的脚本及workflow.xml文件已经存在于hdfs的/oozie-apps/myshell
3、修改coordinator应用的job.properties
nameNode=hdfs://192.168.134.101:8020
jobTracker=192.168.134.101:8032
queueName=default
examplesRoot=oozie-apps
oozie.coord.application.path= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/mycron
workflowAppUri= n a m e N o d e / {nameNode}/ nameNode/{examplesRoot}/mycron
check_mem=check_mem.sh
check_disk=check_disk.sh
start=2018-12-4T11:10+0800
end=2018-12-4T17:00+0800
4、修改coordinator.xml
oozie.service.coord.check.maximum.frequency
5、上传coordinator应用到hdfs
$ bin/hdfs dfs -put /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/mycron/ /oozie-apps/
6、提交coordinator应用
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -config /opt/cdh-5.14.2/oozie-4.1.0-cdh5.14.2/myapps/mycron/job.properties -run
7、查看执行情况
http://192.168.134.101:11000/oozie/
查看脚本执行的日志文件
$ bin/oozie job -oozie http://192.168.134.101:11000/oozie -kill 0000000-181204103407182-oozie-beif-C