前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大数据技术之_14_Oozie学习

大数据技术之_14_Oozie学习

作者头像
黑泽君
发布2019-03-19 15:07:10
9890
发布2019-03-19 15:07:10
举报
文章被收录于专栏:黑泽君的专栏黑泽君的专栏

第1章 Oozie 的简介

  Oozie 英文翻译为:驯象人。一个基于工作流引擎的开源框架,由 Cloudera 公司贡献给 Apache,提供对 Hadoop MapReduce、Pig Jobs 的任务调度与协调。Oozie 需要部署到 Java Servlet 容器中运行。主要用于定时调度任务,多任务可以按照执行的逻辑顺序调度。

第2章 Oozie 的功能模块介绍

2.1 模块

1) Workflow   顺序执行流程节点,支持 fork(分支多个节点),join(合并多个节点为一个)。 2) Coordinator   定时触发 Workflow。 3) Bundle Job   绑定多个 Coordinator。

2.2 常用节点

1) 控制流节点(Control Flow Nodes)   控制流节点一般都是定义在工作流开始或者结束的位置,比如:start、end、kill 等。以及提供工作流的执行路径机制,比如:decision、fork、join 等。 2) 动作节点(Action Nodes)   负责执行具体动作的节点,比如:拷贝文件,执行某个Shell脚本等等。

第3章 Oozie 的部署

3.1 部署 Hadoop(CDH版本的)

3.1.1 解压缩 CDH 版本的 hadoop

先将

代码语言:javascript
复制
hadoop-2.5.0-cdh5.3.6.tar.gz
oozie-4.0.0-cdh5.3.6.tar.gz
ext-2.2.zip
cdh5.3.6-snappy-lib-natirve.tar.gz

拷贝至 Linux 的 /opt/software目录下 解压 CDH 版本的 hadoop 至 /opt/module/cdh 目录下 解压 oozie 至 /opt/module/ 目录下

代码语言:javascript
复制
[atguigu@hadoop102 software]$ tar -zxf hadoop-2.5.0-cdh5.3.6.tar.gz -C /opt/module/cdh/
[atguigu@hadoop102 software]$ tar -zxf oozie-4.0.0-cdh5.3.6.tar.gz -C /opt/module/
3.1.2 修改 CDH 版本的 Hadoop 配置

详情如下:

代码语言:javascript
复制
[atguigu@hadoop102 hadoop]$ vim hadoop-env.sh
[atguigu@hadoop102 hadoop]$ vim mapred-env.sh
[atguigu@hadoop102 hadoop]$ vim yarn-env.sh

这三个文件都增加JAVA_HOME
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144

core-site.xml

代码语言:javascript
复制
        <!-- 指定HDFS中NameNode的地址 -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop102:8020</value>
        </property>

        <!-- 指定Hadoop运行时产生文件的存储目录 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/module/cdh/hadoop-2.5.0-cdh5.3.6/data/tmp</value>
        </property>

        <!-- Oozie Server的Hostname -->
        <property>
                <name>hadoop.proxyuser.atguigu.hosts</name>
                <value>*</value>
        </property>
        <!-- 允许被Oozie代理的用户组 -->
        <property>
                <name>hadoop.proxyuser.atguigu.groups</name>
                <value>*</value>
        </property>

hdfs-site.xml

代码语言:javascript
复制
        <!-- 指定HDFS副本的数量,默认是3个,学习阶段设置为1个 -->
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>

        <!-- 指定Hadoop辅助名称节点主机配置 -->
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>hadoop104:50090</value>
        </property>

mapred-site.xml

代码语言:javascript
复制
        <!-- 指定MR运行在YARN上 -->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>

        <!-- 历史服务器端地址 -->
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>hadoop102:10020</value>
        </property>

        <!-- 历史服务器web端地址 -->
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>hadoop102:19888</value>
        </property>

yarn-site.xml

代码语言:javascript
复制
        <!-- Reducer获取数据的方式 -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>

        <!-- 指定YARN的ResourceManager的地址 -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop103</value>
        </property>

        <!-- 日志聚集功能使能 -->
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>

        <!-- 日志保留时间设置7天 -->
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>

        <!-- 指定yarn在启动的时候的内存大小 -->
        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.scheduler.minimum-allocation-mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-pmem-ratio</name>
                <value>2.1</value>
        </property>
        <property>
                <name>mapred.child.java.opts</name>
                <value>-Xmx1024m</value>
        </property>

