目录

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学习笔记_JAVA

 

 

2.  几种调度框架讲解

 

任务调度框架Oozie学习笔记_oozie_02

 

Linux Crontab:

针对每个用户而言的

任务调度框架Oozie学习笔记_oozie_03

任务调度框架Oozie学习笔记_JAVA_04

任务调度框架Oozie学习笔记_JAVA_05

任务调度框架Oozie学习笔记_JAVA_06

 

实例:

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

任务调度框架Oozie学习笔记_oozie_07

任务调度框架Oozie学习笔记_JAVA_08

 

任务调度框架Oozie学习笔记_oozie_09

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

 

Azkaban:

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

任务调度框架Oozie学习笔记_oozie_10

 

Oozie:

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

任务调度框架Oozie学习笔记_oozie_11

 

Zeus:

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

任务调度框架Oozie学习笔记_oozie_12

 

 

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

 

任务调度框架Oozie学习笔记_oozie_13

 

任务调度框架Oozie学习笔记_JAVA_14

 

任务调度框架Oozie学习笔记_oozie_15

 

任务调度框架Oozie学习笔记_oozie_16

 

任务调度框架Oozie学习笔记_oozie_17

 

任务调度框架Oozie学习笔记_oozie_18

 

任务调度框架Oozie学习笔记_JAVA_19

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

 

任务调度框架Oozie学习笔记_oozie_20

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

 

 

4.  Oozie安装部署

 

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

任务调度框架Oozie学习笔记_oozie_21

任务调度框架Oozie学习笔记_JAVA_22

 

 

安装cdh版本:

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

任务调度框架Oozie学习笔记_oozie_23

任务调度框架Oozie学习笔记_oozie_24

  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学习笔记_JAVA_25

任务调度框架Oozie学习笔记_oozie_26

任务调度框架Oozie学习笔记_JAVA_27

任务调度框架Oozie学习笔记_oozie_28

 

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

任务调度框架Oozie学习笔记_JAVA_29

任务调度框架Oozie学习笔记_JAVA_30

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

任务调度框架Oozie学习笔记_oozie_31

任务调度框架Oozie学习笔记_oozie_32

任务调度框架Oozie学习笔记_JAVA_33

 

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

任务调度框架Oozie学习笔记_JAVA_34

任务调度框架Oozie学习笔记_oozie_35

任务调度框架Oozie学习笔记_oozie_36

任务调度框架Oozie学习笔记_oozie_37

如果出现异常:

任务调度框架Oozie学习笔记_oozie_38

解决:关闭安全模式

任务调度框架Oozie学习笔记_JAVA_39

⑥  修改oozie使用的数据库

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

任务调度框架Oozie学习笔记_oozie_40

 

修改后:

任务调度框架Oozie学习笔记_oozie_41

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

 

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

 

任务调度框架Oozie学习笔记_JAVA_42

将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学习笔记_oozie_43

 

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

任务调度框架Oozie学习笔记_JAVA_44

查看脚本:

任务调度框架Oozie学习笔记_JAVA_45

任务调度框架Oozie学习笔记_JAVA_46

 

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

任务调度框架Oozie学习笔记_JAVA_47

任务调度框架Oozie学习笔记_oozie_48

任务调度框架Oozie学习笔记_oozie_49

 

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

任务调度框架Oozie学习笔记_JAVA_50

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

 

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

任务调度框架Oozie学习笔记_JAVA_51

任务调度框架Oozie学习笔记_oozie_52

  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学习笔记_oozie_53

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

任务调度框架Oozie学习笔记_oozie_54

任务调度框架Oozie学习笔记_oozie_55

关闭oozie后进行如下操作:

任务调度框架Oozie学习笔记_oozie_56

任务调度框架Oozie学习笔记_JAVA_57

任务调度框架Oozie学习笔记_oozie_58

开启oozie:

任务调度框架Oozie学习笔记_JAVA_59

 

 

5.   Oozie案例运行MapReduce Wordflow讲解

 

任务调度框架Oozie学习笔记_JAVA_60

任务调度框架Oozie学习笔记_oozie_61

①  解压oozie-examples.tar.gz

