分享

Oozie运用实战

本帖最后由 丫丫 于 2016-12-12 17:46 编辑
问题导航

1、Oozie如何安装配置?
2、如何自定义实现workflow?
3、如何实现shell action
4、如何简单实现DAG图?
5、oozie的coordinator如何基于时间或者数据调度的workflow?








一、运行官方实例

1、解压Oozie目录下的oozie-examples.tar.gz

    1、tar -zxvf oozie-examples.tar.gz
    2、解压完成后会创建一个examples文件夹

2、将程序上传到HDFS的家目录

   1、 bin/hdfs dfs -put /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/examples examples

    2、 1.png


3、运行官方mapreduc

        
1、修改job.properties (定义了先关变量,指向了workflow.xml)        

                1、需要修改:        
           [mw_shl_code=text,true] nameNode=hdfs://hadoop-senior01.ibeifeng.com:8020
jobTracker=hadoop-senior01.ibeifeng.com:8032[/mw_shl_code]
            
        2、workflow.xml(真正需要自己写的内容,Oozie的核心)

        [mw_shl_code=text,true]定义各个节点的运行
            任务流
                控制流节点:start、end、kill、fork、join
                动作节点:mr/shell/hive
                -》mr action
                    -》configuration
                        -》放所有driver部分的配置
                        -》new API
                -》shell action
                    -》file
                    -》脚本中的每一条命令在集群中的任何一台机器上都能执行
                -》oozie会额外多一个mapreduce任务,只有map,用于程序的封装[/mw_shl_code]
  
        3、运行程序

           1、 bin/oozie job -oozie http://hadoop-senior01.ibeifeng.com:11000/oozie -config examples/apps/map-reduce/job.properties -run
                   20161209151349914.png
            2、报错:找不到HDFS
                   1.png
            3、解决:修改oozie-site.xml 读取Hadoop的配置文件

            [mw_shl_code=xml,true]
<property>
              <name>oozie.service.HadoopAccessorService.hadoop.configurations</name>
    <value>*=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6/etc/hadoop</value>
</property>[/mw_shl_code]
         
            4、重启oozie,重新运行
                   1.png


   4、运行成功


        1、运行命令中的job.properties指的是本地,建议,本地修改后,将修改后的上传(使本地与HDFS一致)
        2、oozie中的workflow默认会启动一个map程序oozie:launcher,用于对job的封装,只有map任务

4、步骤总结

    1、检测环境:sharelib

    2、运行命令

    3、bin/oozie job -oozie http://hadoop-senior01.ibeifeng.com:11000/oozie -config examples/apps/map-reduce/job.properties -run

       1、 job.properties的功能:a.对变量的定义;b.指向要运行的workflow的地址
       2、workflow.xml:定义你的任务流:如果有修改,必须重新上传


    1、运行

        1、运行workflow.xml
        2、 jar包


二、自定义实现workflow


    1、实现Wordcount的workflow

    2、创建HDFS目录及上传文件

        1、bin/hdfs dfs -mkdir /input
        2、bin/hdfs dfs -put /opt/datas/wc.input /input

    3、打包测试jar包

          bin/yarn jar /opt/datas/wc2.jar org.apache.hadoop.wordcount.WordCount /input /outputtest

    4、准备工作

        1、Oozie下创建:mkdir application
        2、进入application目录,先拷贝一份示例到当前目录下:cp -r ../examples/apps/map-reduce/ ./
        3、重命名文件夹:mv map-reduce/ wc-wf

  5、 编写workflow

        1、job.properties:修改workflow的地址,添加自定义的变量

                       [mw_shl_code=text,true]        nameNode=hdfs://hadoop-senior01.ibeifeng.com:8020
