Oozie簡單配置與使用


1、Oozie英文翻譯

  馴象人
2、Oozie簡介
  一個基於工作流引擎的開源框架,由Cloudera公司貢獻給Apache,提供對Hadoop Mapreduce、Pig Jobs的任務調度與協調。
  Oozie需要部署到Java Servlet容器中運行。
3、Oozie在集群中扮演的角色
  定時調度任務,多任務可以按照執行的邏輯順序調度。
4、Oozie的功能模塊
  4.1、Workflow
    順序執行流程節點,支持fork(分支多個節點),join(合並多個節點為一個)
  4.2、Coordinator
    定時觸發workflow
  4.3、Bundle Job
    綁定多個Coordinator
5、Oozie的節點
  5.1、控制流節點(Control Flow Nodes)
    控制流節點一般都是定義在工作流開始或者結束的位置,比如start,end,kill等。以及提供工作流的執行路徑機制,
    如decision,fork,join等。
  5.2、動作節點(Action Nodes)
    就是執行具體任務動作的節點。

 

6、Oozie的安裝與部署

  6.1上傳(oozie-4.0.0-cdh5.3.6.tar.gz)並解壓(tar -zxvf oozie-4.0.0-cdh5.3.6.tar.gz -C /opt/module/)

  6.2上傳ext-2.2.zip(可視化之類的工具)(不用解壓)

  6.3修改Hadoop配置文件修改( cd /opt/module/hadoop-2.5.0-cdh5.3.6/etc/hadoop),完成后scp到其他機器節點

    6.3.1修改core-site.xml(vim  core-site.xml ),在最后添加

            <!-- Oozie Server的Hostname 允許代理的用戶-->
                    <property>
                        <name>hadoop.proxyuser.jokerq.hosts</name>
                        <value>*</value>
                      </property>

                    <!-- 允許被Oozie代理的用戶組 -->
                      <property>
                        <name>hadoop.proxyuser.jokerq.groups</name>
                            <value>*</value>
                      </property>

    6.3.2配置JobHistoryServer服務(必須,如果原來已經不用配置,檢查是否配置)

      6.3.2.1修改mapred-site.xml(vim  mapred-site.xml),在最后添加

<!-- 配置 MapReduce JobHistory Server 地址 ,默認端口10020 -->
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>hadoop201:10020</value>
        </property>

        <!-- 配置 MapReduce JobHistory Server web ui 地址, 默認端口19888 -->
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>hadoop201:19888</value>
        </property>

 

      6.3.2.2修改yarn-site.xml(vim  yarn-site.xml)(已經修改過),在最后添加

              <!-- 任務歷史服務 -->
                         <property> 
                            <name>yarn.log.server.url</name> 
                            <value>http://hadoop201:19888/jobhistory/logs/</value> 
                        </property> 

    6.4同步到其他機器節點(同步整個etc文件操作)

      

cd ../..
scp -r etc/ hadoop202:/opt/module/hadoop-2.5.0-cdh5.3.6/
scp -r etc/ hadoop203:/opt/module/hadoop-2.5.0-cdh5.3.6/

  6.4開啟Hadoop集群

    $ sh ~/start-cluster.sh(啟動腳本)
    *尖叫提示:需要配合開啟JobHistoryServer (啟動命令:mr-jobhistory-daemon.sh start historyserver)

  6.5  最好執行一個MR任務進行測試(在hadoop202中執行此命令(mapreduce機器))。

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /input/ /output111/

    啟動后在http://192.168.25.202:8088/中查看點擊History跳轉成功即可

  

 

  6.7解壓oozie目錄下的hadooplibs到oozie所在的目錄(解壓成功后文件夾會生成在oozie目錄下hadooplibs/)

 tar -zxvf /opt/module/oozie-4.0.0-cdh5.3.6/oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz -C /opt/module/ 

  6.8在oozie目錄下創建創建libext文件夾(mkdir libext/)

  6.9拷貝一些依賴的Jar包到libext目錄下

    6.9.1進入到hadooplibs下的hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6目錄

cd /opt/module/oozie-4.0.0-cdh5.3.6/hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6

    6.9.2拷貝當前文件夾所有到libext目錄下

cp * /opt/module/oozie-4.0.0-cdh5.3.6/libext/

    6.9.3拷貝Mysql驅動包到libext目錄下

cd /opt/software/mysql-connector-java-5.1.27

    6.9.4拷貝驅動包