slave

代码语言:javascript
复制
hadoop102
hadoop103
hadoop104

完成后:记得scp同步到其他机器节点。(即配置分发)

代码语言:javascript
复制
[atguigu@hadoop102 module]$ pwd
/opt/module
[atguigu@hadoop102 module]$ xsync cdh/
3.1.3 格式化 CDH 版的 Hadoop 集群
代码语言:javascript
复制
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ bin/hdfs namenode -format
3.1.4 启动 CDH 版的 Hadoop 集群
代码语言:javascript
复制
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ pwd
/opt/module/cdh/hadoop-2.5.0-cdh5.3.6
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ sbin/start-dfs.sh
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ sbin/start-yarn.sh
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ sbin/mr-jobhistory-daemon.sh start historyserver

注意:需要开启 JobHistoryServer, 最好执行一个 MR 任务进行测试。 网页查看:http://hadoop102:50070/

3.2 部署 Oozie

3.2.1 解压 Oozie
代码语言:javascript
复制
[atguigu@hadoop102 software]$ tar -zxf oozie-4.0.0-cdh5.3.6.tar.gz -C /opt/module/
3.2.2 在 oozie 根目录下解压 oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz
代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ pwd
/opt/module/oozie-4.0.0-cdh5.3.6
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxf oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz -C  ../

完成后 oozie 目录下会出现 hadooplibs 目录。

3.2.3 在 oozie 目录下创建 libext 目录
代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ mkdir libext/
3.2.4 拷贝依赖的 Jar 包

