任务调度框架Oozie学习笔记

目录

1.  工作流调度框架Oozie功能初步认识

2.  几种调度框架讲解

3.  Oozie 功能架构及三大Server讲解

4.  Oozie安装部署

5.   Oozie案例运行MapReduce Wordflow讲解

6.  如何定义OoozieWorkflow讲解

7.  Oozie Workflow中MapReduce Action定义讲解

8.  编写OozieWorkflow的MapReduceAction并运行

9.  WorkFlow中Hive Action使用案例讲解

10.  Oozie WorkFlow中Sqoop Action使用案例讲解

11.  Oozie WorkFlow中Shell Action使用案例讲解

12.  Oozie Coordinator调度讲解及系统时区配置与定时触发两种配置方式

13.  Oozie Coordinator配置定时触发案例演示

14.  Oozie Coordinator配置调度MapReduce WordCount程序

15.  Oozie企业使用案例(Hive Action、Sqoop Actoion及定时调度)

16.  Oozie中Coordinator中的数据可用性及Bundle讲解


 

 

1.  工作流调度框架Oozie功能初步认识

 

任务调度框架Oozie学习笔记_第1张图片

 

 

2.  几种调度框架讲解

 

任务调度框架Oozie学习笔记_第2张图片

 

Linux Crontab:

针对每个用户而言的

任务调度框架Oozie学习笔记_第3张图片

任务调度框架Oozie学习笔记_第4张图片

任务调度框架Oozie学习笔记_第5张图片

 

实例:

每分钟写一次日期到bf-date.log

任务调度框架Oozie学习笔记_第6张图片

 

任务调度框架Oozie学习笔记_第7张图片

缺点:不能回滚、不易管理

 

Azkaban:

比Oozie简单,但是功能有限。

任务调度框架Oozie学习笔记_第8张图片

 

Oozie:

多用于数据仓库、ETL;但是使用困难。

任务调度框架Oozie学习笔记_第9张图片

 

Zeus:

阿里、一号店在用;增加了监控界面;使用简单。

任务调度框架Oozie学习笔记_第10张图片

 

 

3.  Oozie 功能架构及三大Server讲解

 

任务调度框架Oozie学习笔记_第11张图片

 

任务调度框架Oozie学习笔记_第12张图片

 

任务调度框架Oozie学习笔记_第13张图片

 

任务调度框架Oozie学习笔记_第14张图片

 

任务调度框架Oozie学习笔记_第15张图片

 

任务调度框架Oozie学习笔记_第16张图片

 

任务调度框架Oozie学习笔记_第17张图片

(coordinator也是一个任务,封装了workflow,设置开始和结束时间。)

 

任务调度框架Oozie学习笔记_第18张图片

bundle绑定了多个coordinator,可批量停止、挂起、关闭、开启。Oozie独有的功能。

 

 

4.  Oozie安装部署

 

如果需要编译安装,可查看官网文档的quick start:

任务调度框架Oozie学习笔记_第19张图片

任务调度框架Oozie学习笔记_第20张图片

 

 

安装cdh版本:

①  在core-site.xml中添加代理用户

任务调度框架Oozie学习笔记_第21张图片

任务调度框架Oozie学习笔记_第22张图片


   
   
   
   
  1. <property>
  2.        <name>hadoop.proxyuser.root.hosts name>
  3. <value>* value>
  4. property>
  5. <property>
  6. <name>hadoop.proxyuser.root.groups name>
  7. <value>* value>
  8. property>

 

②  解压oozie-hadooplibs-4.1.0-cdh5.13.0.tar.gz 

任务调度框架Oozie学习笔记_第23张图片

任务调度框架Oozie学习笔记_第24张图片

任务调度框架Oozie学习笔记_第25张图片

 

③  创建libext目录,并放入mapreduce2的jar包

任务调度框架Oozie学习笔记_第26张图片

任务调度框架Oozie学习笔记_第27张图片

④  准备war包:将jar包添加到war包中供tomcat使用

任务调度框架Oozie学习笔记_第28张图片

任务调度框架Oozie学习笔记_第29张图片

任务调度框架Oozie学习笔记_第30张图片

 

⑤  将oozie支持的组件jar包上传到hdfs上

任务调度框架Oozie学习笔记_第31张图片

任务调度框架Oozie学习笔记_第32张图片

任务调度框架Oozie学习笔记_第33张图片

任务调度框架Oozie学习笔记_第34张图片

如果出现异常:

任务调度框架Oozie学习笔记_第35张图片

解决:关闭安全模式

任务调度框架Oozie学习笔记_第36张图片

⑥  修改oozie使用的数据库

默认使用的是derby数据库(在实际生产环境中使用的是mysql):

任务调度框架Oozie学习笔记_第37张图片

 

修改后:

任务调度框架Oozie学习笔记_第38张图片


   
   
   
   
  1. <property>
  2. <name>oozie.service.JPAService.jdbc.driver name>
  3. <value>com.mysql.jdbc.Driver value>
  4. property>
  5. <property>
  6. <name>oozie.service.JPAService.jdbc.url name>
  7. <value>jdbc:mysql://localhost:3306/oozie?createDatabaseIfNotExist=true value>
  8. property>
  9. <property>
  10. <name>oozie.service.JPAService.jdbc.username name>
  11. <value>root value>
  12. property>
  13. <property>
  14. <name>oozie.service.JPAService.jdbc.password name>
  15. <value>123456 value>
  16. property>

 

重启oozie后,查看日志,发现异常:

 

任务调度框架Oozie学习笔记_第39张图片

将mysql驱动放入libext和lib中,重新准备war包:

如果在启动时出现已启动,或者关闭时找不到pid,删除原来的pid文件:

[root@hadoop-senior oozie-4.1.0-cdh5.13.0]# rm -f oozie-server/temp/oozie.pid

重新add jar包  

[root@hadoop-senior oozie-4.1.0-cdh5.13.0]# bin/oozie-setup.sh prepare-war

 

重新生成sql脚本:

 

[root@hadoop-senior oozie-4.1.0-cdh5.13.0]# bin/ooziedb.sh create -sqlfile oozie.sql -run DB Connection

 

查看mysql: 

 

任务调度框架Oozie学习笔记_第40张图片

 

⑦  创建oozie需要使用的sql脚本(如果第⑥步执行过了就跳过)

任务调度框架Oozie学习笔记_第41张图片

查看脚本:

任务调度框架Oozie学习笔记_第42张图片

任务调度框架Oozie学习笔记_第43张图片

 

⑧  启动oozie守护进程(其实就是启动tomcat):

任务调度框架Oozie学习笔记_第44张图片

任务调度框架Oozie学习笔记_第45张图片

任务调度框架Oozie学习笔记_第46张图片

 

查看日志,如果出现如下异常:

任务调度框架Oozie学习笔记_第47张图片

(说明oozie读取的是本地路径,而不是hdfs路径)

 

解决:在oozie-site.xml中配置hadoop的配置文件路径

任务调度框架Oozie学习笔记_第48张图片

任务调度框架Oozie学习笔记_第49张图片


   
   
   
   
  1. <property>
  2. <name>oozie.service.HadoopAccessorService.hadoop.configurations name>
  3. <value>*=/opt/cdh5.13.0/hadoop-2.6.0-cdh5.13.0/etc/hadoop value>
  4. property>

 

⑨  查看:

 

任务调度框架Oozie学习笔记_第50张图片

会发现,需要extjs library,可在oozie文档中点击下载:

任务调度框架Oozie学习笔记_第51张图片

任务调度框架Oozie学习笔记_第52张图片

关闭oozie后进行如下操作:

任务调度框架Oozie学习笔记_第53张图片

任务调度框架Oozie学习笔记_第54张图片

开启oozie:

任务调度框架Oozie学习笔记_第55张图片

 

 

5.   Oozie案例运行MapReduce Wordflow讲解

 

任务调度框架Oozie学习笔记_第56张图片

任务调度框架Oozie学习笔记_第57张图片

①  解压oozie-examples.tar.gz

任务调度框架Oozie学习笔记_第58张图片

任务调度框架Oozie学习笔记_第59张图片

 

②  将解压的案例上传到hdfs

[root@hadoop-senioroozie-4.1.0-cdh5.13.0]# hdfs dfs -put examples examples

(不写绝对路径,默认的是用户的主目录。例如:/user/root/)

任务调度框架Oozie学习笔记_第60张图片

 

③ 修改job.properties

先看本机的程序运行的主机和端口和job.properties中的是否一致

job.properties:

本机:

任务调度框架Oozie学习笔记_第61张图片

修改job.properties:

修改前

任务调度框架Oozie学习笔记_第62张图片

修改后

任务调度框架Oozie学习笔记_第63张图片

(workflow.xml必须在hdfs上,因为整个集群要访问)

 

④  运行案例程序

任务调度框架Oozie学习笔记_第64张图片

任务调度框架Oozie学习笔记_第65张图片

 任务调度框架Oozie学习笔记_第66张图片

 

[root@hadoop-senior oozie-4.1.0-cdh5.13.0]# bin/oozie job -oozie http://localhost:11000/oozie -config examples/apps/map-reduce/job.properties -run

 