任务调度框架Oozie学习笔记_JAVA_62

任务调度框架Oozie学习笔记_oozie_63

 

②  将解压的案例上传到hdfs

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

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

任务调度框架Oozie学习笔记_oozie_64

 

③ 修改job.properties

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

job.properties:

任务调度框架Oozie学习笔记_oozie_65

本机:

任务调度框架Oozie学习笔记_JAVA_66

修改job.properties:

修改前

任务调度框架Oozie学习笔记_oozie_67

修改后

任务调度框架Oozie学习笔记_oozie_68

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

 

④  运行案例程序

任务调度框架Oozie学习笔记_oozie_69

任务调度框架Oozie学习笔记_oozie_70

任务调度框架Oozie学习笔记_JAVA_71 任务调度框架Oozie学习笔记_JAVA_72

 

[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学习笔记_oozie_73查看程序运行状态仍然是running

任务调度框架Oozie学习笔记_JAVA_74

引出异常unhealthy node:

任务调度框架Oozie学习笔记_oozie_75

任务调度框架Oozie学习笔记_oozie_76

 

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

任务调度框架Oozie学习笔记_JAVA_77

  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学习笔记_oozie_78

解决:调整Memory Total和VCores Total。

 

⑤  查看

任务调度框架Oozie学习笔记_JAVA_79

查看程序运行状态:

任务调度框架Oozie学习笔记_oozie_80

 

 

6.  如何定义OoozieWorkflow讲解

 

任务调度框架Oozie学习笔记_oozie_81

任务调度框架Oozie学习笔记_oozie_82

任务调度框架Oozie学习笔记_JAVA_83

任务调度框架Oozie学习笔记_JAVA_84

任务调度框架Oozie学习笔记_oozie_85

 

 

 

7.  Oozie Workflow中MapReduce Action定义讲解

 

任务调度框架Oozie学习笔记_JAVA_86

 

任务调度框架Oozie学习笔记_JAVA_87

任务调度框架Oozie学习笔记_JAVA_88

 

任务调度框架Oozie学习笔记_oozie_89

任务调度框架Oozie学习笔记_JAVA_90

 

任务调度框架Oozie学习笔记_oozie_91

任务调度框架Oozie学习笔记_JAVA_92

 

任务调度框架Oozie学习笔记_oozie_93

任务调度框架Oozie学习笔记_oozie_94

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

 

 

8.  编写OozieWorkflow的MapReduceAction并运行

 

任务调度框架Oozie学习笔记_JAVA_95

任务调度框架Oozie学习笔记_JAVA_96

任务调度框架Oozie学习笔记_JAVA_97

 

① 复制修改example中的实例

任务调度框架Oozie学习笔记_JAVA_98 任务调度框架Oozie学习笔记_JAVA_99

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

任务调度框架Oozie学习笔记_JAVA_100

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.2"name="map-reduce-wf">
  2.  
    <startto="mr-node"/>
  3.  
    <actionname="mr-node">
  4.  
    <map-reduce>
  5.  
    <job-tracker>${jobTracker} </job-tracker>
  6.  
    <name-node>${nameNode} </name-node>
  7.  
    <prepare>
  8.  
    <deletepath="${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.  
    <okto="end"/>
  38.  
    <errorto="fail"/>
  39.  
    </action>
  40.  
    <killname="fail">
  41.  
    <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  42.  
    </kill>
  43.  
    <endname="end"/>
  44.  
    </workflow-app>
 

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

任务调度框架Oozie学习笔记_JAVA_101

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

任务调度框架Oozie学习笔记_JAVA_102

)

任务调度框架Oozie学习笔记_JAVA_103

任务调度框架Oozie学习笔记_oozie_104

……

 

修改后如下图:

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-appxmlns="uri:oozie:workflow:0.5"name="mr-wordcount-wf">
  2.  
    //名称设置不要超过20个字符
  3.  
    <startto="mr-node-wordcount"/>
  4.  
    <actionname="mr-node-wordcount">
  5.  
    <map-reduce>
  6.  
    <job-tracker>${jobTracker} </job-tracker>
  7.  
    <name-node>${nameNode} </name-node>
  8.  
    <prepare>
  9.  
    <deletepath="${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.  
    <!--
  52.  
    <property>
  53.  
    <name>mapred.map.tasks</name>
  54.  
    <value>1</value>
  55.  
    </property>
  56.  
    -->
  57.  
    <property>
  58.  
    <name>mapreduce.input.fileinputformat.inputdir </name>
  59.  
    <value>${nameNode}/${oozieDatasRoot}/${inputDir} </value>
  60.  
    </property>
  61.  
    <property>
  62.  
    <name>mapreduce.output.fileoutputformat.outputdir </name>
  63.  
    <value>${nameNode}/${oozieAppsRoot}/${outputDir} </value>
  64.  
    </property>
  65.  
     
  66.  
    </configuration>
  67.  
    </map-reduce>
  68.  
    <okto="end"/>
  69.  
    <errorto="fail"/>
  70.  
    </action>
  71.  
    <killname="fail">
  72.  
    <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  73.  
    </kill>
  74.  
    <endname="end"/>
  75.  
    </workflow-app>
 

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

 

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

任务调度框架Oozie学习笔记_oozie_105

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

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

任务调度框架Oozie学习笔记_oozie_106

任务调度框架Oozie学习笔记_JAVA_107

任务调度框架Oozie学习笔记_oozie_108

 

④  运行程序

任务调度框架Oozie学习笔记_oozie_109

YARN:

任务调度框架Oozie学习笔记_oozie_110

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

 

OOZIE:

任务调度框架Oozie学习笔记_JAVA_111

 

输出文件:

任务调度框架Oozie学习笔记_JAVA_112

任务调度框架Oozie学习笔记_oozie_113

 

 

 

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

 

文档:

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

 

①  复制案例到oozie-apps下

任务调度框架Oozie学习笔记_JAVA_114

 

②  修改job.properties

任务调度框架Oozie学习笔记_oozie_115

  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.  
     
  8.  
    oozie.use.system.libpath= true
  9.  
    // xml可指定可不指定,不指定的话会自动在该目录下找
  10.  
    oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/hive- select/
  11.  
    outputDir=hive- select/output
 

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

任务调度框架Oozie学习笔记_oozie_116

 

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

任务调度框架Oozie学习笔记_oozie_117

 

 

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

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

任务调度框架Oozie学习笔记_oozie_118

 

⑤  修改workflow.xml

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.5"name="wf-hive-select">
  2.  
    <startto="hive-node"/>
  3.  
    <actionname="hive-node">
  4.  
    <hivexmlns="uri:oozie:hive-action:0.2">
  5.  
    <job-tracker>${jobTracker} </job-tracker>
  6.  
    <name-node>${nameNode} </name-node>
  7.  
    <prepare>
  8.  
    <deletepath="${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.  
    <okto="end"/>
  21.  
    <errorto="fail"/>
  22.  
    </action>
  23.  
     
  24.  
    <killname="fail">
  25.  
    <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  26.  
    </kill>
  27.  
    <endname="end"/>
  28.  
    </workflow-app>
 

 

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

任务调度框架Oozie学习笔记_oozie_119

(所以使用的是旧的api)

 

要添加<job-xml>属性以加载hive配置文件:

任务调度框架Oozie学习笔记_JAVA_120

 

否则会出现以下异常:

任务调度框架Oozie学习笔记_oozie_121

任务调度框架Oozie学习笔记_JAVA_122

 

如果在运行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
 

⑥  运行

任务调度框架Oozie学习笔记_oozie_123

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

⑦  查看:

任务调度框架Oozie学习笔记_oozie_124

任务调度框架Oozie学习笔记_oozie_125

任务调度框架Oozie学习笔记_oozie_126

任务调度框架Oozie学习笔记_oozie_127

 

 

 

 

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

 

① 复制样本案例

任务调度框架Oozie学习笔记_JAVA_128

db.hsqldb.properties属性文件

db.hsqldb.script脚本文件

二者都可删除

 

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

任务调度框架Oozie学习笔记_JAVA_129

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

 

③ 测试是老api还是新api