cp -a mysql-connector-java-5.1.27-bin.jar /opt/module/oozie-4.0.0-cdh5.3.6/libext/

  6.10將ext-2.2.zip拷貝到libext/目錄下

 cp -a /opt/software/ext-2.2.zip /opt/module/oozie-4.0.0-cdh5.3.6/libext/

  6.11修改Oozie配置文件

    6.11.1 進入oozie的conf目錄下(cd /opt/module/oozie-4.0.0-cdh5.3.6/conf/)

    6.11.2修改 (vim oozie-site.xml )

修改以下name對應的value:
            ** JDBC驅動 oozie.service.JPAService.jdbc.driver com.mysql.jdbc.Driver ** Mysql的oozie數據庫的配置 一會需要手動創建此oozie數據庫 oozie.service.JPAService.jdbc.url jdbc:mysql://192.168.25.201:3306/oozie ** 數據庫用戶名 oozie.service.JPAService.jdbc.username root ** 數據庫密碼 oozie.service.JPAService.jdbc.password 123456 ** 讓Oozie引用Hadoop的配置文件 修改路徑為hadoop配置文件的路徑 oozie.service.HadoopAccessorService.hadoop.configurations *=/opt/module/hadoop-2.5.0-cdh5.3.6/etc/hadoop

 

  6.12在Mysql中創建Oozie的數據庫

    6.12.1進入數據庫( mysql -uroot -p123456)

    6.12.2創建數據庫(mysql> create database oozie;)

  6.13初始化Oozie的配置

    6.13.1上傳Oozie目錄下的yarn.tar.gz文件到HDFS(尖叫提示:yarn.tar.gz文件會自行解壓)

cd /opt/module/oozie-4.0.0-cdh5.3.6/
bin/oozie-setup.sh sharelib create -fs hdfs://hadoop201:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz 
(執行成功之后,去50070檢查對應目錄有沒有文件生成。)

 

    6.13.2創建oozie.sql文件

bin/oozie-setup.sh db create -run -sqlfile oozie.sql

    6.13.3打包項目,生成war包(Oozie停止狀態)

bin/oozie-setup.sh prepare-war

  6.14啟動Oozie服務

 bin/oozied.sh start
(關閉Oozie服務:$ bin/oozied.sh stop)

  6.15訪問Oozie的Web頁面

 

 

案例

一、案例一    使用Oozie調度Shell腳本

1.進入(cd /opt/module/oozie-4.0.0-cdh5.3.6/)

2.解壓官方案例模板

tar -zxvf oozie-examples.tar.gz

3.    創建oozie-apps文件夾(mkdir oozie-apps)

4.拷貝文件到文件夾下

cp -r examples/apps/shell/ oozie-apps/

5.進入文件夾(cd  oozie-apps/shell/)

6.隨便編寫一個腳本p1.sh  (vi p1.sh),添加如下測試內容

#!/bin/bash
/usr/sbin/ifconfig > /tmp/p1.log

7.編輯job.properties( vim job.properties )修改如下內容

 

 

8.修改workflow.xml   (vim   workflow.xml)