jobTracker=hadoop-senior01.ibeifeng.com:8032
queueName=default
examplesRoot=user/beifeng/application
oozie.wf.application.path=${nameNode}/${examplesRoot}/wc-wf/workflow.xml
inputDir=input
outputDir=output[/mw_shl_code]


        2、workflow.xml:配置可以在yarn上查找

                   1.png

                  [mw_shl_code=applescript,true]-》driver自定义的实现
    -》队列名称
    -》map和reduce的类
    -》输入输出目录
    -》shuffle
    -》输出的类型 [/mw_shl_code]

       6.    替换lib目录下jar包

           1、cp /opt/datas/wc2.jar wc-wf/lib/
           2、 1.png


     7、上传运行


        1、上传文件到hdfs用户目录:

        bin/hdfs dfs -put /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/application/

       2、 第一种运行方式:

        bin/oozie job -oozie http://hadoop-senior01.ibeifeng.com:11000/oozie -config application/wc-wf/job.properties -run

       3、 第二种运行方式(临时性的):


        export OOZIE_URL="http://hadoop-senior01.ibeifeng.com:11000/oozie"bin/oozie job -config application/wc-wf/job.properties -run

        4、报错:配置名称与当前模式不匹配


                1.png



           
   查看错误:[beifeng@hadoop-senior01 oozie-4.0.0-cdh5.3.6]$ more logs/oozie.log
              workflow.xml设置:
             1.png
            mapred.mapper.new-api=true
            mapred.reducer.new-api=true

        5、重新上传workflow.xml并重新运行

            1、重新上传:   

                1、bin/hdfs dfs -rm -r application/wc-wf
                2、bin/hdfs dfs -put /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/application/wc-wf/ application/

           2、 重新运行:bin/oozie job -config application/wc-wf/job.properties –run

        6、运行结果
              
               1.png
               1.png



         8、workflow.xml代码

                 [mw_shl_code=xml,true]<workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">    <start to="mr-node"/>    <action name="mr-node">        <map-reduce>            <job-tracker>${jobTracker}</job-tracker>            <name-node>${nameNode}</name-node>            <prepare>                <delete path="${nameNode}/${outputDir}"/>            </prepare>            <configuration>                <!-- set the queue name -->                <property>                    <name>mapreduce.job.queuename</name>                    <value>${queueName}</value>                </property>                <!-- set the new api -->                <property>                    <name>mapred.mapper.new-api</name>                    <value>true</value>                </property>                <property>                    <name>mapred.reducer.new-api</name>                    <value>true</value>                </property>                <!-- set the map class and the reduce class -->                <property>                    <name>mapreduce.job.map.class</name>                    <value>org.apache.hadoop.wordcount.WCMap</value>                </property>                <property>                    <name>mapreduce.job.reduce.class</name>                    <value>org.apache.hadoop.wordcount.WCReduce</value>                </property>                <!-- set the output key and value type -->                <property>                    <name>mapreduce.map.output.key.class</name>                    <value>org.apache.hadoop.io.Text</value>                </property>                <property>                    <name>mapreduce.map.output.value.class</name>                    <value>org.apache.hadoop.io.LongWritable</value>                </property>                <property>                    <name>mapreduce.job.output.key.class</name>                    <value>org.apache.hadoop.io.Text</value>                </property>                <property>                    <name>mapreduce.job.output.value.class</name>                    <value>org.apache.hadoop.io.LongWritable</value>                </property>                <!-- set the inputDir and outputDir -->                <property>                    <name>mapreduce.input.fileinputformat.inputdir</name>                    <value>${nameNode}/${inputDir}</value>                </property>                <property>                    <name>mapreduce.output.fileoutputformat.outputdir</name>                    <value>${nameNode}/${outputDir}</value>                </property>            </configuration>        </map-reduce>        <ok to="end"/>        <error to="fail"/>    </action>    <kill name="fail">        <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>    </kill>    <end name="end"/></workflow-app>[/mw_shl_code]

三、shell action

    1、拷贝官方案例到application

   [mw_shl_code=text,true] [beifeng@hadoop-senior01 application]$ cp -r ../examples/apps/shell/ ./