在mysql中建表:

  1.  
    createtable`my_user`(
  2.  
    `id` tinyint( 4) notnull auto_increment,
  3.  
    `acount`varchar( 255) defaultnull,
  4.  
    `password`varchar( 255) defaultnull,
  5.  
    primary key( `id`)
  6.  
    );
  7.  
    insertinto`my_user`values( '1', 'admin', 'admin');
  8.  
    insertinto`my_user`values( '2', 'pu', 'pu');
  9.  
    insertinto`my_user`values( '3', 'system', 'system');
  10.  
    insertinto`my_user`values( '4', 'zxh', 'zxh');
  11.  
    insertinto`my_user`values( '5', 'test', 'test');
  12.  
    insertinto`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学习笔记_oozie_130

任务调度框架Oozie学习笔记_JAVA_131

 

④  修改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.  
     
  7.  
    oozie.use.system.libpath= true
  8.  
     
  9.  
    oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/sqoop- import-emp/
  10.  
    outputDir=sqoop- import-emp/output
 

 

⑤  修改workflow.xml

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.5"name="sqoop-wf">
  2.  
    <startto="sqoop-node"/>
  3.  
     
  4.  
    <actionname="sqoop-node">
  5.  
    <sqoopxmlns="uri:oozie:sqoop-action:0.2">
  6.  
    <job-tracker>${jobTracker} </job-tracker>
  7.  
    <name-node>${nameNode} </name-node>
  8.  
    <prepare>
  9.  
    <deletepath="${nameNode}/${oozieAppsRoot}/${outputDir}"/>
  10.  
    </prepare>
  11.  
    <configuration>
  12.  
    <property>
  13.  
    <name>mapreduce.job.queuename </name>
  14.  
    <value>${queueName} </value>
  15.  
    </property>
  16.  
    </configuration>
  17.  
    // 命令前不需要sqoop
  18.  
    // 可通过--fields-terminated-by "分隔符" 进行字段分割
  19.  
    <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>
  20.  
    </sqoop>
  21.  
    <okto="end"/>
  22.  
    <errorto="fail"/>
  23.  
    </action>
  24.  
     
  25.  
    <killname="fail">
  26.  
    <message>Sqoop failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  27.  
    </kill>
  28.  
    <endname="end"/>
  29.  
    </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学习笔记_oozie_132

任务调度框架Oozie学习笔记_JAVA_133

任务调度框架Oozie学习笔记_JAVA_134

任务调度框架Oozie学习笔记_JAVA_135

 

⑧  可能出现的异常

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

任务调度框架Oozie学习笔记_oozie_136

 

补充:

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

任务调度框架Oozie学习笔记_oozie_137

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

任务调度框架Oozie学习笔记_oozie_138

应将单引号变为双引号

任务调度框架Oozie学习笔记_JAVA_139

任务调度框架Oozie学习笔记_JAVA_140

--fields-terminated-by "$"
 

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

脚本文件:

任务调度框架Oozie学习笔记_JAVA_141

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

任务调度框架Oozie学习笔记_oozie_142

任务调度框架Oozie学习笔记_JAVA_143

任务调度框架Oozie学习笔记_JAVA_144

 

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

任务调度框架Oozie学习笔记_JAVA_145

任务调度框架Oozie学习笔记_JAVA_146

 

3.  <command>可替换为<arg>

任务调度框架Oozie学习笔记_oozie_147

 

任务调度框架Oozie学习笔记_oozie_148

任务调度框架Oozie学习笔记_oozie_149

  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学习笔记_JAVA_150

任务调度框架Oozie学习笔记_oozie_151

任务调度框架Oozie学习笔记_JAVA_152

任务调度框架Oozie学习笔记_JAVA_153

 

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

 

①  拷贝shell样本案例

任务调度框架Oozie学习笔记_JAVA_154

 

②  编写shell脚本和hive脚本

hive脚本:

任务调度框架Oozie学习笔记_JAVA_155

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


shell脚本:

任务调度框架Oozie学习笔记_JAVA_156

  1.  
    #!/usr/bin/env bash
  2.  
     
  3.  
    ## student select
  4.  
    /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.  
     
  7.  
    oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/shell-hive- select
  8.  
     
  9.  
    exec=emp- select.sh
  10.  
    script=emp- select.sql
 

④  修改workflow.xml

修改前:

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.5"name="shell-wf">
  2.  
    <startto="shell-node"/>
  3.  
    <actionname="shell-node">
  4.  
    <shellxmlns="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.  
    <okto="check-output"/>
  18.  
    <errorto="fail"/>
  19.  
    </action>
  20.  
    <decisionname="check-output">
  21.  
    <switch>
  22.  
    <caseto="end">
  23.  
    ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
  24.  
    </case>
  25.  
    <defaultto="fail-output"/>
  26.  
    </switch>
  27.  
    </decision>
  28.  
    <killname="fail">
  29.  
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  30.  
    </kill>
  31.  
    <killname="fail-output">
  32.  
    <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}] </message>
  33.  
    </kill>
  34.  
    <endname="end"/>
  35.  
    </workflow-app>
 

修改后:

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.5"name="shell-wf">
  2.  
    <startto="shell-node"/>
  3.  
    <actionname="shell-node">
  4.  
    <shellxmlns="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.  
    <okto="end"/>
  22.  
    <errorto="fail"/>
  23.  
    </action>
  24.  
    <killname="fail">
  25.  
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  26.  
    </kill>
  27.  
    <endname="end"/>
  28.  
    </workflow-app>
 
(本例中不使用<job-xml>是因为在shell脚本中使用的hive命令会自动在hive配置文件目录下寻找配置文件)
 

 

为什么要使用<file>?

任务调度框架Oozie学习笔记_oozie_157

 

任务调度框架Oozie学习笔记_JAVA_158

nm-local-dir是namenode的本地目录,任务调度框架Oozie学习笔记_oozie_159是分布式缓存文件,mapreduce在运行的时候会自动将文件从hdfs拷贝到这里。<file>的作用是将文件手动拷贝到该目录下,否则系统不会将文件拷贝到这里。

 

标签要有序:

任务调度框架Oozie学习笔记_JAVA_160

 

 

⑤  运行

  1.  
    [root@hadoop-senior oozie- 4.1. 0-cdh5. 13.0] # export OOZIE_URL=http://hadoop-senior:11000/oozie/
  2.  
     
  3.  
    [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学习笔记_oozie_161

任务调度框架Oozie学习笔记_oozie_162

任务调度框架Oozie学习笔记_oozie_163

任务调度框架Oozie学习笔记_JAVA_164

 

 

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

 

任务调度框架Oozie学习笔记_oozie_165

 

任务调度框架Oozie学习笔记_oozie_166

任务调度框架Oozie学习笔记_oozie_167

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

 

修改时区:

查看时区文件:

任务调度框架Oozie学习笔记_JAVA_168

任务调度框架Oozie学习笔记_JAVA_169

任务调度框架Oozie学习笔记_JAVA_170

任务调度框架Oozie学习笔记_oozie_171

 

修改oozie时区:

任务调度框架Oozie学习笔记_oozie_172

 

查看oozie使用的时区:

任务调度框架Oozie学习笔记_oozie_173

 

修改oozie运行时的时区:

查看默认的时区

任务调度框架Oozie学习笔记_JAVA_174

在oozie-site.xml中设置

任务调度框架Oozie学习笔记_JAVA_175

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

方法一:

任务调度框架Oozie学习笔记_oozie_176

 

方法二:

任务调度框架Oozie学习笔记_oozie_177

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

 

任务调度框架Oozie学习笔记_oozie_178

任务调度框架Oozie学习笔记_oozie_179

 

清除oozie缓存:

任务调度框架Oozie学习笔记_oozie_180

 

异常:oozie控制台不能使用

任务调度框架Oozie学习笔记_JAVA_181

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

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

 

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

 

①  拷贝样本案例

任务调度框架Oozie学习笔记_JAVA_182

任务调度框架Oozie学习笔记_JAVA_183

 

②  修改job.properties

修改前:

  1.  
    nameNode=hdfs://localhost:8020
  2.  
    jobTracker=localhost:8021
  3.  
    queueName=default
  4.  
    examplesRoot=examples
  5.  
     
  6.  
    oozie.coord.application.path= ${nameNode}/user/ ${user.name}/ ${examplesRoot}/apps/cron-schedule
  7.  
    start=2010-01-01T00:00Z
  8.  
    end=2010-01-01T01:00Z
  9.  
    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-appxmlns="uri:oozie:workflow:0.5"name="no-op-wf">
  3.  
    <startto="end"/>
  4.  
    <endname="end"/>
  5.  
    </workflow-app>
 

④ 修改coordinator.xml

修改前:

  1.  
    <coordinator-appname="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-appname="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学习笔记_JAVA_184

 

frequency(频率):

设置时间的两种表达方式

任务调度框架Oozie学习笔记_JAVA_185

任务调度框架Oozie学习笔记_oozie_186

 

⑤ 查看

任务调度框架Oozie学习笔记_JAVA_187

任务调度框架Oozie学习笔记_oozie_188

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

 

可能出现的异常:

任务调度框架Oozie学习笔记_JAVA_189

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

任务调度框架Oozie学习笔记_JAVA_190

重启oozie服务。

 

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

 

①  拷贝样本案例

任务调度框架Oozie学习笔记_JAVA_191

 

②  编写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.  
     
  7.  
    oozie.coord.application.path=${nameNode}/${oozieAppsRoot}/cron
  8.  
    start= 2018- 02- 01T11: 39+080 0
  9.  
    end= 2018- 02- 01T11: 49+080 0
  10.  
    workflowAppUri=${nameNode}/${oozieAppsRoot}/cron/
  11.  
    inputDir=mr-wordcount-wf/input
  12.  
    outputDir=mr-wordcount-wf/output
 

 

③  编写workflow.xml

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.5"name="mr-wordcount-wf">
  2.  
    <startto="mr-node-wordcount"/>
  3.  
    <actionname="mr-node-wordcount">
  4.  
    <map-reduce>
  5.  
    <job-tracker>${jobTracker} </job-tracker>
  6.  
    <name-node>${nameNode} </name-node>
  7.  
    <prepare>
  8.  
    <deletepath="${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.  
     
  56.  
    </configuration>
  57.  
    </map-reduce>
  58.  
    <okto="end"/>
  59.  
    <errorto="fail"/>
  60.  
    </action>
  61.  
    <killname="fail">
  62.  
    <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  63.  
    </kill>
  64.  
    <endname="end"/>
  65.  
    </workflow-app>
 

 

 

④  编写coordinator.xml

  1.  
    <coordinator-appname="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学习笔记_JAVA_192

任务调度框架Oozie学习笔记_oozie_193

(可在oozie url的setting中设置)

任务调度框架Oozie学习笔记_JAVA_194

任务调度框架Oozie学习笔记_oozie_195

任务调度框架Oozie学习笔记_oozie_196

 

 

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

 

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

 

 

任务调度框架Oozie学习笔记_JAVA_197

 

 

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

 

②  编写job.properties

任务调度框架Oozie学习笔记_oozie_198

 

③  编写workflow.xml

  1.  
    <workflow-appxmlns="uri:oozie:workflow:0.5"name="wf-hive-select">
  2.  
    <startto="hive-node"/>
  3.  
    <actionname="hive-node">
  4.  
    <hivexmlns="uri:oozie:hive-action:0.2">
  5.  
    <job-tracker>${jobTracker} </job-tracker>
  6.  
    <name-node>${nameNode} </name-node>
  7.  
    <prepare>
  8.  
    <deletepath="${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.  
    <okto="sqoop-node"/>
  21.  
    <errorto="fail"/>
  22.  
    </action>
  23.  
    <actionname="sqoop-node">
  24.  
    <sqoopxmlns="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.  
    <okto="end"/>
  37.  
    <errorto="fail"/>
  38.  
    </action>
  39.  
    <killname="fail">
  40.  
    <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
  41.  
    </kill>
  42.  
    <endname="end"/>
  43.  
    </workflow-app>
 

④  编写hive脚本

任务调度框架Oozie学习笔记_oozie_199

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