一、问题引入
问题引入1:什么是工作流调度
按照前面的一个案例,为了完成得出结果的这一件事,我们要完成以下的操作。
数据加载到hive -> 数据的分析 -> sqoop数据结果导出到mysql
每一个操作步骤我们可以看成一个action-job,每一个action-job都可能在不同的时间点完成,比如说凌晨0点完成job1的加载数据,凌晨1点完成数据分析,凌晨2点完成sqoop数据导出:
00(action job-1) 01(action job-2) 02(action job-3) load data MR Sqoop
对于上面不同时间点完成不同的工作,我们不可能人工的每个时间点去执行每个工作,这个样会极大的消耗工作精力和降低工作效率,这时我们需要一个工作流调度框架对上面的工作进行管理,控制每个时间点去执行每个工作任务。
start(时间点) action-1 action-2 action-3 end(任务结束)
问题引入2:为什么需要任务调度框架
在进行数据处理的时候,需要进行数据采集、数据清洗、数据分析等操作,每一个过程都可能涉及到多个步骤,有的需要顺序执行,有的可以并行执行。如何方便,有效的管理这些任务的执行顺序和依赖关系,这就是任务调度框架的作用。
二、常见的几个工作流调度框架
Azkaban
是有Linkedin开源的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种键值对文件格式来建立任务之间的依赖关系,并提供友好的web界面维护和查看工作流。特点:方便的设置任务流;能够杀死并重新启动工作流;工作流和任务的日志记录。
Zeus
是阿里公司开源的任务调度框架。其特点是:方便Hive任务的调试运行;Hive元数据的可视化查询与数据预览。
Linux crontab
是linux的定时任务工具,也可以用来作为简单的任务调度框架。
Oozie
Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,是用来管理Hadoop作业,属于web应用程序,由Oozie client和Oozie Server两个组件构成,Oozie Server运行于Java Servlet容器(Tomcat)中的web程序。
oozie官网:
三、Oozie的功能架构
oozie架构图如下:
oozie包含四大服务组件:
workflow: 用于支持动作有向无环图(DAG)的设计和执行,可以按照特定的顺序执行mr,hive和shell等节点.
coordinator: 用于定时调度特定的 workflow 进行执行,可以基于事件,资源存在,传递参数等自动执行.
bundle: 批量设定一组coordinator执行.
SLA(Service Level Agreement, oozie服务器等级协定): 用于程序执行过程的日志跟踪.
Oozie简易架构:
如上图,oozie调度本身就是一个mr程序,开始,执行,结束或者失败,简单易懂.
所以我们可以思考一下,在oozie调度mr程序时,其实同一时间是运行了两个mr的,一个是调度本身,一个是任务.
一个有向无环图:
任务本身是一个有向无环图(DAG)
图中fork标签后面的 MR job 和 Hive job 是并行执行的,都成功后通过 join 节点合并.
coordinator生命周期:
coordinator是一个定时服务,通过定时来固定频率的执行任务,这里的功能类似crontab.
bundle Job:
bundle的作用就是设定多个coordinator定时服务按批次执行,这样使得多个任务也形成一个DAG.
四、Oozie下载与安装安装
电脑系统:macOS 10.15.4
虚拟机软件:Parallels Desktop14
Hadoop各节点节点操作系统:CentOS 7
JDK版本:jdk1.8.0_162
Hadoop版本:hadoop-2.6.0-cdh5.9.3
Oozie版本:oozie-4.1.0-cdh5.9.3.tar.gz
Ooize CDH版本的下载地址:
https://archive.cloudera.com/cdh5/cdh/5/
Oozie官网:
第一步:安装软件
(1)上传文件
将本机的安装包上传到虚拟机node1,上传方式:
scp 本机的文件绝对路径 caizhengjie@10.211.55.75:/opt/softwares
(2)解压文件
上传成功之后需要对文件赋予权限
chmod u+x oozie-4.1.0-cdh5.9.3.tar.gz
解压文件:
tar -zxvf oozie-4.1.0-cdh5.9.3.tar.gz -C /opt/modules/
创建软链接:
ln -s oozie-4.1.0-cdh5.9.3 oozie
第二步:配置文件
(1)配置core-site.xml文件
在core-site.xml文件中配置如下的两个项目
<property> <name>hadoop.proxyuser.caizhengjie.hosts</name> <value>bigdata-pro-m01</value> </property> <property> <name>hadoop.proxyuser.caizhengjie.groups</name> <value>*</value> </property>
bigdata-pro-m01为安装oozie的那台机器
caizhengjie为用户名
修改完配置文件之后重启Hadoop
(2)解压文件
解压oozie-hadooplibs-4.1.0-cdh5.9.3.tar.gz,放在安装oozie的根目录下
tar -zxvf oozie-hadooplibs-4.1.0-cdh5.9.3.tar.gz -C ../
(3)创建目录
在安装oozie目录下创建一个目录libext/
mkdir libext
(4)拷贝jar包
拷贝hadooplibs/hadooplib-2.6.0-cdh5.5.0.oozie-4.1.0-cdh5.5.0/目录下的的所有jar包和ext-2.2.zip拷贝到libext目录下
[caizhengjie@bigdata-pro-m01 libext]$ cp ../hadooplibs/hadooplib-2.6.0-cdh5.9.3.oozie-4.1.0-cdh5.9.3/* . [caizhengjie@bigdata-pro-m01 libext]$ cp /opt/softwares/ext-2.2.zip .
(5)打成war包
将libext目录下的jar包和ext文件打成war包放到webapp目录下
运行命令:
bin/oozie-setup.sh prepare-war
New Oozie WAR file with added 'ExtJS library, JARs' at /opt/modules/oozie/oozie-server/webapps/oozie.war
(6)上传至HDFS
将oozie-sharelib-4.1.0-cdh5.9.3-yarn.tar.gz上传到hdfs上,默认会自动解压,放在/user/caizhengjie/share/lib/lib_20201102150154目录下
运行命令:
bin/oozie-setup.sh sharelib create -fs hdfs://bigdata-pro-m01:9000 -locallib oozie-sharelib-4.1.0-cdh5.9.3-yarn.tar.gz
(7)创建oozie的DB数据库
创建oozie的DB数据库
运行命令:
bin/ooziedb.sh create -sqlfile oozie.sql -run DB Connection
(8)运行测试
启动oozie进程
bin/oozied.sh start
访问一下web界面:http://bigdata-pro-m01:11000/oozie/,端口默认是11000
五、运行测试一个oozie实例
运行实例的步骤:
1.解压oozie-examples.tar.gz这个文件到安装目录
tar -zxvf oozie-examples.tar.gz
2.上传oozie-examples.tar.gz解压之后的目录文件到HDFS的用户根目录下
bin/hdfs dfs -put /opt/modules/oozie-4.1.0-cdh5.5.0/examples examples
3.修改examples/apps/map-reduce/job.properties的配置:
nameNode=hdfs://bigdata-pro-m01.kfk.com:9000 jobTracker=bigdata-pro-m01.kfk.com:8032
4.运行example
bin/oozie job -oozie http://bigdata-pro-m01:11000/oozie -config examples/apps/map-reduce/job.properties -run
运行oozie workflow相关的文件的说明:
1)workflow.xml 文件 -------这个文件必须放在HDFS上 start -> action(ok,error) -> kill -> end 2)job.properties 文件 --------必须要在本地 属性配置文件,参数提供给workflow.xml文件 3)lib目录 --------必须要在HDFS上 相关的依赖包全部放在lib目录 如果要修改了workflow.xml 文件和lib,就必须重新上传到HDFS,job.properties文件修改了可以不用上传,但必须放在本地目录下
5.查看运行结果
六、出现的问题及解决
遇到问题,可以去查看日志文件,日志文件在
/opt/modules/oozie/logs/oozie.log
问题一:
] JOB[0000000-201102150941677-oozie-caiz-W] ACTION[0000000-201102150941677-oozie-caiz-W@mr-node] Error starting action [mr-node]. ErrorType [FAILED], ErrorCode [It should never happen], Message [File /user/caizhengjie/share/lib does not exist] org.apache.oozie.action.ActionExecutorException: File /user/caizhengjie/share/lib does not exist at org.apache.oozie.action.hadoop.JavaActionExecutor.addSystemShareLibForAction(JavaActionExecutor.java:728) at org.apache.oozie.action.hadoop.JavaActionExecutor.addAllShareLibs(JavaActionExecutor.java:806) at org.apache.oozie.action.hadoop.JavaActionExecutor.setLibFilesArchives(JavaActionExecutor.java:797) at org.apache.oozie.action.hadoop.JavaActionExecutor.submitLauncher(JavaActionExecutor.java:1052) at org.apache.oozie.action.hadoop.JavaActionExecutor.start(JavaActionExecutor.java:1315) at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:232) at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:63) at org.apache.oozie.command.XCommand.call(XCommand.java:286) at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:332) at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:261) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.oozie.service.CallableQueueService$CallableWrapper.run(CallableQueueService.java:179) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
这是因为没有找到HDFS上这个文件/user/caizhengjie/share/lib
,需要在配置文件中添加
解决方法:
在oozie-site.xml文件中添加如下的属性项
<property> <name>oozie.service.HadoopAccessorService.hadoop.configurations</name> <value>*=/opt/modules/hadoop/etc/hadoop</value> </property>
再次重新启动oozie
bin/oozied.sh stop bin/oozied.sh start
再次运行
bin/oozie job -oozie http://bigdata-pro-m01:11000/oozie -config examples/apps/map-reduce/job.properties -run
问题二:
http://wiki.apache.org/hadoop/ConnectionRefused] org.apache.oozie.action.ActionExecutorException: JA006: Call From bigdata-pro-m03.kfk.com/192.168.5.103 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused at org.apache.oozie.action.ActionExecutor.convertExceptionHelper(ActionExecutor.java:454)
这是因为oozie安装的节点没有连到jobhistoryserver的地址
解决方法:
1.启动jobhistoryserver
2.在core-site.xml文件中添加如下的属性项
<property> <name>mapreduce.jobhistory.address</name> <value>bigdata-pro-m01.kfk.com:10020</value> </property>