1、安裝Oozie(4.2.0)及遇到的一些問(wèn)題
1.1、依賴環(huán)境及版本
Oozie-4.2.0
Maven3.x
Mysql數(shù)據(jù)庫(kù)5.6.16
Mysql驅(qū)動(dòng)jar包(5.1.X匹配數(shù)據(jù)庫(kù)5.6.X)
ext-2.2.zip(小寫(xiě)的e,并且必須是這個(gè)版本)
JDK-1.8
Hadoop-2.6.2
Spark-1.5.1
用的root用戶
安裝maven,配環(huán)境變量,改配置文件setting假如阿里云中央鏡像倉(cāng)庫(kù)地址(因?yàn)橐檬褂胢aven編譯oozie,會(huì)下載一些依賴jar包)
(說(shuō)明:oozie是在servlet容器中運(yùn)行的,可以用Tomcat等其他web容器,也可以使用內(nèi)嵌的Tomcat或jetty服務(wù)器,
Oozie-4.2.0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Oozie-5.0.0
本安裝過(guò)程是基于內(nèi)嵌的Tomcat安裝的,基于外部Tomcat的安裝可以查看官方文檔 http://oozie.apache.org/docs/5.0.0/AG_Install.html)
測(cè)試服務(wù)器部署情況:
在Master節(jié)點(diǎn)安裝oozie-server,在maste和其他slave節(jié)點(diǎn)安裝oozie-client
1.2安裝oozie
下載oozie tar包(地址:http://archive.apache.org/dist/oozie/4.2.0/oozie-4.2.0.tar.gz)
解壓到安裝目錄,進(jìn)入解壓后的目錄cd oozie-4.2.0/bin
1.2.1編譯源文件構(gòu)建項(xiàng)目 命令:
./mkdistro.sh -DskipTests -Phadoop-2 –Dhadoop.varsion=2.6.2 –Dspark.version=1.5.1
(-Dxxx.version=x.x.x是指定版本,如果需要其他的框架依次指定需要的版本即可? ? ? ? ? ? ? ? ? ? ? ? ? ?
例如: -Ddistcp.version=2.6.0 -Dsqoop.version=1.4.4 -Dhive.version=0.13.1 -Dpig.version=0.15.0)
編譯的時(shí)候會(huì)因?yàn)榘姹疽蕾嚟h(huán)境的原因報(bào)兩個(gè)錯(cuò):
1.
根據(jù)提示看下源代碼:
Jdk1.8開(kāi)始會(huì)校驗(yàn)java注釋,不符合W3C HTML 4.01 HTML規(guī)范要求的編譯時(shí)會(huì)報(bào)錯(cuò)
詳細(xì)信息可以看(http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html)
解決方法:
在pom.xml文件中找到這個(gè)插件的引用
更改前:
更改后:
2、
http://repository.codehaus.org這個(gè)地址現(xiàn)在已經(jīng)不能訪問(wèn)了(4.2.0版本的時(shí)候應(yīng)該可以)
打開(kāi)pom.xml找到這個(gè)配置項(xiàng),通過(guò)這個(gè)地址下載一些依賴
下面是4.2.0版本
這個(gè)是5.0.0版本
對(duì)比看下
這個(gè)引用已經(jīng)被去掉了
4.2.0版本可以直接去掉或通過(guò)配置不檢索這個(gè)Maven庫(kù)
Snapshot版本代表不穩(wěn)定、尚處于開(kāi)發(fā)中的版本,快照版本,如果現(xiàn)在開(kāi)發(fā)的項(xiàng)目依賴其他項(xiàng)目可以設(shè)置為true
Release版本代表穩(wěn)定的版本,發(fā)行版本
<releases>
<enabled>false</enabled>
</releases>
不使用snapshot和releases版本應(yīng)該可以起到不檢索這個(gè)庫(kù)的效果
再次用命令編譯,這樣就編譯完成了:
構(gòu)建成后,可以在oozie-3.3.2/distro/target目錄下看到構(gòu)建后的文件,進(jìn)入distro/target/目錄:
解壓oozie-4.2.0-distro.tar.gz生成oozie-4.2.0
對(duì)比oozie-4.2.0和oozie-4.2.0-distro目錄是一樣的,所以可以將oozie-4.2.0-distro刪掉
在/etc/profile文件中配置環(huán)境變量
export OOZIE_HONE= /usr/local/bigdata/oozie-4.2.0/distro/target/oozie-4.2.0
PATH=$OOZIE_HOME/bin:$PATH
使配置生效:
source /etc/profile
1.2.2、在oozie-4.2.0目錄下創(chuàng)建lib目錄,將libext包下面的包復(fù)制到lib下
在/usr/local/bigdata/oozie-4.2.0目錄下創(chuàng)建libext目錄
下載ext-2.2-zip
(可以在CSDN上下載,其他地方找的有些不能用)
下載mysql(mysql-connector-java-5.1.16-bin.jar)驅(qū)動(dòng)jar包
將這兩個(gè)包都放在libext里面,再將Hadoop目錄下所有的*.jar包復(fù)制到這個(gè)目錄下,先進(jìn)到hadoop安裝目錄下/usr/local/bigdata/hadoop-2.6.2
執(zhí)行命令(以自己本機(jī)路徑為準(zhǔn))
find -name *.jar |xargs -t -i cp {} /usr/local/bigdata/oozie-4.2.0/libext
然后進(jìn)入/usr/local/bigdata/oozie-4.2.0/distro/target/oozie-4.2.0/bin目錄下(如果已經(jīng)配了環(huán)境變量可以直接執(zhí)行)執(zhí)行命令./ oozie-setup.sh prepare-war命令(本機(jī)要安裝unzip和zip,如果沒(méi)有安裝可以通過(guò)yum安裝)
完成之后會(huì)在/usr/local/bigdata/oozie-4.2.0/distro/target/oozie-4.2.0目錄下生成lib包,里面放著執(zhí)行bin里面腳本所需要的jar包,但可能jar包不全,所以將/root/oozie-4.2.0/libext目錄下的jar和zip復(fù)制到lib包下
1.2.3、初始化數(shù)據(jù)庫(kù)
配置oozie-site.xml:
默認(rèn)情況下,Oozie的配置中有個(gè)配置項(xiàng)oozie.service.JPAService.create.db.schema,值為false,設(shè)置非自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù),這里保持默認(rèn)設(shè)置,這樣可以通過(guò)手動(dòng)創(chuàng)建Oozie數(shù)據(jù)庫(kù)(可以對(duì)用戶進(jìn)行權(quán)限控制)
更多配置可查看官網(wǎng):http://oozie.apache.org/docs/5.0.0/AG_Install.html
在mysql數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù)oozie(本例使用oz數(shù)據(jù)庫(kù))
然后可以執(zhí)行如下命令,生成Oozie所需要的數(shù)據(jù)表:
ooziedb.sh create -sqlfile oozie.sql –run
控制臺(tái)輸出日志,沒(méi)有報(bào)錯(cuò),并且在當(dāng)前目錄下可以看到,同時(shí)也生成了oozie.sql腳本文件。到MySQL數(shù)據(jù)庫(kù)中可以看到生成的表,說(shuō)明上述操作執(zhí)行成功
1.2.4、上傳examples到hdfs
命令:hadoop fs -put examples/ /user/root
1.2.5、啟動(dòng)oozie
下面可以啟動(dòng)Oozie,使用如下命令:
oozie-start.sh
1.2.6訪問(wèn)11000端口頁(yè)面
如果頁(yè)面報(bào)錯(cuò),查看后臺(tái)oozie服務(wù),如果啟動(dòng)起來(lái)了,則可能是這個(gè)路徑下的jar包和Tomcat的jar沖突了,根據(jù)報(bào)錯(cuò)信息將這個(gè)目錄下的jar包刪除就可以了
2、在master和slave節(jié)點(diǎn)安裝oozie-client
在master節(jié)點(diǎn)oozie-server安裝目錄下
將oozie-client-4.2.0.tar.gz復(fù)制到master節(jié)點(diǎn)安裝目錄下
cp oozie-client-4.2.0.tar.gz /usr/local/bigdata/
將oozie-client-4.2.0.tar.gz復(fù)制到其他slave節(jié)點(diǎn)(因?yàn)榕渲昧斯?jié)點(diǎn)間ssh免密登錄所以可以直接通過(guò)命令復(fù)制,其他節(jié)點(diǎn)也使用同樣的方法)
scp oozie-client-4.2.0.tar.gz root@120.78.251.92:/usr/local/bigdata/
通過(guò)tar –zxvf解壓
在bin目錄下只有oozie腳本
最后配下環(huán)境變量就行了,執(zhí)行oozie任務(wù)可以在任意目錄下
Oozie job –oozie http://ip:port/oozie -config job.properties -run
3、Oozie使用及常用命令
啟動(dòng)oozie服務(wù)的命令:oozie-start.sh
關(guān)閉oozie服務(wù)的命令:oozie-stop.sh
Oozie的web頁(yè)面地址:http://oozie服務(wù)所在服務(wù)器IP地址:port(默認(rèn)是11000)
可以看下oozie帶的map-reduce例子的目錄結(jié)構(gòu)
vim job.properties:
(說(shuō)明:屬性jobTracker在oozie-5.0.0已經(jīng)改成resourceManager了)
所有示例的輸入都在examples/input-data目錄中。
這些示例在examples/output-data/$ {EXAMPLE_NAME}目錄下創(chuàng)建輸出。
(DAG有向無(wú)環(huán)圖)節(jié)點(diǎn)執(zhí)行順序
控制流節(jié)點(diǎn):控制工作流程和工作流程作業(yè)執(zhí)行路徑的開(kāi)始和結(jié)束的節(jié)點(diǎn)
動(dòng)作節(jié)點(diǎn):觸發(fā)執(zhí)行計(jì)算/處理任務(wù)的節(jié)點(diǎn)
各個(gè)節(jié)點(diǎn)的作用可以看:http://oozie.apache.org/docs/4.2.0/WorkflowFunctionalSpec.html
執(zhí)行一個(gè)oozie任務(wù)
使用命令:
oozie? job? –oozie http://oozie服務(wù)所在服務(wù)器IP地址:port(默認(rèn)是11000)/oozie? -config? job.properties(本地的job.properties,不是hdfs中的)
例子:oozie job –oozie http://119.23.155.53:11000/oozie -config job.properties –run
(注意:job.properties文件在提交期間需要是本地文件,不是HDFS路徑
可以在環(huán)境變量中配置:
export OOZIE_URL =http://localhost:11000/oozie
配置完之后可以這樣寫(xiě):oozie job –config job.properties -run)
用oozie用戶啟用的oozie服務(wù)
一個(gè)問(wèn)題:
使用root用戶執(zhí)行oozie任務(wù)
使用oozie用戶執(zhí)行oozie任務(wù)
需要更改hadoop的配置文件core-site.xml
(注意:如果使用root用戶也需要加這個(gè)配置將oozie改成root)
(說(shuō)明:這個(gè)必須配置,不然執(zhí)行oozie任務(wù)是會(huì)報(bào)錯(cuò)(還不太理解為什么)
重啟hadoop集群,然后在執(zhí)行oozie任務(wù)
這樣就成功了
Java示例代碼:
package com.libaba.oozie;
import org.apache.oozie.client.OozieClient;
import org.apache.oozie.client.OozieClientException;
import org.apache.oozie.client.WorkflowJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Properties;
public class MyOozie {
? ? private static Logger logger = LoggerFactory.getLogger(MyOozie.class) ;
? ? public static void main(String[] args) {
? ? ? ? try {
? ? ? ? ? ? oozie();
? ? ? ? } catch (OozieClientException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? public static void oozie() throws OozieClientException, InterruptedException {
? ? ? ? //獲取本地Oozie的OozieClient
? ? ? ? OozieClient oozieClient = new OozieClient("http://119.23.155.53:11000/oozie") ;
? ? ? ? //創(chuàng)建工作流作業(yè)配置并設(shè)置工作流應(yīng)用程序路徑
? ? ? ? Properties conf = oozieClient.createConfiguration();
? conf.setProperty(OozieClient.APP_PATH,"hdfs://119.23.155.53:9000/user/root/examples/apps/map-reduce");
? ? ? ? //設(shè)置工作參數(shù)(對(duì)應(yīng)本機(jī)地址,這里面是job.properties里面的參數(shù))
//5.0.0是resourceManager,4.2.0是jobTracker
? ? ? ? //conf.setProperty("resourceManager","119.23.155.53:8032") ;
conf.setProperty("jobTracker","119.23.155.53:8032") ;
? ? ? ? conf.setProperty("nameNode", "hdfs:// 119.23.155.53:9000");
? ? ? ? conf.setProperty("examplesRoot", "examples");
? ? ? ? conf.setProperty("queueName","default") ;
? ? ? ? conf.setProperty("master","local[*]") ;
? ? ? ? conf.setProperty("inputDir","/usr/root/inputdir") ;
? ? ? ? conf.setProperty("outputDir","/usr/root/outputdir") ;
? ? ? ? conf.setProperty("user.name","root") ;
? ? ? ? //提交并啟動(dòng)工作流作,會(huì)加載properties里面的屬性配置
? ? ? ? String jobId = oozieClient.run(conf) ;
? ? ? ? System.out.println("工作流作業(yè)提交了");
? ? ? ? System.out.println(jobId);
? ? ? ? System.out.println("工作狀態(tài)--->" + oozieClient.getJobInfo(jobId).getStatus());
? ? ? ? //等待工作流作業(yè)每10秒鐘打印一次
? ? ? ? while (oozieClient.getJobInfo(jobId).getStatus() == WorkflowJob.Status.RUNNING){
? ? ? ? ? ? System.out.println("工作流作業(yè)正在進(jìn)行...") ;
? ? ? ? ? ? logger.info("工作流作業(yè)正在進(jìn)行...");
? ? ? ? ? ? Thread.sleep(10000);
? ? ? ? }
? ? ? ? while (oozieClient.getJobInfo(jobId).getStatus() == WorkflowJob.Status.SUCCEEDED){
? ? ? ? ? ? System.out.println("工作流作業(yè)執(zhí)行成功...") ;
? ? ? ? ? ? logger.info("工作流作業(yè)執(zhí)行成功.....");
? ? ? ? ? ? Thread.sleep(10000);
? ? ? ? }
? ? ? ? System.out.println("工作流執(zhí)行結(jié)束");
? ? }
}
查看某個(gè)oozie任務(wù)的狀態(tài),使用命令:
oozie? job? –oozie http://oozie服務(wù)所在服務(wù)器IP地址:port(默認(rèn)是11000)/oozie? -info? oozie任務(wù)的ID (任務(wù)啟動(dòng)時(shí)會(huì)生成可以在控制臺(tái)或日志中查看,也可以再oozie服務(wù)的11000WEB頁(yè)面查看)
例子:oozie job –oozie http://119.23.155.53:11000/oozie -info 0000000-180522133038283-oozie-oozi-W
也可以在頁(yè)面上web頁(yè)面上查看當(dāng)前任務(wù)的具體信息
Oozie的生命周期
PREP prep 預(yù)備,準(zhǔn)備? 一個(gè)工作流Job第一次創(chuàng)建將處于PREP狀態(tài),表示工作流Job已經(jīng)定義,但是沒(méi)有運(yùn)行。
RUNNING running 運(yùn)轉(zhuǎn) 當(dāng)一個(gè)已經(jīng)被創(chuàng)建的工作流Job開(kāi)始執(zhí)行的時(shí)候,就處于RUNNING狀態(tài)。它不會(huì)達(dá)到結(jié)束狀態(tài),只能因?yàn)槌鲥e(cuò)而結(jié)束,或者被掛起。
SUSPENDED suspended 暫停的 一個(gè)RUNNING狀態(tài)的工作流Job會(huì)變成SUSPENDED狀態(tài),而且它會(huì)一直處于該狀態(tài),除非這個(gè)工作流Job被重新開(kāi)始執(zhí)行或者被殺死。
SUCCEEDED succeeded 成功,完成,到達(dá) 當(dāng)一個(gè)RUNNING狀態(tài)的工作流Job到達(dá)了end節(jié)點(diǎn),它就變成了SUCCEEDED最終完成狀態(tài)。
KILLED killed 被殺死的 當(dāng)一個(gè)工作流Job處于被創(chuàng)建后的狀態(tài),或者處于RUNNING、SUSPENDED狀態(tài)時(shí),被殺死,則工作流Job的狀態(tài)變?yōu)镵ILLED狀態(tài)。
FAILED failed 失敗了的,不成功的 當(dāng)一個(gè)工作流Job不可預(yù)期的錯(cuò)誤失敗而終止,就會(huì)變成FAILED狀態(tài)。
工作流狀態(tài)轉(zhuǎn)移
轉(zhuǎn)移前狀態(tài)
轉(zhuǎn)移后狀態(tài)集合
未啟動(dòng)
PREP
PREP
RUNNING、KILLED
RUNNING
SUSPENDED、SUCCEEDED、KILLED、FAILED
SUSPENDED
RUNNING、KILLED
KILLED? ? ? ? ? ? ? ? ? ? SUCCEEDED? ? ? ? ? ? ? ? SUSPENDED
以后有新的認(rèn)識(shí)會(huì)更新上傳到github,可以通過(guò)下面地址下載
GitHub地址:https://github.com/privateGitLab/oozie-4.2.0
git@github.com:privateGitLab/oozie-4.2.0.git