1)将 hadooplibs 里面的 jar 包,拷贝到 libext 目录下:

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -ra hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6/* ./libext/

2)拷贝 Mysql 驱动包到 libext 目录下

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -r /opt/software/mysql-libs/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar ./libext/
3.2.5 将 ext-2.2.zip 拷贝到 libext/ 目录下

ext 是一个 js 框架,用于展示 oozie 前端页面:

代码语言:javascript
复制
atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -a /opt/software/ext-2.2.zip ./libext/
3.2.6 修改 oozie 配置文件

oozie-site.xml

代码语言:javascript
复制
属性:oozie.service.JPAService.jdbc.driver
属性值:com.mysql.jdbc.Driver
解释:JDBC 的驱动

属性:oozie.service.JPAService.jdbc.url
属性值:jdbc:mysql://hadoop102:3306/oozie
解释:oozie所需的数据库地址

属性:oozie.service.JPAService.jdbc.username
属性值:root
解释:数据库用户名

属性:oozie.service.JPAService.jdbc.password
属性值:123456
解释:数据库密码

属性:oozie.service.HadoopAccessorService.hadoop.configurations
属性值:*=/opt/module/cdh/hadoop-2.5.0-cdh5.3.6/etc/hadoop
解释:让 Oozie 引用 Hadoop 的配置文件
3.2.7 在 Mysql 中创建 oozie 的数据库

进入 Mysql 并创建 oozie 数据库:

代码语言:javascript
复制
$ mysql -uroot -p123456
mysql> create database oozie;
mysql> show databases;
3.2.8 初始化 oozie

1)上传 oozie 目录下的 yarn.tar.gz 文件到 HDFS: 提示:yarn.tar.gz 文件会自行解压。

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie-setup.sh sharelib create -fs hdfs://hadoop102:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz

执行成功之后,去 http://hadoop102:50070 检查对应目录有没有文件生成。如下图所示:

2)创建 oozie.sql 文件

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/ooziedb.sh create -sqlfile oozie.sql -run

3)打包项目,生成 war 包

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie-setup.sh prepare-war
3.2.9 oozie 的启动与关闭

启动命令如下:

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh start

关闭命令如下:

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh stop
3.2.10 访问 oozie 的 Web 页面

  http://hadoop102:11000/oozie

第4章 Oozie 的使用案列

4.1 案例一:Oozie 调度 shell 脚本

目标:使用 Oozie 调度 Shell 脚本 分步实现: 1)解压官方案例模板

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxvf oozie-examples.tar.gz

2)创建工作目录

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ mkdir oozie-apps/

3)拷贝任务模板到 oozie-apps/ 目录

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -r examples/apps/shell/ oozie-apps

4)编写脚本p1.sh

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ vim oozie-apps/shell/p1.sh

内容如下:

代码语言:javascript
复制
#!/bin/bash
/bin/date > /opt/module/p1.log

5)修改job.properties和workflow.xml文件 job.properties

代码语言:javascript
复制
# HDFS地址
nameNode=hdfs://hadoop102:8020
# ResourceManager地址(即yarn的地址)
jobTracker=hadoop103:8032
# 队列名称
queueName=default
examplesRoot=oozie-apps

oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell

EXEC1=p1.sh

workflow.xml

代码语言:javascript
复制
<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>${EXEC1}</exec>
        <!-- <argument>my_output=Hello Oozie</argument> -->
        <file>/user/atguigu/oozie-apps/shell/${EXEC1}#${EXEC1}</file>

        <capture-output/>
    </shell>
    <ok to="end"/>
    <error to="fail"/>
</action>
<kill name="fail">
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output">
    <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>

6)上传任务配置

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hadoop fs -put ./oozie-apps/ /user/atguigu

7)执行任务

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config ./oozie-apps/shell/job.properties -run

8)杀死某个任务

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -kill 0000004-170425105153692-oozie-z-W

4.2 案例二:Oozie 逻辑调度执行多个 Job

目标:使用 Oozie 执行多个 Job 调度 分步执行: 1)解压官方案例模板

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxf oozie-examples.tar.gz

2)编写脚本

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ vim oozie-apps/shell/p2.sh

内容如下:

代码语言:javascript
复制
#!/bin/bash
/bin/date > /opt/module/p2.log

3)修改job.properties和workflow.xml文件 job.properties

代码语言:javascript
复制
nameNode=hdfs://hadoop102:8020
jobTracker=hadoop103:8032
queueName=default
examplesRoot=oozie-apps

oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell

EXEC1=p1.sh
EXEC2=p2.sh

workflow.xml

代码语言:javascript
复制
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
    <start to="shell-node1"/>
    <action name="shell-node1">
        <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>${EXEC1}</exec>
            <!-- <argument>my_output=Hello Oozie</argument> -->
            <file>/user/atguigu/oozie-apps/shell/${EXEC1}#${EXEC1}</file>

            <capture-output/>
        </shell>
        <ok to="shell-node2"/>
        <error to="fail"/>
    </action>
    <action name="shell-node2">
        <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>${EXEC2}</exec>
            <!-- <argument>my_output=Hello Oozie</argument> -->
            <file>/user/atguigu/oozie-apps/shell/${EXEC2}#${EXEC2}</file>

            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
        <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

4)上传任务配置

代码语言:javascript
复制
$ bin/hadoop fs -rmr /user/atguigu/oozie-apps/
$ bin/hadoop fs -put oozie-apps/map-reduce /user/atguigu/oozie-apps

5)执行任务

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config ./oozie-apps/shell/job.properties -run

4.3 案例三:Oozie 调度 MapReduce 任务

目标:使用 Oozie 调度 MapReduce 任务 分步执行: 0)准备测试数据

代码语言:javascript
复制
[atguigu@hadoop102 datas]$ pwd
/opt/module/datas
[atguigu@hadoop102 datas]$ vim wordcount.txt

[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ pwd
/opt/module/cdh/hadoop-2.5.0-cdh5.3.6
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ bin/hadoop fs -mkdir /input
[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ bin/hadoop fs -put /opt/module/datas/wordcount.txt /input/wordcount.txt

1)找到一个可以运行的 mapreduce 任务的 jar 包(可以用官方的,也可以是自己写的) 2)拷贝官方模板到 oozie-apps

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -r /opt/module/oozie-4.0.0-cdh5.3.6/examples/apps/map-reduce/ ./oozie-apps/

3)测试一下 wordcount 在 yarn 中的运行

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /input/ /output/

4)配置 map-reduce 任务的 job.properties 以及 workflow.xml 文件 job.properties

代码语言:javascript
复制
nameNode=hdfs://hadoop102:8020
jobTracker=hadoop103:8032
queueName=default
examplesRoot=oozie-apps

#hdfs://hadoop102:8020/user/atguigu/oozie-apps/map-reduce/workflow.xml
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/map-reduce/workflow.xml

outputDir=map-reduce

workflow.xml

代码语言:javascript
复制
<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}/output/"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>

                <!-- 配置调度MR任务时,使用新的API -->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>

                <!-- 指定Job Key输出类型 -->
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
                <!-- 指定Job Value输出类型 -->
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>

                <!-- 指定输入路径 -->
                <property>
                    <name>mapred.input.dir</name>
                    <value>/input/</value>
                </property>
                <!-- 指定输出路径 -->
                <property>
                    <name>mapred.output.dir</name>
                    <value>/output/</value>
                </property>

                <!-- 指定Map类 -->
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>

                <!-- 指定Reduce类 -->
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>

                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</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>

5)拷贝待执行的 jar 包到 map-reduce 的 lib 目录下

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -a /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar ./oozie-apps/map-reduce/lib

6)上传配置好的 app 文件夹到 HDFS

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put ./oozie-apps/map-reduce/ /user/atguigu/oozie-apps

7)执行任务

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config ./oozie-apps/map-reduce/job.properties -run

4.4 案例四:Oozie 定时任务/循环任务

目标:Coordinator 周期性调度任务 分步实现: 1)配置 Linux 时区以及时间服务器 2)检查系统当前时区

代码语言:javascript
复制
# date -R

注意:如果显示的时区不是 +0800,删除 localtime 文件夹后,再关联一个正确时区的链接过去,命令如下:

代码语言:javascript
复制
# rm -rf /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

同步时间:

代码语言:javascript
复制
# ntpdate pool.ntp.org

修改NTP配置文件:

代码语言:javascript
复制
# vim /etc/ntp.conf

去掉下面这行前面的#,并把网段修改成自己的网段:
restrict 192.168.25.0 mask 255.255.255.0 nomodify notrap

注释掉以下几行:
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org

把下面两行前面的#号去掉,如果没有这两行内容,需要手动添加
server  127.127.1.0    # local clock
fudge  127.127.1.0 stratum 10

重启 NTP 服务:

代码语言:javascript
复制
# systemctl start ntpd.service
注意,如果是centOS7以下的版本,使用命令:service ntpd start

# systemctl enable ntpd.service
注意,如果是centOS7以下的版本,使用命令:chkconfig ntpd on

集群其他节点去同步这台时间服务器时间。步骤如下: 首先需要关闭这两台计算机的 ntp 服务:

代码语言:javascript
复制
# systemctl stop ntpd.service,
centOS7以下,则:service ntpd stop

# systemctl disable ntpd.service,
centOS7以下,则:chkconfig ntpd off

查看 ntp 服务状态

代码语言:javascript
复制
# systemctl status ntpd     查看ntp服务状态
# pgrep ntpd                查看ntp服务进程id

同步第一台服务器 hadoop102 的时间:

代码语言:javascript
复制
# ntpdate hadoop102

使用 root 用户制定计划任务,周期性同步时间:

代码语言:javascript
复制
# crontab -e
*/10 * * * * /usr/sbin/ntpdate hadoop102

