大數據技術之Oozie

 

第1章 Oozie簡介

Oozie英文翻譯爲:馴象人。一個基於工做流引擎的開源框架,由Cloudera公司貢獻給Apache,提供對Hadoop MapReducePig Jobs的任務調度與協調。Oozie須要部署到Java Servlet容器中運行。主要用於定時調度任務,多任務能夠按照執行的邏輯順序調度。 前端

第2章 Oozie的功能模塊介紹

2.1 模塊

1) Workflow java

順序執行流程節點,支持fork(分支多個節點),join(合併多個節點爲一個) node

2) Coordinator mysql

定時觸發workflow linux

3) Bundle Job web

綁定多個Coordinator sql

2.2 經常使用節點

1) 控制流節點(Control Flow Nodes) shell

控制流節點通常都是定義在工做流開始或者結束的位置,好比start,end,kill等。以及提供工做流的執行路徑機制,如decision,fork,join等。 數據庫

2) 動做節點(Action Nodes) apache

負責執行具體動做的節點,好比:拷貝文件,執行某個Shell腳本等等。

第3章 Oozie的部署

3.1 部署Hadoop(CDH版本的)

3.1.2 修改Hadoop配置

core-site.xml

<!-- Oozie ServerHostname -->

<property>

    <name>hadoop.proxyuser.atguigu.hosts</name>

    <value>*</value>

</property>

 

<!-- 容許被Oozie代理的用戶組 -->

<property>

    <name>hadoop.proxyuser.atguigu.groups</name>

    <value>*</value>

</property>

mapred-site.xml

<!-- 配置 MapReduce JobHistory Server 地址 ,默認端口10020 -->

<property>

<name>mapreduce.jobhistory.address</name>

<value>hadoop102:10020</value>

</property>

 

<!-- 配置 MapReduce JobHistory Server web ui 地址, 默認端口19888 -->

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>hadoop102:19888</value>

</property>

yarn-site.xml

<!-- 任務歷史服務 -->

<property>

    <name>yarn.log.server.url</name>

    <value>http://hadoop102:19888/jobhistory/logs/</value>

</property>

完成後:記得scp同步到其餘機器節點

3.1.3 重啓Hadoop集羣

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh

[atguigu@hadoop102 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver

注意:須要開啓JobHistoryServer, 最好執行一個MR任務進行測試。

3.2 部署Oozie

3.2.1 解壓Oozie

[atguigu@hadoop102 software]$ tar -zxvf /opt/software/cdh/oozie-4.0.0-cdh5.3.6.tar.gz -C ./

3.2.2 在oozie根目錄下解壓oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ tar -zxvf 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 -a /opt/software/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/cdh/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

屬性值:000000

解釋:數據庫密碼

 

屬性: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 -p000000

mysql> create database oozie;

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

執行成功以後,去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]$ vi oozie-apps/shell/p1.sh

內容以下:

#!/bin/bash

/sbin/ifconfig > /opt/module/p1.log

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

job.properties

#HDFS地址

nameNode=hdfs://hadoop102:8020

#ResourceManager地址

jobTracker=hadoop103:8032

#隊列名稱

queueName=default

examplesRoot=oozie-apps

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

EXEC=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>${EXEC}</exec>

<!-- <argument>my_output=Hello Oozie</argument> -->

<file>/user/atguigu/oozie-apps/shell/${EXEC}#${EXEC}</file>

 

<capture-output/>

</shell>

<ok to="end"/>

<error to="fail"/>

</action>

<decision name="check-output">

<switch>

<case to="end">

${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}

</case>

<default to="fail-output"/>

</switch>

</decision>

<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

  1. 編寫腳本

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ vi 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="p1-shell-node"/>

<action name="p1-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>

<file>/user/atguigu/oozie-apps/shell/${EXEC1}#${EXEC1}</file>

<!-- <argument>my_output=Hello Oozie</argument>-->

<capture-output/>

</shell>

<ok to="p2-shell-node"/>

<error to="fail"/>

</action>

 

<action name="p2-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>${EXEC2}</exec>

<file>/user/admin/oozie-apps/shell/${EXEC2}#${EXEC2}</file>

<!-- <argument>my_output=Hello Oozie</argument>-->

<capture-output/>

</shell>

<ok to="end"/>

<error to="fail"/>

</action>

<decision name="check-output">

<switch>

<case to="end">

${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}

</case>

<default to="fail-output"/>

</switch>

</decision>

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

  1. 上傳任務配置

$ bin/hadoop fs -rmr /user/atguigu/oozie-apps/

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

  1. 執行任務

[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任務

分步執行:

1)找到一個能夠運行的mapreduce任務的jar包(能夠用官方的,也能夠是本身寫的)

2)拷貝官方模板到oozie-apps

[atguigu@hadoop102 oozie-4.0.0-cdh5.3.6]$ cp -r /opt/module/cdh/ oozie-4.0.0-cdh5.3.6/examples/apps/map-reduce/ oozie-apps/

  1. 測試一下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/admin/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/admin/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配置文件:

# vi /etc/ntp.conf

去掉下面這行前面的# ,並把網段修改爲本身的網段:

restrict 192.168.122.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

# systemctl status ntpd,查看ntp服務狀態

# pgrep ntpd,查看ntp服務進程id

同步第一臺服務器linux01的時間:

# ntpdate hadoop102

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

# crontab -e

*/10 * * * * /usr/sbin/ntpdate hadoop102

重啓定時任務:

# systemctl restart crond.service

centOS7如下使用:service crond restart

其餘臺機器的配置同理。

  1. 配置oozie-site.xml文件

屬性:oozie.processing.timezone

屬性值:GMT+0800

解釋:修改時區爲東八區區時

注:該屬性去oozie-default.xml中找到便可

  1. 修改js框架中的關於時間設置的代碼

$ vi /opt/module/cdh/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)拷貝官方模板配置定時任務\

$ 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=2017-07-29T17:00+0800

end=2017-07-30T17:00+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>

<file>/user/atguigu/oozie-apps/cron/${EXEC3}#${EXEC3}</file>

<!-- <argument>my_output=Hello Oozie</argument>-->

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

相關文章
相關標籤/搜索