(如果设置了OOZIE_URL如:exportOOZIE_URL= http://localhost:11000/oozie可直接bin/oozie job -configexamples/apps/map-reduce/job.properties -run)

 

 

为什么是两个mapreduce?oozie本身就是一个mapreduce,而程序也是一个mapreduce。

 

注意:如果运行了该程序,yarn8088端口查看,mapreduce无反应,且oozie界面,mapreduce一直是running状态:

任务调度框架Oozie学习笔记_第67张图片查看程序运行状态仍然是running

任务调度框架Oozie学习笔记_第68张图片

引出异常unhealthy node:

任务调度框架Oozie学习笔记_第69张图片

任务调度框架Oozie学习笔记_第70张图片

 

解决:原因就是磁盘的空间太满了,跟yarn-site.xml中的以下配置有关:

任务调度框架Oozie学习笔记_第71张图片


   
   
   
   
  1. <property>
  2.      <name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage name>
  3.      <value>98.5 value> //默认是90
  4. property>

你可以清理磁盘空间,或者你可以暂时的吧这个使用率调大,但是这不是解决问题的根本,最好是清理磁盘空间或扩展。

异常2:如果没有unhealthy node ,yarn 8088页面显示mapreduce运行成功,但是oozie仍然是running,最后SUSPENDED (但是运行成功),说明分配的资源不够。

任务调度框架Oozie学习笔记_第72张图片

解决:调整Memory Total和VCores Total。

 

⑤  查看

任务调度框架Oozie学习笔记_第73张图片

查看程序运行状态:

任务调度框架Oozie学习笔记_第74张图片

 

 

6.  如何定义OoozieWorkflow讲解

 

任务调度框架Oozie学习笔记_第75张图片

任务调度框架Oozie学习笔记_第76张图片

任务调度框架Oozie学习笔记_第77张图片

任务调度框架Oozie学习笔记_第78张图片

任务调度框架Oozie学习笔记_第79张图片

 

 

 

7.  Oozie Workflow中MapReduce Action定义讲解

 

任务调度框架Oozie学习笔记_第80张图片

 

 

 

 

任务调度框架Oozie学习笔记_第81张图片

(oozie不用创建driver,直接配置属性就行)

 

 

8.  编写OozieWorkflow的MapReduceAction并运行

 

任务调度框架Oozie学习笔记_第82张图片

任务调度框架Oozie学习笔记_第83张图片

 

① 复制修改example中的实例

任务调度框架Oozie学习笔记_第84张图片 任务调度框架Oozie学习笔记_第85张图片


   
   
   
   
  1. nameNode=hdfs://hadoop-senior:8020
  2. jobTracker=hadoop-senior:8032
  3. queueName=default
  4. examplesRoot=examples
  5. //下面这个路径的xml可不指定,不指定的话系统会自动去该目录下找
  6. oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/map-reduce/workflow.xml
  7. outputDir=map-reduce

任务调度框架Oozie学习笔记_第86张图片


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">
  2. <start to="mr-node"/>
  3. <action name="mr-node">
  4. <map-reduce>
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <prepare>
  8. <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}"/>
  9. prepare>
  10. <configuration>
  11. <property>
  12. <name>mapred.job.queue.name name>
  13. <value>${queueName} value>
  14. property>
  15. <property>
  16. <name>mapred.mapper.class name>
  17. <value>org.apache.oozie.example.SampleMapper value>
  18. property>
  19. <property>
  20. <name>mapred.reducer.class name>
  21. <value>org.apache.oozie.example.SampleReducer value>
  22. property>
  23. <property>
  24. <name>mapred.map.tasks name>
  25. <value>1 value>
  26. property>
  27. <property>
  28. <name>mapred.input.dir name>
  29. <value>/user/${wf:user()}/${examplesRoot}/input-data/text value>
  30. property>
  31. <property>
  32. <name>mapred.output.dir name>
  33. <value>/user/${wf:user()}/${examplesRoot}/output-data/${outputDir} value>
  34. property>
  35. configuration>
  36. map-reduce>
  37. <ok to="end"/>
  38. <error to="fail"/>
  39. action>
  40. <kill name="fail">
  41. <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  42. kill>
  43. <end name="end"/>
  44. workflow-app>

因为案例中的是mapreduce1所以要修改成mapreduce2,方法1:在hadoop xml文档中查找,方法2:在yarn的History-->Configuration页面查找(这种方法是你运行的job中设置的有才会找到)。

任务调度框架Oozie学习笔记_第87张图片

(Oozie默认调用的是老的mapreduce,所以开启新的mapredce(设置为true),否则会报错

任务调度框架Oozie学习笔记_第88张图片

)

任务调度框架Oozie学习笔记_第89张图片

任务调度框架Oozie学习笔记_第90张图片

……

 

修改后如下图:

job.properties  

nameNode=hdfs://hadoop-senior:8020
jobTracker=hadoop-senior:8032
queueName=default
//这里设置值,以供workflow.xml引用
//设置路径时,前后最好都不要加/,避免在写路径时不知道该不该加/
oozieAppsRoot=user/root/oozie-apps
oozieDataRoot=user/root/oozie/datas

oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/mr-wordcount-wf/workflow.xml
inputDir=mr-wordcount-wf/input
outputDir=mr-wordcount-wf/output

 

workflow.xml


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="mr-wordcount-wf">
  2. //名称设置不要超过20个字符
  3. <start to="mr-node-wordcount"/>
  4. <action name="mr-node-wordcount">
  5. <map-reduce>
  6. <job-tracker>${jobTracker} job-tracker>
  7. <name-node>${nameNode} name-node>
  8. <prepare>
  9. <delete path="${nameNode}/${oozieAppsRoot}/${outputDir}"/>
  10. prepare>
  11. //整体设置和java代码中设置job的步骤一致。
  12. <configuration>
  13. <property>
  14. <name>mapred.mapper.new-api name>
  15. <value>true value>
  16. property>
  17. <property>
  18. <name>mapred.reducer.new-api name>
  19. <value>true value>
  20. property>
  21. <property>
  22. <name>mapreduce.job.queuename name>
  23. <value>${queueName} value>
  24. property>
  25. <property>
  26. <name>mapreduce.job.map.class name>
  27. <value> com.zhuyu.mapreduce.WordCount$WordCountMapper value>
  28. property>
  29. <property>
  30. <name>mapreduce.job.reduce.class name>
  31. <value> com.zhuyu.mapreduce.WordCount$WordCountReducer value>
  32. property>
  33. //当map的输入输出和reduce的输入输出一致,可不用设置map的输入输出
  34. <property>
  35. <name>mapreduce.map.output.key.class name>
  36. <value>org.apache.hadoop.io.Text value>
  37. property>
  38. <property>
  39. <name>mapreduce.map.output.value.class name>
  40. <value>org.apache.hadoop.io.IntWritable value>
  41. property>
  42. <property>
  43. <name>mapreduce.job.output.key.class name>
  44. <value>org.apache.hadoop.io.Text; value>
  45. property>
  46. <property>
  47. <name>mapreduce.job.output.value.class name>
  48. <value>org.apache.hadoop.io.IntWritable value>
  49. property>
  50. // 默认多少个块就有多少个mapreduce,所以删除
  51. <property>
  52. <name>mapreduce.input.fileinputformat.inputdir name>
  53. <value>${nameNode}/${oozieDatasRoot}/${inputDir} value>
  54. property>
  55. <property>
  56. <name>mapreduce.output.fileoutputformat.outputdir name>
  57. <value>${nameNode}/${oozieAppsRoot}/${outputDir} value>
  58. property>
  59. configuration>
  60. map-reduce>
  61. <ok to="end"/>
  62. <error to="fail"/>
  63. action>
  64. <kill name="fail">
  65. <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  66. kill>
  67. <end name="end"/>
  68. workflow-app>

(千万不要有注释,否则会出错)

 

②  将自己编写的mapreduce jar包放在lib目录下

任务调度框架Oozie学习笔记_第91张图片

③  将程序放到hdfs上,并准备input数据

[root@hadoop-senioroozie-4.1.0-cdh5.13.0]# hdfs dfs -put oozie-apps/ oozie-apps

任务调度框架Oozie学习笔记_第92张图片

任务调度框架Oozie学习笔记_第93张图片

任务调度框架Oozie学习笔记_第94张图片

 

④  运行程序

YARN:

任务调度框架Oozie学习笔记_第95张图片

(如果出错查看logs/oozie.log日志)

 

OOZIE:

任务调度框架Oozie学习笔记_第96张图片

 

输出文件:

任务调度框架Oozie学习笔记_第97张图片

任务调度框架Oozie学习笔记_第98张图片

 

 

 

9.  WorkFlow中Hive Action使用案例讲解

 

文档:

http://hadoop-senior:11000/oozie/docs/DG_HiveActionExtension.html

 

①  复制案例到oozie-apps下

任务调度框架Oozie学习笔记_第99张图片

 

②  修改job.properties

任务调度框架Oozie学习笔记_第100张图片


   
   
   
   
  1. nameNode=hdfs: //hadoop-senior:8020
  2. jobTracker=hadoop-senior: 8032
  3. queueName= default
  4. oozieAppsRoot=user/root/oozie-apps
  5. oozieDatasRoot=user/root/oozie/datas
  6. oozie.use.system.libpath= true
  7. // xml可指定可不指定,不指定的话会自动在该目录下找
  8. oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/hive- select/
  9. outputDir=hive- select/output

②  将hive配置文件复制到hive-select目录下(为⑤做铺垫)

 

③  创建lib目录,将mysql驱动放入

 

 

④  修改hive脚本文件(为⑤做铺垫)

[root@hadoop-senior hive-select]# mv script.q select-emp.sql
   
   
   
   

任务调度框架Oozie学习笔记_第101张图片

 

⑤  修改workflow.xml


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="wf-hive-select">
  2. <start to="hive-node"/>
  3. <action name="hive-node">
  4. <hive xmlns="uri:oozie:hive-action:0.2">
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <prepare>
  8. <delete path="${nameNode}/${oozieAppsRoot}/${outputDir}"/>
  9. prepare>
  10. <job-xml>${nameNode}/${oozieAppsRoot}/hive-select/hive-site.xml job-xml>
  11. <configuration>
  12. <property>
  13. <name>mapred.job.queue.name name>
  14. <value>${queueName} value>
  15. property>
  16. configuration>
  17. <script> select-emp.sql script>
  18. <param>OUTPUT=${nameNode}/${oozieAppsRoot}/${outputDir} param>
  19. hive>
  20. <ok to="end"/>
  21. <error to="fail"/>
  22. action>
  23. <kill name="fail">
  24. <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  25. kill>
  26. <end name="end"/>
  27. workflow-app>

 

查看是否使用的是新的api:使用hive运行一个mapreduce语句,例如select count(1) from emp;然后在yarn web页面查看。

任务调度框架Oozie学习笔记_第102张图片

(所以使用的是旧的api)

 

要添加属性以加载hive配置文件:

任务调度框架Oozie学习笔记_第103张图片

 

否则会出现以下异常:

任务调度框架Oozie学习笔记_第104张图片

任务调度框架Oozie学习笔记_第105张图片

 

如果在运行oozie任务时,oozie服务强制关闭了,但是查不到错误?

方法一:但是yarn web页面查看任务完成了,说明资源的问题,在重新运行前,jps查看服务,kill掉占用资源的任务。

方法二:workflow.xml内路径配置错误,查看yarn日志和oozie.log。

方法三:磁盘容量不足,清理磁盘(df –lh查看)。

情况四:重启虚拟机。

 

杀死oozie任务:

[root@hadoop-senior oozie-4.1.0-cdh5.13.0]# bin/oozie job -kill 0000000-180128225452391-oozie-root-W
   
   
   
   

⑥  运行


   
   
   
   
  1. export OOZIE_URL=http: //hadoop-senior:11000/oozie/
  2. bin/oozie job --config oozie-apps/hive- select/job.properties -run

⑦  查看:

任务调度框架Oozie学习笔记_第106张图片

任务调度框架Oozie学习笔记_第107张图片

任务调度框架Oozie学习笔记_第108张图片

 

 

 

 

10.  Oozie WorkFlow中Sqoop Action使用案例讲解

 

① 复制样本案例

任务调度框架Oozie学习笔记_第109张图片

db.hsqldb.properties属性文件

db.hsqldb.script脚本文件

二者都可删除

 

②  在sqoop-import-emp下创建lib,并将mysql驱动放入

cp /opt/software/mysql-connector-java-5.1.32-bin.jar oozie-apps/sqoop-import-emp/lib/

 

③ 测试是老api还是新api

在mysql中建表:


   
   
   
   
  1. create table `my_user`(
  2. `id` tinyint( 4) not null auto_increment,
  3. `acount` varchar( 255) default null,
  4. `password` varchar( 255) default null,
  5. primary key( `id`)
  6. );
  7. insert into `my_user` values( '1', 'admin', 'admin');
  8. insert into `my_user` values( '2', 'pu', 'pu');
  9. insert into `my_user` values( '3', 'system', 'system');
  10. insert into `my_user` values( '4', 'zxh', 'zxh');
  11. insert into `my_user` values( '5', 'test', 'test');
  12. insert into `my_user` values( '6', 'pudong', 'pudong');

将mysql中的数据导入到hdfs:


   
   
   
   
  1. bin/sqoop import \
  2. --connect jdbc:mysql://hadoop-senior:3306/test \
  3. --username root \
  4. --password 123456 \
  5. --table my_user \
  6. --target-dir /user/root/oozie/datas/sqoop-import-user/output \
  7. --num-mappers 1

任务调度框架Oozie学习笔记_第110张图片

任务调度框架Oozie学习笔记_第111张图片

 

④  修改job.properties


   
   
   
   
  1. nameNode=hdfs: //hadoop-senior:8020
  2. jobTracker=hadoop-senior: 8032
  3. queueName= default
  4. oozieAppsRoot=user/root/oozie-apps
  5. oozieDatasRoot=user/root/oozie/datas
  6. oozie.use.system.libpath= true
  7. oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/sqoop- import-emp/
  8. outputDir=sqoop- import-emp/output

 

⑤  修改workflow.xml


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="sqoop-wf">
  2. <start to="sqoop-node"/>
  3. <action name="sqoop-node">
  4. <sqoop xmlns="uri:oozie:sqoop-action:0.2">
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <prepare>
  8. <delete path="${nameNode}/${oozieAppsRoot}/${outputDir}"/>
  9. prepare>
  10. <configuration>
  11. <property>
  12. <name>mapreduce.job.queuename name>
  13. <value>${queueName} value>
  14. property>
  15. configuration>
  16. // 命令前不需要sqoop
  17. // 可通过--fields-terminated-by "分隔符" 进行字段分割
  18. <command>import --connect jdbc:mysql://hadoop-senior:3306/test --username root --password 123456 --table my_user --target-dir ${nameNode}/${oozieAppsRoot}/${outputDir} --num-mappers 1 command>
  19. sqoop>
  20. <ok to="end"/>
  21. <error to="fail"/>
  22. action>
  23. <kill name="fail">
  24. <message>Sqoop failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  25. kill>
  26. <end name="end"/>
  27. workflow-app>

⑥  运行


   
   
   
   
  1. [root@hadoop-senior oozie- 4.1. 0-cdh5. 13.0] # export OOZIE_URL=http://hadoop-senior:11000/oozie/
  2. [root@hadoop-senior oozie- 4.1. 0-cdh5. 13.0] # bin/oozie job -config oozie-apps/sqoop-import-emp/job.properties –run

⑦ 复制样本案例

任务调度框架Oozie学习笔记_第112张图片

任务调度框架Oozie学习笔记_第113张图片

任务调度框架Oozie学习笔记_第114张图片

任务调度框架Oozie学习笔记_第115张图片

 

⑧  可能出现的异常

异常(没有放置mysql驱动包/驱动包版本问题):

任务调度框架Oozie学习笔记_第116张图片

 

补充:

1. 将分隔符设定为$$$

任务调度框架Oozie学习笔记_第117张图片

查看运行结果后发现格式并不正确

任务调度框架Oozie学习笔记_第118张图片

应将单引号变为双引号

任务调度框架Oozie学习笔记_第119张图片

任务调度框架Oozie学习笔记_第120张图片

--fields-terminated-by "$"
   
   
   
   

2.  可通过sqoop脚本文件来执行

脚本文件:

任务调度框架Oozie学习笔记_第121张图片

脚本文件上传到hdfs上(暂未解决):

任务调度框架Oozie学习笔记_第122张图片

任务调度框架Oozie学习笔记_第123张图片

任务调度框架Oozie学习笔记_第124张图片

 

脚本文件在本地(暂未解决):

任务调度框架Oozie学习笔记_第125张图片

任务调度框架Oozie学习笔记_第126张图片

 

3.  可替换为

任务调度框架Oozie学习笔记_第127张图片

 

任务调度框架Oozie学习笔记_第128张图片

任务调度框架Oozie学习笔记_第129张图片


   
   
   
   
  1. <arg>import arg>
  2. <arg>--connect arg>
  3. <arg>jdbc:mysql://hadoop-senior:3306/test arg>
  4. <arg>--username arg>
  5. <arg>root arg>
  6. <arg>--password arg>
  7. <arg>123456 arg>
  8. <arg>--table arg>
  9. <arg>my_user arg>
  10. <arg>--target-dir arg>
  11. <arg>${nameNode}/${oozieAppsRoot}/${outputDir} arg>
  12. <arg>--fields-terminated-by arg>
  13. <arg>"\t" arg>
  14. <arg>--num-mappers arg>
  15. <arg>1 arg>

任务调度框架Oozie学习笔记_第130张图片

任务调度框架Oozie学习笔记_第131张图片

任务调度框架Oozie学习笔记_第132张图片

任务调度框架Oozie学习笔记_第133张图片

 

11.  Oozie WorkFlow中Shell Action使用案例讲解

 

①  拷贝shell样本案例

 

②  编写shell脚本和hive脚本

hive脚本:

任务调度框架Oozie学习笔记_第134张图片


   
   
   
   
  1. insert overwrite directory
  2. '/user/root/oozie-apps/shell-hive-select/output'
  3. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  4. select
  5. empno,ename,job
  6. from default.emp;