重启定时任务:

代码语言:javascript
复制
# systemctl restart crond.service,
centOS7以下使用:service crond restart, 

其他台机器的配置同理。

3)配置 oozie-site.xml 文件

代码语言:javascript
复制
属性:oozie.processing.timezone
属性值:GMT+0800
解释:修改时区为东八区区时

:该属性去 oozie-default.xml 中找到即可。 4)修改 js 框架中的关于时间设置的代码

代码语言:javascript
复制
$ vim /opt/module/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie/oozie-console.js

修改如下:

代码语言:javascript
复制
function getTimeZone() {
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    return Ext.state.Manager.get("TimezoneId","GMT+0800");
}

5)重启 oozie 服务,并重启浏览器(一定要注意清除缓存)

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh stop
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh start

6)拷贝官方模板配置定时任务

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -r examples/apps/cron/ ./oozie-apps/

7)修改模板 job.properties 和 coordinator.xml 以及 workflow.xml 文件 job.properties

代码语言:javascript
复制
nameNode=hdfs://hadoop102:8020
jobTracker=hadoop103:8032
queueName=default
examplesRoot=oozie-apps

oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron

#start:必须设置为未来时间,否则任务失败
start=2019-03-12T18:35+0800
end=2019-03-12T18:50+0800

workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron

EXEC3=p3.sh

coordinator.xml

