Oozie的workflow和coordinate的使用

自定义实现wordcount的workflow

  1. 在yarn上测试wordcount程序
$ bin/yarn jar /opt/datas/wd.jar mapreduce.WordCount /input /output
Oozie的workflow和coordinate的使用_第1张图片
15.png
  1. 生产一个应用目录,并把wordcount的jar包放到应用目录中的lib目录下
$ cd /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/
$ mkdir my-apps
$ cp -r examples/apps/map-reduce/ my-apps/
$ cp /opt/datas/wd.jar my-apps/map-reduce/lib/
  1. 修改job.properties文件
# 定义变量
nameNode=hdfs://bigdata-00:8020
jobTracker=bigdata-00:8032
queueName=default
oozieAppsRoot=user/wulei/my-apps
oozieDataRoot=user/wulei/oozie/datas
inputDir=map-reduce/input
outputDir=map-reduce/output
# 定义workflow.xml的路径
oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/map-reduce/workflow.xml
  1. 修改workflow.xml文件

    
    
        
            ${jobTracker}
            ${nameNode}
            
            
                
            
            
                
                    mapred.job.queue.name
                    ${queueName}
                
                
                
                    mapreduce.job.map.class
                    mapreduce.WordCount$WordCountMapper
                
                
                    mapreduce.job.reduce.class
                    mapreduce.WordCount$WordCountReducer
                
                
                
                    mapreduce.input.fileinputformat.inputdir
                    ${nameNode}/${oozieDataRoot}/${inputDir}
                
                
                    mapreduce.output.fileoutputformat.outputdir
                    ${nameNode}/${oozieDataRoot}/${outputDir}
                
                
                
                    mapred.mapper.new-api
                    true
                
                
                    mapred.reducer.new-api
                    true
                
                
                
                    mapreduce.map.output.key.class
                    org.apache.hadoop.io.Text
                
                
                    mapreduce.map.output.value.class
                    org.apache.hadoop.io.LongWritable
                
                
                
                    mapreduce.job.output.key.class
                    org.apache.hadoop.io.Text
                
                
                    mapreduce.job.output.value.class
                    org.apache.hadoop.io.IntWritable
                
            
        
        
        
    
    
        Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
    
    

  1. 在hdfs上创建目录,并上传input数据
$ bin/hdfs dfs -mkdir -p /user/wulei/oozie/datas/map-reduce/input
$ bin/hdfs dfs -put -put /opt/datas/a.txt oozie/datas/map-reduce/input
  1. 上传oozie-apps目录
$ bin/hdfs dfs -put /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/my-apps/ my-apps
  1. 运行测试
$ bin/oozie job -oozie http://bigdata-00:11000/oozie -config my-apps/map-reduce/job.properties -run
  1. 查看测试结果
    yarn任务执行界面


    Oozie的workflow和coordinate的使用_第2张图片
    16.png

    oozie的web界面


    17.png

    输出文件目录
    Oozie的workflow和coordinate的使用_第3张图片
    18.png

自定义实现WorkFlow中shell action

  1. 拷贝默认的shell目录来进行修改
$ cp -r ./examples/apps/shell/ my-apps/
  1. 定义job.properties
nameNode=hdfs://bigdata-00:8020
jobTracker=bigdata-00:8032
queueName=default
examplesRoot=user/wulei/my-apps/shell
#定义workflow.xml路劲
oozie.wf.application.path=${nameNode}/${examplesRoot}/workflow.xml
#定义一个变量名存储shell文件名
EXEC=oozie.sh
  1. 定义workflow.properties

    
    
        
            ${jobTracker}
            ${nameNode}
            
                
                    mapred.job.queue.name
                    ${queueName}
                
            
            ${EXEC}
            
            ${nameNode}/${examplesRoot}/${EXEC}#${EXEC} 
        
        
        
    
    
        Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
    
    

  1. 定义要实现的脚本


    Oozie的workflow和coordinate的使用_第4张图片
    19.png
  2. 上传到hdfs后运行


    20.png
  3. 查看运行结果


    21.png

    Oozie的workflow和coordinate的使用_第5张图片
    22.png

Oozie coordinator调度

当有一个复杂的工作流job,希望每天定时执行,使用crontab方式调用需要编写大量的脚本,还要通过大量的判断来控制每个工作流job的执行顺序问题。Oozie中的Coordinator可以让每个工作流workflow当做一个动作来运行,这样就可以将多个job组织起来,并制定触发时间和频率。它的调度方式有两种:一种是基于时间调度;还有一种是基于数据可用性调度(判断数据是否存在和是否符合标准)。

  1. 如果要设置基于时间的调度,需要先配置时区,因为oozie默认使用的是UTC时区,服务器默认使用的是CST,我们把他们修改为GMT +0800(当然也可以是其他时区)
    查看系统当前时区:


    23.png

    如果输出的时区不是+0800,需要进行修改

$ rm -rf /etc/localtime
$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

修改oozie时区,在oozie-sitexml添加参数

    
        oozie.processing.timezone
        GMT+0800
    

修改oozie/-server/webapps/oozie/oozie-console.js中的时区设置,不然会影响web界面的时间,修改完成后重启生效

function getTimeZone() {
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
  1. 拷贝模板中的coordinator案例
    $ cp -r examples/apps/cron-schedule/ my-apps/
  2. 修改job.properties
nameNode=hdfs://bigdata-00:8020
jobTracker=bigdata-00:8032
queueName=default
examplesRoot=user/wulei/my-apps/cron-schedule
# 定义coordinate路径
oozie.coord.application.path=${nameNode}/${examplesRoot}
start=2016-11-13T12:30+0800
end=2016-11-13T13:30+0800
# 定义workflow路劲
workflowAppUri=${nameNode}/${examplesRoot}
  1. 修改coorndinate.xml,让这个任务从开始时间到结束时间内每分钟执行一次

        
        
            ${workflowAppUri}
            
                
                    jobTracker
                    ${jobTracker}
                
                
                    nameNode
                    ${nameNode}
                
                
                    queueName
                    ${queueName}
                
            
        
    

  1. oozie的默认配置中,至少为每5分钟执行一次,所以需要修改默认配置


    24.png
  2. 上传至hdfs后执行


    25.png
  3. 查看执行结果


    27.png

    Oozie的workflow和coordinate的使用_第6张图片
    26.png

你可能感兴趣的:(Oozie的workflow和coordinate的使用)