shell脚本:

任务调度框架Oozie学习笔记_第135张图片


   
   
   
   
  1. #!/usr/bin/env bash
  2. ## student select
  3. /opt/cdh5.13.0/hive-1.1.0-cdh5.13.0/bin/hive -f emp-select.sql

③  修改job.properties


   
   
   
   
  1. nameNode=hdfs: //hadoop-senior:8020
  2. jobTracker=hadoop-senior: 8032
  3. queueName= default
  4. oozieAppsRoot=user/root/oozie-apps
  5. oozieDatasRoot=user/root/oozie/datas
  6. oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/shell-hive- select
  7. exec=emp- select.sh
  8. script=emp- select.sql

④  修改workflow.xml

修改前:


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="shell-wf">
  2. <start to="shell-node"/>
  3. <action name="shell-node">
  4. <shell xmlns="uri:oozie:shell-action:0.2">
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <configuration>
  8. <property>
  9. <name>mapred.job.queue.name name>
  10. <value>${queueName} value>
  11. property>
  12. configuration>
  13. <exec>echo exec>
  14. <argument>my_output=Hello Oozie argument>
  15. <capture-output/>
  16. shell>
  17. <ok to="check-output"/>
  18. <error to="fail"/>
  19. action>
  20. <decision name="check-output">
  21. <switch>
  22. <case to="end">
  23. ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
  24. case>
  25. <default to="fail-output"/>
  26. switch>
  27. decision>
  28. <kill name="fail">
  29. <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  30. kill>
  31. <kill name="fail-output">
  32. <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}] message>
  33. kill>
  34. <end name="end"/>
  35. workflow-app>

修改后:


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="shell-wf">
  2. <start to="shell-node"/>
  3. <action name="shell-node">
  4. <shell xmlns="uri:oozie:shell-action:0.2">
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <configuration>
  8. <property>
  9. <name>mapred.job.queue.name name>
  10. <value>${queueName} value>
  11. property>
  12. configuration>
  13. // shell脚本名称
  14. <exec>${exec} exec>
  15. // 将shell脚本和hive脚本放到计算节点当前的工作目录
  16. // 前面的是shell脚本在hdfs的路径,#${exec}代表是该路径的简称
  17. <file>${nameNode}/${oozieAppsRoot}/shell-hive-select/${exec}#${exec} file>
  18. <file>${nameNode}/${oozieAppsRoot}/shell-hive-select/${script}#${script} file>
  19. <capture-output/>
  20. shell>
  21. <ok to="end"/>
  22. <error to="fail"/>
  23. action>
  24. <kill name="fail">
  25. <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  26. kill>
  27. <end name="end"/>
  28. workflow-app>
(本例中不使用<job-xml>是因为在shell脚本中使用的hive命令会自动在hive配置文件目录下寻找配置文件)
   
   
   
   

 

为什么要使用

任务调度框架Oozie学习笔记_第136张图片

 

任务调度框架Oozie学习笔记_第137张图片

nm-local-dir是namenode的本地目录,是分布式缓存文件,mapreduce在运行的时候会自动将文件从hdfs拷贝到这里。的作用是将文件手动拷贝到该目录下,否则系统不会将文件拷贝到这里。

 

标签要有序:

任务调度框架Oozie学习笔记_第138张图片

 

 

⑤  运行


   
   
   
   
  1. [root@hadoop-senior oozie- 4.1. 0-cdh5. 13.0] # export OOZIE_URL=http://hadoop-senior:11000/oozie/
  2. [root@hadoop-senior oozie- 4.1. 0-cdh5. 13.0] # bin/oozie job -config /opt/cdh5.13.0/oozie-4.1.0-cdh5.13.0/oozie-apps/shell-hive-select/job.properties -run

 

⑥ 查看

任务调度框架Oozie学习笔记_第139张图片

任务调度框架Oozie学习笔记_第140张图片

任务调度框架Oozie学习笔记_第141张图片

任务调度框架Oozie学习笔记_第142张图片

 

 

12.  Oozie Coordinator调度讲解及系统时区配置与定时触发两种配置方式

 

任务调度框架Oozie学习笔记_第143张图片

 

任务调度框架Oozie学习笔记_第144张图片

任务调度框架Oozie学习笔记_第145张图片

( -代表西,+代表东;为什么是4位?两位是时,两位是分 )

 

修改时区:

查看时区文件:

任务调度框架Oozie学习笔记_第146张图片

任务调度框架Oozie学习笔记_第147张图片

任务调度框架Oozie学习笔记_第148张图片

 

修改oozie时区:

任务调度框架Oozie学习笔记_第149张图片

 

查看oozie使用的时区:

任务调度框架Oozie学习笔记_第150张图片

 

修改oozie运行时的时区:

查看默认的时区

任务调度框架Oozie学习笔记_第151张图片

在oozie-site.xml中设置

任务调度框架Oozie学习笔记_第152张图片

修改oozie控制台显示的时区:

方法一:

任务调度框架Oozie学习笔记_第153张图片

 

方法二:

任务调度框架Oozie学习笔记_第154张图片

(改完之后不用重启oozie服务,但是浏览器必须要清楚缓存)

 

任务调度框架Oozie学习笔记_第155张图片

任务调度框架Oozie学习笔记_第156张图片

 

清除oozie缓存:

任务调度框架Oozie学习笔记_第157张图片

 

异常:oozie控制台不能使用

任务调度框架Oozie学习笔记_第158张图片

解决:ExtJS library出现异常,重新prepare war包