(<file>/ser/jokerq/oozie-apps/shell/${EXEC}#${EXEC}</file>)

9.上傳任務配置

/opt/module/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps /user/jokerq

10.執行任務

cd /opt/module/oozie-4.0.0-cdh5.3.6/
bin/oozie job -oozie http://hadoop201:11000/oozie -config oozie-apps/shell/job.properties -run

 

在mapreduce的8088可以查看

11.想要殺死某個任務

bin/oozie job -oozie http://hadoop201:11000/oozie -kill 0000000-181230182825159-oozie-joke-W

 

案例二   執行多個Job調度

 1.解壓官方案例模板,創建文件夾等操作(上面已經執行)

2.   進入(cd /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/shell)

3.創建測試腳本p1.sh(vim p1.sh),添加如下

#!/bin/bash
/usr/bin/date > /tmp/p1.log

4.創建測試腳本p2.sh(vim p2.sh),添加如下

#!/bin/bash
/usr/bin/date > /tmp/p2.log

5.編輯job.properties

6.編輯workflow.xml(添加一個action,一個action對應一個腳本)

 

7.上傳

(先刪除上個案例留下的)/opt/module/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -rmr /user/jokerq/oozie-apps
/opt/module/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps /user/jokerq

8.執行

cd /opt/module/oozie-4.0.0-cdh5.3.6/
bin/oozie job -oozie http://hadoop201:11000/oozie -config oozie-apps/shell/job.properties -run

 

 

 

案例三 調度MapReduce任務

1.先編寫一個可以運行的MR任務的.jar包(此處拷貝mapredurce的例子jar包)

cp -a /opt/module/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar /opt/module/oozie-4.0.0-cdh5.3.6/

2.進入 oozie目錄(  cd /opt/module/oozie-4.0.0-cdh5.3.6/)

3.拷貝官方模板到oozie-apps

cp -r /opt/module/oozie-4.0.0-cdh5.3.6/examples/apps/map-reduce/ /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/

4.測試一下wordcount在yarn中的運行

/opt/module/hadoop-2.5.0-cdh5.3.6/bin/yarn jar hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /input/ /ouput111/

5.配置job.properties(cd oozie-apps/map-reduce/   --->>>   vim job.properties )

6.配置workflow.xml (vim 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>

7.拷貝待執行的jar包到map-reduce的lib目錄下

cp -a /opt/module/oozie-4.0.0-cdh5.3.6/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar ./lib

8.上傳配置好的app文件夾到HDFS

 /opt/module/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/map-reduce/  /user/jokerq/oozie-apps

9.執行任務

cd /opt/module/oozie-4.0.0-cdh5.3.6/
bin/oozie job -oozie http://hadoop201:11000/oozie -config oozie-apps/map-reduce/job.properties -run

案例四 Coordinator周期性調度任務

1.配置Linux時區為+0800(在設置集群同步時間時設置的上海時間)

2.改oozie-default.xml文件(cd /opt/module/oozie-4.0.0-cdh5.3.6/conf    --->>>     vim oozie-default.xml ),修改oozie的時區為GMT+0800:

 

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

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

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

cd /opt/module/oozie-4.0.0-cdh5.3.6/
$ bin/oozied.sh stop $ bin/oozied.sh start

5.拷貝官方模板配置定時任務

cp -r /opt/module/oozie-4.0.0-cdh5.3.6/examples/apps/cron/ /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/

 6.進入目錄

cd /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/cron

7.修改 job.properties

nameNode=hdfs://hadoop201:8020
jobTracker=hadoop202:8032
queueName=default
examplesRoot=oozie-apps

oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron
start=2018-12-31T21:30+0800
end=2019-1-1T21:30+0800
workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron

EXEC1=p1.sh
EXEC2=p2.sh

8.修改coordinator.xml

9.修改workflow.xml

<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-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/jokerq/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/jokerq/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>

10.創建p1.sh和p2.sh測試腳本(同上一個測試腳本內容)

11.上傳配置,啟動任務(未完全成功,有bug殘留(提示時間格式不正確))

 /opt/module/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put /opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/cron/ /user/jokerq/oozie-apps
cd /opt/module/oozie-4.0.0-cdh5.3.6/
bin/oozie job -oozie http://hadoop201:11000/oozie -config oozie-apps/cron/job.properties -run

 

 

 

小問題總結:
1、Mysql權限配置
2、workflow.xml配置的時候不要忽略file屬性
3、jps查看進程時,注意有沒有bootstrap
4、關閉oozie
** bin/oozied.sh stop)如果無法關閉,則可以使用kill
** kill -9 11111
oozie-server/temp/xxx.pid文件一定要刪除
5、Oozie重新打包時,一定要注意先關閉進程,刪除對應文件夾下面的pid文件。(可以參考第4條目)
6、配置文件一定要生效
** 起始標簽和結束標簽無對應則不生效
** 配置文件的屬性寫錯了,那么則執行默認的屬性。
7、libext下邊的jar存放於某個文件夾中,導致share/lib創建不成功
8、-rmr share/lib這樣是不行的。 rm -rmr /user/admin這樣刪除是錯誤的。
9、調度任務時,找不到指定的腳本,可能是oozie-site.xml里面的Hadoop配置文件沒有關聯上
10、修改Hadoop配置文件,需要重啟集群。一定要記得scp到其他節點
11、JobHistoryServer必須開啟,集群要重啟的。
12、Mysql配置如果沒有生效的話,默認使用derby數據庫
13、在本地修改完成的job配置,必須重新上傳到HDFS
14、將HDFS上面的配置文件,下載下來查看是否有錯誤。
15、Linux用戶名和Hadoop的用戶名不一致。


免責聲明!

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



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