Oozie实例

一、运行官方实例

  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. 这里写图片描述
  3. 运行官方mapreduce

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

      1. 需要修改:

        nameNode=hdfs://hadoop-senior01.ibeifeng.com:8020
        jobTracker=hadoop-senior01.ibeifeng.com:8032
    2. workflow.xml(真正需要自己写的内容,Oozie的核心)

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

      1. bin/oozie job -oozie http://hadoop-senior01.ibeifeng.com:11000/oozie -config examples/apps/map-reduce/job.properties -run
        这里写图片描述
      2. 报错:找不到HDFS
        这里写图片描述
      3. 解决:修改oozie-site.xml 读取hadoop的配置文件

        <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>
        
      4. 重启oozie,重新运行
        这里写图片描述
    4. 运行成功
      1. 运行命令中的job.properties指的是本地,建议,本地修改后,将修改后的上传(使本地与HDFS一致)
      2. oozie中的workflow默认会启动一个map程序oozie:launcher,用于对job的封装,只有map任务
  4. 步骤总结
    1. 检测环境:sharelib
    2. 运行命令
      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:定义你的任务流:如果有修改,必须重新上传
    3. 运行
      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的地址,添加自定义的变量

      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
      
    2. workflow.xml:配置可以在yarn上查找
      这里写图片描述

      -》driver自定义的实现
          -》队列名称
          -》map和reduce的类
          -》输入输出目录
          -》shuffle
          -》输出的类型 
  6. 6. 替换lib目录下jar包

    1. cp /opt/datas/wc2.jar wc-wf/lib/
    2. 这里写图片描述
  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. 这里写图片描述
        查看错误:[beifeng@hadoop-senior01 oozie-4.0.0-cdh5.3.6]$ more logs/oozie.log

        workflow.xml设置:
        这里写图片描述
        mapred.mapper.new-api=true
        mapred.reducer.new-api=true

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

      1. 重新上传:

        bin/hdfs dfs -rm -r application/wc-wf
        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. 运行结果
      这里写图片描述
      这里写图片描述
  8. workflow.xml代码

    <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>
    

三、shell action

  1. 拷贝官方案例到application

    [beifeng@hadoop-senior01 application]$ cp -r ../examples/apps/shell/ ./
    重命名:mv shell/ sh-wf
  2. 编写脚本

    1. 头一定要写,一定要写对 #! /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
  3. 编写job.properties和workflow

    1. job.properties

      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   
    2. workflow

      <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>
  4. 上传运行

    1. 上传
      bin/hdfs dfs -put /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/application/sh-wf/ application/
      这里写图片描述
    2. 运行

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

      这里写图片描述

  5. 注意问题

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

四、复杂DAG图的简单实现

  1. 使用workflow实现Mapreduce与shell脚本,功能为先实现Mapreduce的wordcount,然后使用shell脚本将结果文件复制到hdfs的根目录
  2. job.properties
  3. workflow.xml :主要是在结束时进入
  4. oozie.sh
  5. 流程图
    这里写图片描述

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

  1. 基于时间的调度
    1. 起始时间
    2. 调度频率
    3. 终止时间
  2. 基于数据可用性的调度
  3. 调整时区

    1. 检查时区,修改Linux时区
      1. 查看指令:date -R
      2. 正常:+0800
        这里写图片描述
      3. 不正常:

        -》删除当前时区
        sudo rm -rf /etc/localtime
        -》重建(软连接)
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
        -》重新检测
    2. 修改oozie的时区:在oozie-site.xml添加

      <property>
      <name>oozie.processing.timezone</name>
      <value>GMT+0800</value>
      </property>
    3. 重启oozie
    4. 界面中检测时区
      修改oozie-server/webapps/oozie/oozie-console.js
      getTimezone方法中的GMT为GMT+0800
      清空一下浏览器的缓存,刷新查看
      这里写图片描述
    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. 指令

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

      这里写图片描述

    2. 运行时间:包头不包尾(不包括结尾的时间)
      这里写图片描述
    3. 运行是提示最小时间不能设置为2,在oozie-site.xml添加下面参数为false
      oozie.service.coord.check.maximum.frequency
  6. Linux crontab的格式
    1. coordinator.xml 文件中:frequency=”/1 * * *”
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值