[root@hadoop-senior oozie-4.1.0-cdh5.13.0]# bin/oozie-setup.sh prepare-war
   
   
   
   

 

13.  Oozie Coordinator配置定时触发案例演示

 

①  拷贝样本案例

任务调度框架Oozie学习笔记_第159张图片

 

②  修改job.properties

修改前:


   
   
   
   
  1. nameNode=hdfs://localhost:8020
  2. jobTracker=localhost:8021
  3. queueName=default
  4. examplesRoot=examples
  5. oozie.coord.application.path= ${nameNode}/user/ ${user.name}/ ${examplesRoot}/apps/cron-schedule
  6. start=2010-01-01T00:00Z
  7. end=2010-01-01T01:00Z
  8. workflowAppUri= ${nameNode}/user/ ${user.name}/ ${examplesRoot}/apps/cron-schedule

修改后:


   
   
   
   
  1. nameNode=hdfs: //hadoop-senior:8020
  2. jobTracker=hadoop-senior: 8032
  3. queueName= default
  4. oozieAppsRoot=user/root/oozie-apps
  5. oozieDatasRoot=user/root/oozie/datas
  6. // 调度文件
  7. oozie.coord.application.path=$ {nameNode}/$ {oozieAppsRoot}/cron-schedule
  8. // 任务开始和结束的时间
  9. start= 2018- 01- 31T21: 25+ 0800
  10. end= 2018- 01- 31T21: 28+ 0800
  11. // 工作流文件
  12. workflowAppUri=$ {nameNode}/$ {oozieAppsRoot}/cron-schedule

 

③ 修改workflow.xml

不做任务,只是测试任务调度


   
   
   
   
  1. // 根据官网查看最新版本
  2. <workflow-app xmlns="uri:oozie:workflow:0.5" name="no-op-wf">
  3. <start to="end"/>
  4. <end name="end"/>
  5. workflow-app>

④ 修改coordinator.xml

修改前:


   
   
   
   
  1. <coordinator-app name="cron-coord" frequency="0/10 * * * *" start="${start}" end="${end}" timezone="UTC"
  2. xmlns= "uri:oozie:coordinator:0.2">
  3. <action>
  4. <workflow>
  5. <app-path>${workflowAppUri} app-path>
  6. <configuration>
  7. <property>
  8. <name>jobTracker name>
  9. <value>${jobTracker} value>
  10. property>
  11. <property>
  12. <name>nameNode name>
  13. <value>${nameNode} value>
  14. property>
  15. <property>
  16. <name>queueName name>
  17. <value>${queueName} value>
  18. property>
  19. configuration>
  20. workflow>
  21. action>
  22. coordinator-app>

修改后:


   
   
   
   
  1. <coordinator-app name="cron-coord" frequency="${coord:minutes(1)}"
  2. start= "${start}" end= "${end}" timezone= "GMT+0800"
  3. xmlns= "uri:oozie:coordinator:0.4">
  4. <action>
  5. <workflow>
  6. <app-path>${workflowAppUri} app-path>
  7. <configuration>
  8. <property>
  9. <name>jobTracker name>
  10. <value>${jobTracker} value>
  11. property>
  12. <property>
  13. <name>nameNode name>
  14. <value>${nameNode} value>
  15. property>
  16. <property>
  17. <name>queueName name>
  18. <value>${queueName} value>
  19. property>
  20. configuration>
  21. workflow>
  22. action>
  23. coordinator-app>

 

版本:

任务调度框架Oozie学习笔记_第160张图片

 

frequency(频率):

设置时间的两种表达方式

任务调度框架Oozie学习笔记_第161张图片

任务调度框架Oozie学习笔记_第162张图片

 

⑤ 查看

任务调度框架Oozie学习笔记_第163张图片

任务调度框架Oozie学习笔记_第164张图片

因为没有执行mapreduce,所以yarn上没有。

 

可能出现的异常:

设置的时间频率为每分钟执行一次低于oozie默认的最小时间间隔,需要修改配置文件。

任务调度框架Oozie学习笔记_第165张图片

重启oozie服务。

 

14.  Oozie Coordinator配置调度MapReduce WordCount程序

 

①  拷贝样本案例

任务调度框架Oozie学习笔记_第166张图片

 

②  编写job.properties


   
   
   
   
  1. nameNode=hdfs: //hadoop-senior: 8020
  2. jobTracker=hadoop-senior: 8032
  3. queueName=default
  4. oozieAppsRoot=user/root/oozie-apps
  5. oozieDatasRoot=user/root/oozie/datas
  6. oozie.coord.application.path=${nameNode}/${oozieAppsRoot}/cron
  7. start= 2018- 02- 01T11: 39+080 0
  8. end= 2018- 02- 01T11: 49+080 0
  9. workflowAppUri=${nameNode}/${oozieAppsRoot}/cron/
  10. inputDir=mr-wordcount-wf/input
  11. outputDir=mr-wordcount-wf/output

 

