1. 程式人生 > >Oozie介紹

Oozie介紹

tom image nat 驅動 scrip cloud track pat 源代碼

1. Hadoop常見調度框架:

(1)Linux Crontab:
Linux自帶的任務調度計劃,在任務比較少的情況下,可以使用這種方式,直接執行腳本,例如添加一個執行計劃: 0 12 * hive -f xxx.sql
(2)Azkaban:
(3)Oozie:Cloudera公司開源
(4)Zeus:阿裏開源。

Oozie是管理Hadoop作業的工作流調度系統。Oozie定義了控制流節點和動作節點。Oozie實現的功能:
(1)Workflow:順序執行流程節點;
(2)Coordinator:定時觸發workflow;
(3)Bundle Job:綁定多個Coordinator。
Work Flow流程圖:

技術分享
work flow.png


Coordinator生命周期:

技術分享
coordinator.png


Bundle:

技術分享
Bundle.png

2. Oozie安裝:

Oozie不需要設置OOZIE_HOME環境變量(系統自行計算),推薦使用單獨的用戶(而不是root)來安裝Oozie。

1.編譯源碼,解壓壓縮包:

官方文檔

如果需要對Oozie個性化修改,可以自行修改源代碼並編譯,這裏我直接使用官網編譯好的版本oozie-4.0.0-cdh5.3.6.tar.gz:

$ tar zxf oozie-4.0.0-cdh5.3.6.tar.gz -C /opt/modules/

以下配置添加到core-site.xml文件(使用用戶和hostname替換文檔中內容):
$HADOOP_HOME/etc/hadoop/core-site.xml:

<!-- OOZIE -->
<property>
    <name>hadoop.proxyuser.natty.hosts</name>
    <value>hadoop-senior01.pmpa.com</value>
</property>
<property>
    <name>hadoop.proxyuser.natty.groups</name>
    <value>*</value>
</property>

修改oozie配置文件,$OOZIE_HOME/conf/oozie-site.xml:

<property>
    <name>oozie.service.HadoopAccessorService.hadoop.configurations</name>
    <value>*=/opt/modules/hadoop-2.5.0-cdh5.3.6/etc/hadoop</value>
    <description>
        Comma separated AUTHORITY=HADOOP_CONF_DIR, where AUTHORITY is the HOST:PORT of
        the Hadoop service (JobTracker, HDFS). The wildcard ‘*‘ configuration is
        used when there is no exact match for an authority. The HADOOP_CONF_DIR contains
        the relevant Hadoop *-site.xml files. If the path is relative is looked within
        the Oozie configuration directory; though the path can be absolute (i.e. to point
        to Hadoop client conf/ directories in the local filesystem.
    </description>
</property>

在解壓oozie二進制發行包的目錄,解壓hadooplibs發行包,也就是oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz

$ tar zxf oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz -C /opt/modules/

這樣,oozie的安裝目錄多了一個hadooplibs目錄。

2.詳細配置:

啟動應該使用oozied.sh腳本,並添加,start、stop、run等參數。
在oozie的解壓目錄下創建libext目錄。並將hadooplibs下的jar包拷貝到這個目錄裏,需要註意的是hadooplibs目錄下有個文件夾hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6,hadooplib-2.5.0-mr1-cdh5.3.6.oozie-4.0.0-cdh5.3.6;後者對應於mapreduce1,所以我們拷貝第一個文件夾下的jar包即可。
拷貝extjs的壓縮包到libext目錄。

$ mkdir libext
$ cp hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6/* libext/
$ cp ext-2.2.zip /opt/modules/oozie-4.0.0-cdh5.3.6/libext/

安裝mysql數據庫,並生成相關表(oozie是一個web系統,需要自己的知識庫),所以,我們需要mysql connector驅動包,拷貝到$oozie_home/libext下。

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

(1)生成mysql數據表(oozie所需要的)。
我們可以使用 bin/oozie-setup.sh命令的“db create”參數,來操作mysql數據庫創建相應的庫和表。但在使用這個命令前,需要先給oozie關聯上mysql。下面先做關聯操作:
修改oozie的配置文件($oozie_home/conf/oozie-site.xml),配置driver、url、username、password:

    <!-- Oozie Related Mysql -->
    <property>
        <name>oozie.service.JPAService.jdbc.driver</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

    <property>
        <name>oozie.service.JPAService.jdbc.url</name>
        <value>jdbc:mysql://hadoop-senior01.pmpa.com:3306/oozie?createDatabaseIfNotExist=true</value>
    </property>

    <property>
        <name>oozie.service.JPAService.jdbc.username</name>
        <value>root</value>
    </property>

    <property>
        <name>oozie.service.JPAService.jdbc.password</name>
        <value>123456</value>
    </property>

(2)關聯好mysql之後,通過腳本創建mysql的庫表:

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

執行成功之後,登陸到mysql驗證數據庫表的創建情況:

mysql> show tables;
+------------------------+
| Tables_in_oozie        |
+------------------------+
| BUNDLE_ACTIONS         |
| BUNDLE_JOBS            |
| COORD_ACTIONS          |
| COORD_JOBS             |
| OOZIE_SYS              |
| OPENJPA_SEQUENCE_TABLE |
| SLA_EVENTS             |
| SLA_REGISTRATION       |
| SLA_SUMMARY            |
| VALIDATE_CONN          |
| WF_ACTIONS             |
| WF_JOBS                |
+------------------------+
12 rows in set (0.00 sec)

(3)下面生成war包,供tomcat訪問:

$ bin/oozie-setup.sh prepare-war

命令執行成功後,會提示war包已經生成在webapps目錄下:New Oozie WAR file with added ‘ExtJS library, JARs‘ at /opt/modules/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie.war
(4)上傳sharelib壓縮包到HDFS上:
在$oozie_home下,有2個sharelib壓縮包,分別是oozie-sharelib-4.0.0-cdh5.3.6.tar.gz 和 oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz,很明顯,我們必須拷貝第二個帶yarn的壓縮包(前邊的是1.0版本的,不帶yarn的)。

$ bin/oozie-setup.sh sharelib create -fs hdfs://hadoop-senior01.pmpa.com:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz

3.啟動oozie和測試:

啟動oozie,使用oozied.sh腳本。

$ bin/oozied.sh start

啟動後,訪問網址http://hadoop-senior01.pmpa.com:11000/oozie/
可以看到oozie的主頁面:

技術分享
oozie的主頁面.png

3. Oozie測試和使用:

1.執行官方example實例:

Oozie官方提供了一個樣例包,我們後邊的開發都以這個example實例為模板進行。解壓Oozie主目錄下的example包:

$ tar zxf oozie-examples.tar.gz 
$ cd examples/apps

apps目錄下存放了我們需要配置的作業內容。

技術分享
apps目錄內容.png


在目錄中可以看到,有關於map-reduce、sqoop、hive等很多類型的作業的配置的實例。下面,我以map-reduce作業為例來說明,oozie作業的配置方法。在map-reduce目錄中有三個重要的內容:
(1)job.properties:定義job相關的屬性,比如輸入輸出目錄、namenode節點等。定義了workflow.xml文件的位置。
(2)workflow.xml:定義工作流相關的配置,start 、 end 、kill等
(3)lib文件夾:存放job任務需要的jar包。
註意:配置作業需要修改job.properties和workflow.xml兩個文件。
配置job.properties:

nameNode=hdfs://hadoop-senior01.pmpa.com:8020
jobTracker=hadoop-senior02.pmpa.com:8032
queueName=default
examplesRoot=examples
user.name=natty

oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/map-reduce/workflow.xml
outputDir=map-reduce

jobTracker配置的是ResourceManager的端口。需要一定註意,我們的ResourceManager配置在senior02主機上,並且端口是8032(不是8088,8088端口是web界面查看的端口)
配置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}/user/natty/${examplesRoot}/output-data/${outputDir}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>mapred.mapper.class</name>
                    <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                    <name>mapred.reducer.class</name>
                    <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
                <property>
                    <name>mapred.input.dir</name>
                    <value>/user/natty/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>/user/natty/${examplesRoot}/output-data/${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>

上傳examples目錄到 HDFS的/user/natty/路徑。

$ /opt/modules/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put examples/ /user/natty/

運行example應用:

$ bin/oozie job -oozie http://hadoop-senior01.pmpa.com:11000/oozie -config examples/apps/map-reduce/job.properties -run

殺掉job:

$ bin/oozie job -oozie http://hadoop-senior01.pmpa.com:11000/oozie -kill 0000000-170423000216782-oozie-natt-W

請註意,在執行應用前,要保證oozie是啟動狀態的。

Oozie介紹