重命名:mv shell/ sh-wf[/mw_shl_code]

   2、编写脚本

        [mw_shl_code=text,true]头一定要写,一定要写对 #! /bin/bash/
        #!/bin/bash
        HIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6
        $HIVE_HOME/bin/hive -e "show databases" >/opt/datas/oozie.file[/mw_shl_code]

    3、编写job.properties和workflow

       1、job.properties

        [mw_shl_code=text,true]nameNode=hdfs://hadoop-senior01.ibeifeng.com:8020
jobTracker=hadoop-senior01.ibeifeng.com:8032
queueName=default
examplesRoot=user/beifeng/application/sh-wf

oozie.wf.application.path=${nameNode}/${examplesRoot}/workflow.xml
EXEC=oozie.sh  [/mw_shl_code]


       2、 workflow

            [mw_shl_code=text,true]<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
    <start to="shell-node"/>
    <action name="shell-node">
        <shell xmlns="uri:oozie:shell-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${EXEC}</exec>
            <file>${nameNode}/${examplesRoot}/${EXEC}#${EXEC}</file>
            <!--Copy the executable to compute node's current working directory -->
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
</workflow-app>[/mw_shl_code]   4、 上传运行


        1、上传
          bin/hdfs dfs -put /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/application/sh-wf/ application/

                   1.png

        2、运行   

     
       [mw_shl_code=text,true]export OOZIE_URL="http://hadoop-senior01.ibeifeng.com:11000/oozie"
bin/oozie job -config application/sh-wf/job.properties -run [/mw_shl_code]
          20161209151349914.png
        
    5、注意问题

       1、 所运行的计算节点必须可执行脚本中的每一条命令

四、复杂DAG图的简单实现

    1、使用workflow实现Mapreduce与shell脚本,功能为先实现Mapreduce的wordcount,然后使用shell脚本将结果文件复制到hdfs的根目录

   2、 job.properties

    3、workflow.xml :主要是在结束时进入

   4、 oozie.sh

   5、 流程图

       1.png

五、oozie的coordinator:基于时间或者数据调度的workflow

    1、基于时间的调度

        1、起始时间
        2、调度频率
        3、终止时间

   2、 基于数据可用性的调度

   3、调整时区

       1、检查时区,修改Linux时区

            1、查看指令:date -R

            2、正常:+0800
                   1.png
      
     3、不正常:                    [mw_shl_code=text,true]-》删除当前时区
sudo rm -rf /etc/localtime
-》重建(软连接)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-》重新检测 [/mw_shl_code]        2、修改oozie的时区:在oozie-site.xml添加
       [mw_shl_code=xml,true]<property>
<name>oozie.processing.timezone</name>
<value>GMT+0800</value>
</property>[/mw_shl_code]

        3、重启oozie

        4、界面中检测时区


        修改oozie-server/webapps/oozie/oozie-console.js
        getTimezone方法中的GMT为GMT+0800
        清空一下浏览器的缓存,刷新查看
         1.png


       5、 调整linux时间

        sudo date -s "2016-12-03 16:44:00"

   4、 关于时间调度的workflow

       1、 job.properties:指向了coordinator.xml地址

       2、coordinator.xml:起始时间,频率,终止时间,指向workflow的地址

       3、 workflow.xml


    5、运行

        1、指令

        [mw_shl_code=text,true]export OOZIE_URL="http://hadoop-senior01.ibeifeng.com:11000/oozie"
bin/oozie job -config application/coordinator/job.properties -run[/mw_shl_code]
             1.png

       2、 运行时间:包头不包尾(不包括结尾的时间)  

               1.png

       3、运行是提示最小时间不能设置为2,在oozie-site.xml添加下面参数为false

        oozie.service.coord.check.maximum.frequency

    6、Linux crontab的格式

        1、coordinator.xml 文件中:frequency=”/1  * * *”


来源:blog.csdn
作者:H_Hao

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条