您的位置:首页 > 其它

Oozie实例

2016-12-09 16:57 169 查看

一、运行官方实例

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

tar -zxvf oozie-examples.tar.gz


解压完成后会创建一个examples文件夹

将程序上传到HDFS的家目录

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




运行官方mapreduce

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

需要修改:

nameNode=hdfs://hadoop-senior01.ibeifeng.com:8020
jobTracker=hadoop-senior01.ibeifeng.com:8032


workflow.xml(真正需要自己写的内容,Oozie的核心)

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


运行程序

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




报错:找不到HDFS



解决:修改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>


重启oozie,重新运行



运行成功

运行命令中的job.properties指的是本地,建议,本地修改后,将修改后的上传(使本地与HDFS一致)

oozie中的workflow默认会启动一个map程序oozie:launcher,用于对job的封装,只有map任务

步骤总结

检测环境:sharelib

运行命令

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


job.properties的功能:a.对变量的定义;b.指向要运行的workflow的地址

workflow.xml:定义你的任务流:如果有修改,必须重新上传

运行

运行workflow.xml

jar包

二、自定义实现workflow

实现Wordcount的workflow

创建HDFS目录及上传文件

bin/hdfs dfs -mkdir /input


bin/hdfs dfs -put /opt/datas/wc.input /input


打包测试jar包

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


准备工作

Oozie下创建:
mkdir application


进入application目录,先拷贝一份示例到当前目录下:
cp -r ../examples/apps/map-reduce/ ./


重命名文件夹:
mv map-reduce/ wc-wf


编写workflow

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


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



-》driver自定义的实现
-》队列名称
-》map和reduce的类
-》输入输出目录
-》shuffle
-》输出的类型


6. 替换lib目录下jar包

cp /opt/datas/wc2.jar wc-wf/lib/




上传运行

上传文件到hdfs用户目录:

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


第一种运行方式:

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


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

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


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



查看错误:[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

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

重新上传:

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/


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


运行结果





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

拷贝官方案例到application

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


编写脚本

头一定要写,一定要写对 #! /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


编写job.properties和workflow

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


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>


上传运行

上传

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




运行

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




注意问题

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

四、复杂DAG图的简单实现

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

job.properties

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

oozie.sh

流程图



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

基于时间的调度

起始时间

调度频率

终止时间

基于数据可用性的调度

调整时区

检查时区,修改Linux时区

查看指令:date -R

正常:+0800



不正常:

-》删除当前时区

sudo rm -rf /etc/localtime

-》重建(软连接)

ln -sf /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime

-》重新检测


修改oozie的时区:在oozie-site.xml添加

<property>
<name>oozie.processing.timezone</name>
<value>GMT+0800</value>
</property>


重启oozie

界面中检测时区

修改oozie-server/webapps/oozie/oozie-console.js

getTimezone方法中的GMT为GMT+0800

清空一下浏览器的缓存,刷新查看



调整linux时间

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


关于时间调度的workflow

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

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

workflow.xml

运行

指令

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




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



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

oozie.service.coord.check.maximum.frequency


Linux crontab的格式

coordinator.xml 文件中:frequency=”/1 * * *”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Oozie