Oozie WorkFlow中MR Action使用讲解

简介: 笔记

一、如何开发workflow


1.参考官网给我们的example

2.workflow三个关键点

   1)自定义:job.properties 
   2)自定义:workflow.xml
    <start>
    <action>
       <ok to="end"/>
       <error to="fail"/>
    </action>
    <kill>
    <end>
   3)依赖包 lib目录


二、Oozie workflow中使用MapReduce Action


目的:使用Ooize调度MapReduce程序。

方式:将以前Java MapReduce程序中的Driver部分写到workflow.xml中的configuration里面。

示例:用Oozie安装包中自带的examples例子跑wordcount程序。


第一步: 先做准备工作,根据examples模版自己开发,在oozie目录下新建一个oozie-apps目录,将examples中的map-reduce目录拷贝到oozie-apps目录下,再将oozie-apps目录下job-with-config-class.properties和workflow-with-config-class.xml两个文件删除,只留下job.properties、lib、workflow.xml这三个。


第二步: 编写job.prperties文件

内容如下:

nameNode=hdfs://bigdata-pro-m01:9000
jobTracker=bigdata-pro-m01:8032
queueName=default
oozieAppRoot=user/caizhengjie/oozie-apps
oozieDataRoot=user/caizhengjie/oozie-datas
oozie.wf.application.path=${nameNode}/${oozieAppRoot}/map-reduce/workflow.xml
outputDir=map-reduce/output
inputDir=map-reduce/input

第三步: 在HDFS上创建数据输入的目录并运行wordcount的MR程序

bin/hdfs dfs -mkdir -p /user/caizhengjie/oozie-datas/map-reduce/input

将数据放到/user/caizhengjie/oozie-datas/map-reduce/input下

bin/hdfs dfs -put /opt/datas/wordcount.txt /user/caizhengjie/oozie-datas/map-reduce/input

运行wordcount的MR程序

bin/hadoop jar /opt/jars/bigdata_study.jar /user/caizhengjie/oozie-datas/map-reduce/input/wordcount.txt /user/caizhengjie/oozie-datas/map-reduce/output

第四步: 编写workflow.xml文件

运行了MR程序之后,在19888web界面找配置项写到workflow.xml文件中。

10.png

编写workflow.xml文件,内容如下:

<workflow-app xmlns="uri:oozie:workflow:0.5" name="kfk-mr">
    <start to="mr-node"/>
    <action name="mr-node">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/${oozieDataRoot}/${outputDir}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>mapreduce.input.fileinputformat.inputdir</name>
                    <value>${nameNode}/${oozieDataRoot}/${inputDir}/wordcount.txt</value>
                </property>
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>com.kfk.hadoop.mr.WordCountMR$WordCountMapper</value>
                </property>
                <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.IntWritable</value>
                </property>
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>com.kfk.hadoop.mr.WordCountMR$WordCountReducer</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.IntWritable</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
                <property>
                    <name>mapreduce.output.fileoutputformat.outputdir</name>
                    <value>${nameNode}/${oozieDataRoot}/${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>

第五步: 将oozie-apps放在HDFS上

bin/hdfs dfs -put /opt/modules/oozie/oozie-apps /user/caizhengjie/

第六步:/user/caizhengjie/oozie-apps/map-reduce/lib里面的oozie-examples-4.1.0-cdh5.9.3.jar删除

rm -rf oozie-examples-4.1.0-cdh5.9.3.jar

第七步: 将MR的程序jar包放到opt/modules/oozie/oozie-apps/map-reduce/lib目录下

cp /opt/jars/bigdata_study.jar /opt/modules/oozie/oozie-apps/map-reduce/lib

第八步: 将oozie-apps上传到HDFS用户目录下的oozie-apps中

bin/hdfs dfs -put /opt/modules/oozie/oozie-apps/map-reduce /user/caizhengjie/oozie-apps

第九步: 运行mr action

bin/oozie job -oozie http://bigdata-pro-m01:11000/oozie -config oozie-apps/map-reduce/job.properties -run


如果要更改workflow.xml文件的话,需要将HDFS上的workflow.xml文件删除,然后重新上传

bin/hdfs dfs -rm -r /user/caizhengjie/oozie-apps/map-reduce/workflow.xml
bin/hdfs dfs -put /opt/modules/oozie/oozie-apps/map-reduce/workflow.xml /user/caizhengjie/oozie-apps/map-reduce

出现的问题:

ACTION[0000001-181019035430741-oozie-kfk-W@mr-node] Launcher exception: mapreduce.job.map.class is incompatible with map compatability mode.
java.io.IOException: mapreduce.job.map.class is incompatible with map compatability mode.

解决方法:

在workflow.xml文件中的configuration节点中加入如下的属性项配置

<property>
    <name>mapred.mapper.new-api</name>
    <value>true</value>
</property>
<property>
    <name>mapred.reducer.new-api</name>
    <value>true</value>
</property>

查看运行结果:

11.png

查看MR的运行结果

[caizhengjie@bigdata-pro-m01 hadoop]$ bin/hdfs dfs -text /user/caizhengjie/oozie-datas/map-reduce/output/part-r-00000
flink   2
hadoop  3
hbase   3
hive    4
hue     1
java    6
kafka   2
linux   1
python  4
spark   6
storm   1
unix    1
zookeeper       2
相关文章
|
存储 关系型数据库 MySQL
第9章 【MySQL】InnoDB的表空间
第9章 【MySQL】InnoDB的表空间
234 0
第9章 【MySQL】InnoDB的表空间
|
6月前
|
边缘计算 缓存 安全
CDN:互联网世界的“加速器”与“快递网”——从技术起源到未来趋势的全景解读
内容分发网络(CDN)起源于1990年代末,为解决互联网拥堵而生。通过在全球部署边缘节点,缓存静态资源以缩短传输路径,显著提升访问速度并降低服务器压力。其技术历经四个阶段演进:从早期静态缓存到动态加速、移动优化与安全防护,再到如今的智能化融合,CDN已深度嵌入视频直播、企业数字化转型等场景。未来,结合5G、物联网及Web3.0技术,CDN将从“加速器”进化为智能基础设施,持续赋能数字时代。
|
Oracle Java 关系型数据库
JDK版本特性问题之在 JDK 11 中,HTTP Client API 的特点有哪些
JDK版本特性问题之在 JDK 11 中,HTTP Client API 的特点有哪些
|
10月前
|
SQL 存储 分布式计算
Paimon助力数据湖仓架构实时化升级
本次分享由阿里云高级技术专家李劲松介绍Paimon助力数据湖仓架构实时化升级。内容涵盖四个部分:1) 数据架构的存储演进,介绍Data LakeHouse结合的优势;2) Paimon实时数据湖,强调其批流一体和高效处理能力;3) 数据湖的实时流式处理,展示Paimon在时效性提升上的应用;4) 数据湖非结构化处理,介绍Paimon对非结构化数据的支持及AI集成。Paimon通过优化存储格式和引入LSM技术,实现了更高效的实时数据处理和查询性能,广泛应用于阿里巴巴内部及各大公司,未来将进一步支持AI相关功能。
|
12月前
|
存储 数据挖掘 数据处理
Apache Paimon 是一款高性能的数据湖框架,支持流式和批处理,适用于实时数据分析
【10月更文挑战第8天】随着数据湖技术的发展,越来越多企业开始利用这一技术优化数据处理。Apache Paimon 是一款高性能的数据湖框架,支持流式和批处理,适用于实时数据分析。本文分享了巴别时代在构建基于 Paimon 的 Streaming Lakehouse 的探索和实践经验,包括示例代码和实际应用中的优势与挑战。
503 1
|
存储 缓存 NoSQL
gossip:借助流言蜚语实现数据一致性
gossip:借助流言蜚语实现数据一致性
261 11
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
在数据分析中,数据的获取是第一步。随着互联网的普及,网络爬虫成为获取数据的重要手段。本文将详细介绍如何使用Python爬取简单的网页数据。
|
存储 缓存 安全
学习服务器硬件基础知识
服务器是指一种高性能计算机,提供计算、存储和通信服务。通常运行在网络环境中,为计算机、设备或用户提供资源共享、数据存储和处理等服务。服务器可以是专门设计的硬件设备,也可以是在普通计算机上运行的特定软件。
575 6
|
消息中间件 数据挖掘 Kafka
使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流
使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流
359 2