代码语言:javascript
复制
<coordinator-app name="cron-coord" frequency="${coord:minutes(5)}" start="${start}" end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.2">
    <action>
        <workflow>
            <app-path>${workflowAppUri}</app-path>
            <configuration>
                <property>
                    <name>jobTracker</name>
                    <value>${jobTracker}</value>
                </property>
                <property>
                    <name>nameNode</name>
                    <value>${nameNode}</value>
                </property>
                <property>
                    <name>queueName</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>

workflow.xml

代码语言:javascript
复制
<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">
<start to="p3-shell-node"/>
  <action name="p3-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>${EXEC3}</exec>
          <!-- <argument>my_output=Hello Oozie</argument>-->
          <file>/user/atguigu/oozie-apps/cron/${EXEC3}#${EXEC3}</file>

          <capture-output/>
      </shell>
      <ok to="end"/>
      <error to="fail"/>
  </action>
<kill name="fail">
    <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output">
    <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>

8)上传配置

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ /opt/module/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/cron/ /user/atguigu/oozie-apps

9)启动任务

代码语言:javascript
复制
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie job -oozie http://hadoop102:11000/oozie -config ./oozie-apps/cron/job.properties -run

注意:Oozie 允许的最小执行任务的频率是 5 分钟。

第5章 常见问题总结

1)Mysql权限配置 授权所有主机可以使用root用户操作所有数据库和数据表

代码语言:javascript
复制
mysql> grant all on *.* to root@'%' identified by '000000';
mysql> flush privileges;
mysql> exit;

2)workflow.xml 配置的时候不要忽略file属性

3)jps查看进程时,注意有没有 Bootstrap 进程

4)关闭 oozie   如果 bin/oozied.sh stop 无法关闭,则可以使用 kill -9 [pid],之后 oozie-server/temp/xxx.pid 文件一定要删除。

5)Oozie 重新打包时,一定要注意先关闭进程,删除对应文件夹下面的pid文件。(可以参考第4条目)

6)配置文件一定要生效   起始标签和结束标签无对应则不生效,配置文件的属性写错了,那么则执行默认的属性。

7)libext 下边的 jar 存放于某个文件夹中,导致 share/lib 创建不成功。

8)调度任务时,找不到指定的脚本,可能是 oozie-site.xml 里面的 hadoop 配置文件没有关联上。

9)修改 hadoop 配置文件,需要重启集群。一定要记得 scp 到其他节点。(即配置分发)

10)JobHistoryServer 必须开启,集群要重启的。

11)Mysql 配置如果没有生效的话,默认使用 derby 数据库。

12)在本地修改完成的job配置,必须重新上传到 HDFS。

13)将 HDFS 中上传的 oozie 配置文件下载下来查看是否有错误。

14)Linux 用户名和 hadoop 的用户名不一致。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第1章 Oozie 的简介
  • 第2章 Oozie 的功能模块介绍
    • 2.1 模块
      • 2.2 常用节点
      • 第3章 Oozie 的部署
        • 3.1 部署 Hadoop(CDH版本的)
          • 3.1.1 解压缩 CDH 版本的 hadoop
          • 3.1.2 修改 CDH 版本的 Hadoop 配置
          • 3.1.3 格式化 CDH 版的 Hadoop 集群
          • 3.1.4 启动 CDH 版的 Hadoop 集群
        • 3.2 部署 Oozie
          • 3.2.1 解压 Oozie
          • 3.2.2 在 oozie 根目录下解压 oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz
          • 3.2.3 在 oozie 目录下创建 libext 目录
          • 3.2.4 拷贝依赖的 Jar 包
          • 3.2.5 将 ext-2.2.zip 拷贝到 libext/ 目录下
          • 3.2.6 修改 oozie 配置文件
          • 3.2.7 在 Mysql 中创建 oozie 的数据库
          • 3.2.8 初始化 oozie
          • 3.2.9 oozie 的启动与关闭
          • 3.2.10 访问 oozie 的 Web 页面
      • 第4章 Oozie 的使用案列
        • 4.1 案例一:Oozie 调度 shell 脚本
          • 4.2 案例二:Oozie 逻辑调度执行多个 Job
            • 4.3 案例三:Oozie 调度 MapReduce 任务
              • 4.4 案例四:Oozie 定时任务/循环任务
              • 第5章 常见问题总结
              相关产品与服务
              专用宿主机
              专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档