③  编写workflow.xml


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="mr-wordcount-wf">
  2. <start to="mr-node-wordcount"/>
  3. <action name="mr-node-wordcount">
  4. <map-reduce>
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <prepare>
  8. <delete path="${nameNode}/${oozieAppsRoot}/${outputDir}"/>
  9. prepare>
  10. <configuration>
  11. <property>
  12. <name>mapred.mapper.new-api name>
  13. <value>true value>
  14. property>
  15. <property>
  16. <name>mapred.reducer.new-api name>
  17. <value>true value>
  18. property>
  19. <property>
  20. <name>mapreduce.job.queuename name>
  21. <value>${queueName} value>
  22. property>
  23. <property>
  24. <name>mapreduce.job.map.class name>
  25. <value>com.zhuyu.mapreduce.WordCount$WordCountMapper value>
  26. property>
  27. <property>
  28. <name>mapreduce.job.reduce.class name>
  29. <value>com.zhuyu.mapreduce.WordCount$WordCountReducer value>
  30. property>
  31. <property>
  32. <name>mapreduce.map.output.key.class name>
  33. <value>org.apache.hadoop.io.Text value>
  34. property>
  35. <property>
  36. <name>mapreduce.map.output.value.class name>
  37. <value>org.apache.hadoop.io.IntWritable value>
  38. property>
  39. <property>
  40. <name>mapreduce.job.output.key.class name>
  41. <value>org.apache.hadoop.io.Text; value>
  42. property>
  43. <property>
  44. <name>mapreduce.job.output.value.class name>
  45. <value>org.apache.hadoop.io.IntWritable value>
  46. property>
  47. <property>
  48. <name>mapreduce.input.fileinputformat.inputdir name>
  49. <value>${nameNode}/${oozieDatasRoot}/${inputDir} value>
  50. property>
  51. <property>
  52. <name>mapreduce.output.fileoutputformat.outputdir name>
  53. <value>${nameNode}/${oozieAppsRoot}/${outputDir} value>
  54. property>
  55. configuration>
  56. map-reduce>
  57. <ok to="end"/>
  58. <error to="fail"/>
  59. action>
  60. <kill name="fail">
  61. <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  62. kill>
  63. <end name="end"/>
  64. workflow-app>

 

 

④  编写coordinator.xml


   
   
   
   
  1. <coordinator-app name="cron-coord-mr" frequency="0/2 * * * *"
  2. start= "${start}" end= "${end}" timezone= "GMT+0800"
  3. xmlns= "uri:oozie:coordinator:0.4">
  4. <action>
  5. <workflow>
  6. <app-path>${workflowAppUri} app-path>
  7. <configuration>
  8. <property>
  9. <name>jobTracker name>
  10. <value>${jobTracker} value>
  11. property>
  12. <property>
  13. <name>nameNode name>
  14. <value>${nameNode} value>
  15. property>
  16. <property>
  17. <name>queueName name>
  18. <value>${queueName} value>
  19. property>
  20. configuration>
  21. workflow>
  22. action>
  23. coordinator-app>

 

⑤  查看

任务调度框架Oozie学习笔记_第167张图片

(可在oozie url的setting中设置)

任务调度框架Oozie学习笔记_第168张图片

任务调度框架Oozie学习笔记_第169张图片

任务调度框架Oozie学习笔记_第170张图片

 

 

15.  Oozie企业使用案例(Hive Action、Sqoop Actoion及定时调度)

 

使用hive统计emp表各部门的人数,将结果写到hdfs,再使用sqoop将结果写入mysql。

 

 

任务调度框架Oozie学习笔记_第171张图片

 

 

①  将hive-site.xml放到hive-select-sqoop下,将mysql驱动放到lib下

 

②  编写job.properties

任务调度框架Oozie学习笔记_第172张图片

 

③  编写workflow.xml


   
   
   
   
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="wf-hive-select">
  2. <start to="hive-node"/>
  3. <action name="hive-node">
  4. <hive xmlns="uri:oozie:hive-action:0.2">
  5. <job-tracker>${jobTracker} job-tracker>
  6. <name-node>${nameNode} name-node>
  7. <prepare>
  8. <delete path="${nameNode}/${oozieAppsRoot}/${outputDir}"/>
  9. prepare>
  10. <job-xml>${nameNode}/${oozieAppsRoot}/hive-select/hive-site.xml job-xml>
  11. <configuration>
  12. <property>
  13. <name>mapred.job.queue.name name>
  14. <value>${queueName} value>
  15. property>
  16. configuration>
  17. <script> select-emp.sql script>
  18. <param>OUTPUT=${nameNode}/${oozieAppsRoot}/${outputDir} param>
  19. hive>
  20. <ok to="sqoop-node"/>
  21. <error to="fail"/>
  22. action>
  23. <action name="sqoop-node">
  24. <sqoop xmlns="uri:oozie:sqoop-action:0.2">
  25. <job-tracker>${jobTracker} job-tracker>
  26. <name-node>${nameNode} name-node>
  27. <configuration>
  28. <property>
  29. <name>mapreduce.job.queuename name>
  30. <value>${queueName} value>
  31. property>
  32. configuration>
  33. // 测试一下sqoop命令再执行oozie
  34. <command>export --connect jdbc:mysql://hadoop-senior:3306/test --username root --password 123456 --table emp_dept_count --export-dir ${OUTPUT} --fields-terminated-by "," --num-mappers 1 command>
  35. sqoop>
  36. <ok to="end"/>
  37. <error to="fail"/>
  38. action>
  39. <kill name="fail">
  40. <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}] message>
  41. kill>
  42. <end name="end"/>
  43. workflow-app>

④  编写hive脚本

任务调度框架Oozie学习笔记_第173张图片


   
   
   
   
  1. insert overwrite directory
  2. '${OUTPUT}'
  3. row format delimited fields terminated by ',' // 任何分隔符皆可,但是在导出数据的时候要设置 --fields-terminated-by
  4. select if(tmp.deptno is NULL, '-1',tmp.deptno),tmp.emp_count
  5. from
  6. ( select deptno, count( 1) emp_count
  7. from default.emp
  8. group by deptno
  9. ) tmp
  10. order by tmp.emp_count desc;

你可能感兴趣的:(oozie)