大數據技術之_14_Oozie學習_Oozie 的簡介+Oozie 的功能模塊介紹+Oozie 的部署+Oozie 的使用案列


第1章 Oozie 的簡介第2章 Oozie 的功能模塊介紹2.1 模塊2.2 常用節點第3章 Oozie 的部署3.1 部署 Hadoop(CDH版本的)3.1.1 解壓縮 CDH 版本的 hadoop3.1.2 修改 CDH 版本的 Hadoop 配置3.1.3 格式化 CDH 版的 Hadoop 集群3.1.4 啟動 CDH 版的 Hadoop 集群3.2 部署 Oozie3.2.1 解壓 Oozie3.2.2 在 oozie 根目錄下解壓 oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz3.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 初始化 oozie3.2.9 oozie 的啟動與關閉3.2.10 訪問 oozie 的 Web 頁面第4章 Oozie 的使用案列4.1 案例一:Oozie 調度 shell 腳本4.2 案例二:Oozie 邏輯調度執行多個 Job4.3 案例三:Oozie 調度 MapReduce 任務4.4 案例四:Oozie 定時任務/循環任務第5章 常見問題總結


第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

先將

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/ 目錄下

[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 配置


詳情如下:
[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

        <!-- 指定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

        <!-- 指定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

        <!-- 指定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

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

hadoop102
hadoop103
hadoop104

完成后:記得scp同步到其他機器節點。(即配置分發)

[atguigu@hadoop102 module]$ pwd
/opt/module
[atguigu@hadoop102 module]$ xsync cdh/

3.1.3 格式化 CDH 版的 Hadoop 集群

[atguigu@hadoop102 hadoop-2.5.0-cdh5.3.6]$ bin/hdfs namenode -format

3.1.4 啟動 CDH 版的 Hadoop 集群

[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

[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

[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 目錄

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ mkdir libext/

3.2.4 拷貝依賴的 Jar 包

1)將 hadooplibs 里面的 jar 包,拷貝到 libext 目錄下:

[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 目錄下

[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 前端頁面:

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

屬性: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 數據庫:

$ mysql -uroot -p123456
mysql> create database oozie;
mysql> show databases;

3.2.8 初始化 oozie

1)上傳 oozie 目錄下的 yarn.tar.gz 文件到 HDFS:
提示:yarn.tar.gz 文件會自行解壓。

[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 文件
[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/ooziedb.sh create -sqlfile oozie.sql -run

3)打包項目,生成 war 包

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozie-setup.sh prepare-war

3.2.9 oozie 的啟動與關閉

啟動命令如下:

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ bin/oozied.sh start

關閉命令如下:

[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)解壓官方案例模板

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxvf oozie-examples.tar.gz

2)創建工作目錄

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ mkdir oozie-apps/

3)拷貝任務模板到 oozie-apps/ 目錄

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -r examples/apps/shell/ oozie-apps

4)編寫腳本p1.sh

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ vim oozie-apps/shell/p1.sh

內容如下:

#!/bin/bash
/bin/date > /opt/module/p1.log

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

# 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

<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)上傳任務配置

[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)執行任務

[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)殺死某個任務

[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)解壓官方案例模板

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxf oozie-examples.tar.gz

2)編寫腳本

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ vim oozie-apps/shell/p2.sh

內容如下:

#!/bin/bash
/bin/date > /opt/module/p2.log

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

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

<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)上傳任務配置

$ bin/hadoop fs -rmr /user/atguigu/oozie-apps/
$ bin/hadoop fs -put oozie-apps/map-reduce /user/atguigu/oozie-apps

5)執行任務

[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)准備測試數據

[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

[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 中的運行

[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

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

<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 目錄下

[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

[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)執行任務

[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)檢查系統當前時區

# date -R

注意:如果顯示的時區不是 +0800,刪除 localtime 文件夾后,再關聯一個正確時區的鏈接過去,命令如下:

# rm -rf /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

同步時間:

ntpdate pool.ntp.org

修改NTP配置文件:

# 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 服務:

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

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

集群其他節點去同步這台時間服務器時間。步驟如下:
首先需要關閉這兩台計算機的 ntp 服務:

# systemctl stop ntpd.service,
centOS7以下,則:service ntpd stop

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

查看 ntp 服務狀態

# systemctl status ntpd     查看ntp服務狀態
# pgrep ntpd                查看ntp服務進程id

同步第一台服務器 hadoop102 的時間:

# ntpdate hadoop102

使用 root 用戶制定計划任務,周期性同步時間:

# crontab -e
*/10 * * * * /usr/sbin/ntpdate hadoop102

重啟定時任務:

# systemctl restart crond.service,
centOS7以下使用:service crond restart, 

其他台機器的配置同理。

3)配置 oozie-site.xml 文件

屬性:oozie.processing.timezone
屬性值:GMT+0800
解釋:修改時區為東八區區時

:該屬性去 oozie-default.xml 中找到即可。
4)修改 js 框架中的關於時間設置的代碼

$ vim /opt/module/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie/oozie-console.js

修改如下:

function getTimeZone() {
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    return Ext.state.Manager.get("TimezoneId","GMT+0800");
}

5)重啟 oozie 服務,並重啟瀏覽器(一定要注意清除緩存)

[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)拷貝官方模板配置定時任務

[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

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

<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

<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)上傳配置

[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)啟動任務

[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用戶操作所有數據庫和數據表

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 的用戶名不一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM