權聲明:本文爲博主原創文章,未經博主容許不得轉載。java
1、使用CM添加服務的方式安裝Oozienode
若是在建立Oozie數據庫時失敗,且提示數據庫已存在,以下圖,則多是以前已經安裝過Oozie,沒有卸載乾淨,須要手動將Oozie服務器數據目錄刪掉(oozie/data部分),見圖二mysql
(圖一)linux
(圖二)web
2、安裝成功後,能夠經過web方式訪問Oozie(http://hadoop1:11000.oozie/),但此時出現以下頁面,提示須要Ext JS,查看官方文檔可知,只能使用Ext js 2.2版本(版權問題)sql
將ext-2.2.zip放到libext目錄下:/opt/cloudera/parcels/CDH/lib /oozie/libext,並解壓,unzip ext-2.2.zip,將解壓後的ext-2.2權限改成777:chmod -R 777 ext-2.2數據庫
此時不須要重啓Oozie,只要刷新瀏覽器,便可看到oozie的web頁面apache
3、修改Oozie的元數據庫爲mysql,默認爲derby,不適合生產環境使用瀏覽器
一、CM配置見下圖:服務器
二、在對應的mysql服務器建立oozie數據庫:create database oozie;
三、在安裝Oozie的節點libserver目錄下(/opt/cloudera/parcels/CDH/lib/oozie/libserver)添加mysql的驅動jar包,而後重啓Oozie
此時會報以下錯誤,說數據庫不存在:
四、此時能夠在CM的Oozie-->實例-->右上角的操做處點擊建立數據庫
此時報錯以下圖,提示找不到mysql驅動
將mysql驅動拷貝到libtools目錄下(/opt/cloudera/parcels/CDH/lib/oozie /libtools),並重命名驅動包,去掉版本號,如原名爲:mysql-connector-java-5.1.25-bin.jar,重命名爲:mysql-connector-java-bin.jar,此時再次執行上面的建立數據庫操做,提示建立成功。
也能夠進行mysql數據庫,查看oozie數據庫下的表,此時會多出新建的12張表,此時表明Oozie已所有安裝成功!
此時經過CM從新啓動Oozie服務成功!
4、修改Oozie配置
將java的堆棧大小設爲1到2G
5、運行demo
一、進入目錄:/opt/cloudera/parcels/CDH/share/doc/oozie-4.0.0+cdh5.3.3+340,在root目錄下創建example目錄,並將上面目錄中的oozie-examples.tar.gz拷貝到/root/example目錄中並解壓,獲得examples目錄,目錄結構以下:
二、進入apps/map-reduce目錄,可看到以下配置文件,主要關注job.properties和workflow.xml
三、修改job.properties
1)未修改前的內容
2)修改細節:
修改nameNode:nameNode=hdfs://xxx:8020
修改jobTracker:jobTracker=hadoop4:8032
注意:jobTracker的內容根據hadoop的版本,內容也不一樣。如爲hadoop1,則直接使用jobTracker的地址便可。如爲 hadoop2,即寫resourceManager的地址,具體可參見:/etc/hadoop/conf/yarn-site.xml
queueName=default:指定提交做業時,運行的隊列
examplesRoot=examples:指定運行做業的hdfs上的目錄名稱
四、可查看workflow.xml配置的內容,但暫不作修改
五、將examples整個目錄上傳到hdfs的/user/oozie下:hdfs dfs -put examples /user/oozie
六、運行做業:
oozie job -oozie http://hadoop1:11000/oozie/ -config /root/example/examples/apps/map-reduce/job.properties -run
重點:oozie做業流程解析
1)job.properties文件能夠不上傳到hdfs中,是在執行oozie job ...... -config時,批定的linux本地路徑
2)workflow.xml文件,必定要上傳到job.properties的oozie.wf.application.path對應的hdfs目錄下
3)job.properties中的oozie.use.system.libpath=true指定oozie使用系統的共享目錄
4)job.properties中的oozie.libpath=${nameNode}/user/${user.name}/apps/mymr,能夠用來執行mr時,做業導出的jar包存放位置,不然可能報找不到類的錯誤
5)oozie調度做業時,本質也是啓動一個mapreduce做業來調度,workflow.xml中設置的隊列名稱爲調度做業mr的隊列名稱。因此若是想讓做業運行在指定的隊列時,須要在mr或hive中指定好
七、檢測workflow.xml文件的正確性
oozie validate workflow.xml
八、編寫workflow.xml文件
控制節點:
1)start節點
<start to="[nodename]" />
2)end節點
<end name="[nodename]" />
3)kill節點
<kill>
<message>"logmsg"</message>
</kill>
4)decision決策節點
<decision name="[nodename]">
<switch>
<case to="[nodename]">[PREDICATE]</case>
......
<default to="[nodename]" />
</switch>
</decision>
5)fork分支節點
<fork name="[fork-node-name]">
<path start="[nodename]"/>
......
<path start="[nodename]"/>
</fork>
6)join會籤節點
<join name="[join-node-name]" to="[nodename]" />
動做節點:
1)map-reduce配置:
<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/${wf:user()}/${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/${wf:user()}/${examplesRoot}/input-data/text</value>
</property>
<property>
<name>mapred.output.dir</name>
<value>/user/${wf:user()}/${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>
2)hive動做節點配置
<workflow-app xmlns="uri:oozie:workflow:0.2" name="hive-wf">
<start to="hive-node"/>
<action name="hive-node">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive"/>
<mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>script.q(存放hive腳本的文件)</script>
<param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
<param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive</param>
</hive>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
3)sqoop動做節點
<workflow-app xmlns="uri:oozie:workflow:0.2" name="sqoop-wf">
<start to="sqoop-node"/>
<action name="sqoop-node">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/sqoop"/>
<mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<command>import --connect jdbc:hsqldb:file:db.hsqldb --table TT --target-dir /user/${wf:user()}/${examplesRoot}/output-data/sqoop -m 1</command>
<file>db.hsqldb.properties#db.hsqldb.properties</file>
<file>db.hsqldb.script#db.hsqldb.script</file>
</sqoop>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Sqoop failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>