目錄
版本和系統要求
本文安裝oozie版本:oozie-5.2.0.tar.gz
oozie官網安裝系統要求:
- Unix box (tested on Mac OS X and Linux)
- Java JDK 1.8+
- Maven 3.0.1+
- Hadoop 2.6.0+
- Pig 0.10.1+
maven安裝
下載
下載地址:apache-maven-3.6.3-bin.tar.gz
解壓
執行如下命令,解壓到/opt目錄下:
tar -zxvf /root/tools/apache-maven-3.6.3-bin.tar.gz -C /opt/
修改解壓後的目錄名稱:
mv apache-maven-3.6.3 /opt/maven
配置環境變量
打開配置文件:
vi /etc/profile
配置內容如下:
# maven
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$MAVEN_HOME/bin
配置生效:
source /etc/profile
測試安裝
命令如下:
mvn -version
[root@single opt]# mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /opt/maven
Java version: 1.8.0_144, vendor: Oracle Corporation, runtime: /opt/jdk/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"
Pig安裝
安裝pig前需要先安裝好JDK和Hadoop,請參見筆者關於Hadoop安裝的博文。
下載
下載地址:pig-0.17.0.tar.gz
解壓
將pig解壓到/opt目錄下:
tar -zxvf /root/tools/pig-0.17.0.tar.gz -C /opt/
修改pig目錄名稱:
mv pig-0.17.0 pig
配置
打開配置文件:
vi /etc/profile
內容如下:
# pig
export PIG_HOME=/opt/pig
export PATH=$PATH:$PIG_HOME/bin
配置生效:
source /etc/profile
驗證
需要先啓動Hadoop集羣(啓動命令start-all.sh)。執行pig命令,啓動pig
[root@single opt]# pig
20/06/19 13:14:30 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL
20/06/19 13:14:30 INFO pig.ExecTypeProvider: Trying ExecType : MAPREDUCE
20/06/19 13:14:30 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType
2020-06-19 13:14:30,538 [main] INFO org.apache.pig.Main - Apache Pig version 0.17.0 (r1797386) compiled
Jun 02 2017, 15:41:582020-06-19 13:14:30,538 [main] INFO org.apache.pig.Main - Logging error messages to: /opt/pig_1592543670
537.log2020-06-19 13:14:30,585 [main] INFO org.apache.pig.impl.util.Utils - Default bootup file /root/.pigbootu
p not found2020-06-19 13:14:31,633 [main] INFO org.apache.hadoop.conf.Configuration.deprecation - mapred.job.tracke
r is deprecated. Instead, use mapreduce.jobtracker.address2020-06-19 13:14:31,633 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Con
necting to hadoop file system at: hdfs://single:90002020-06-19 13:14:32,744 [main] INFO org.apache.pig.PigServer - Pig Script ID for the session: PIG-defaul
t-b297a241-b4bf-4593-a6f6-785dbb7e16592020-06-19 13:14:32,744 [main] WARN org.apache.pig.PigServer - ATS is disabled since yarn.timeline-servi
ce.enabled set to false
grunt>
其中
20/06/19 13:14:30 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType
檢測到了已經安裝的Hadoop(Hadoop已經啓動)。
注:pig -version命令也可以測試。
oozie安裝
下載源碼包
下載地址:oozie-5.2.0.tar.gz
遺憾的是,oozie沒有直接提供二進制包,僅提供了源碼包,後面需要編譯。
解壓源碼包
執行如下命令,將源碼包解壓到同一目錄:
tar -zxvf /root/tools/oozie-5.2.0.tar.gz -C /root/tools/
解壓後的源碼目錄結構:
源碼編譯
執行如下命令編譯:
mkdistro.sh -DskipTests
編譯過程如下:
下載相關依賴,接下來就是漫長的等待(筆者等待半天,中間有斷過網)。當然可以顯示指定依賴的版本:
mkdistro.sh -DskipTests -Puber
-Dhadoop.version=<version> - default 2.6.0
-Ptez - Bundle tez jars in hive and pig sharelibs. Useful if you want to use tez
+as the execution engine for those applications.
-Dpig.version=<version> - default 0.16.0
-Dpig.classifier=<classifier> - default h2
-Dsqoop.version=<version> - default 1.4.7
-Dsqoop.classifier=<classifier> - default hadoop260
-Djetty.version=<version> - default 9.3.20.v20170531
-Dopenjpa.version=<version> - default 2.2.2
-Dxerces.version=<version> - default 2.10.0
-Dcurator.version=<version> - default 2.5.0
-Dhive.version=<version> - default 1.2.2
-Dhbase.version=<version> - default 1.2.3
-Dtez.version=<version> - default 0.8.4
在<version>中可以填寫具體的版本,- default表示默認版本。這裏mkdistro.sh -DskipTests命令會使用默認版本。
最後編譯成功後如圖:
圖中顯示時長是02:44,筆者認爲不科學。編譯成功後,我們需要的包在distro/target/oozie-5.2.0-distro.tar.gz。
oozie的安裝分爲server和client安裝。下面先按照server。
server安裝
需要事先安裝好關係型數據庫,用於保存oozie元數據,筆者選用的數據庫是mysql。
(1)解壓編譯後的包
編譯後的包在 /root/tools/oozie-5.2.0/distro/target下,如圖:
tar -zxvf /root/tools/oozie-5.2.0/distro/target/oozie-5.2.0-distro.tar.gz -C /opt
修改oozie目錄名稱:
mv /opt/oozie-5.2.0 /opt/oozie
解壓後目錄結構如下:
(2)配置環境變量
打開配置文件:
vi /etc/profile
配置內容如下:
# oozie server
export OOZIE_HOME=/opt/oozie
export PATH=$PATH:$OOZIE_HOME/bin
配置生效:
source /etc/profile
(3)oozie配置
Hadoop的core-site.xml添加如下配置:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
注:配置core-site.xml後,需要重啓Hadoop。這裏hadoop.proxyuser.[ ].hosts和hadoop.proxyuser.[ ].groups配置的是root,根據具體情況配置。
oozie-site.xml添加如下配置:
<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://192.168.128.1:3306/oozie?createDatabaseIfNotExist=true&useSSL=false</value>
<description>oozie元數據存儲數據庫名稱</description>
</property>
<property>
<name>oozie.service.JPAService.create.db.schema</name>
<value>true</value>
<description>自動創建oozie數據庫</description>
</property>
<property>
<name>oozie.service.JPAService.jdbc.username</name>
<value>root</value>
</property>
<property>
<name>oozie.service.JPAService.jdbc.password</name>
<value>root</value>
</property>
<property>
<name>oozie.service.HadoopAccessorService.hadoop.configurations</name>
<value>*=/opt/hadoop/etc/hadoop</value>
</property>
<property>
<name>oozie.service.WorkflowAppService.system.libpath</name>
<value>hdfs://single:9000/user/root/share/lib</value>
<description>oozie依賴包路徑</description>
</property>
配置oozie的元數據保存數據庫名稱爲oozie,用戶和密碼均爲root,根據情況配置。
(4)添加依賴包
在oozie安裝目錄下,新建libext目錄,命令如下:
mkdir libext
將mysql驅動和ext-2.2.zip拷貝到該目錄下。
如圖:
將Hadoop的common、hdfs、mapreduce和yarn目錄下的jar包拷貝到libext目錄下:
如果Hadoop的相關包沒有拷貝,可能會出現如下問題:
問題a:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FileUtil
at org.apache.oozie.tools.OozieSharelibCLI.run(OozieSharelibCLI.java:189)
at org.apache.oozie.tools.OozieSharelibCLI.main(OozieSharelibCLI.java:103)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FileUtil
原因是:缺少hdfs相關依賴包,將Hadoop安裝目錄下的share/hadoop/hdfs目錄下的jar包和lib中的依賴包拷貝到oozie安裝目錄下的libext下。比如:
問題b:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapred/JobConf
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
原因是:Hadoop的mapreduce相關包未拷貝到libext目錄下。
問題c:
java.io.IOException: No FileSystem for scheme: hdfs
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
原因是:Hadoop中hdfs的依賴包沒有拷貝到oozie安裝目錄下的libext目錄中。
問題d:
java.lang.Exception: Could not connect to the database: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.apache.oozie.tools.OozieDBCLI.validateConnection(OozieDBCLI.java:927)
at org.apache.oozie.tools.OozieDBCLI.createDB(OozieDBCLI.java:192)
at org.apache.oozie.tools.OozieDBCLI.run(OozieDBCLI.java:135)
at org.apache.oozie.tools.OozieDBCLI.main(OozieDBCLI.java:83)
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
原因是:mysql的驅動依賴包未拷貝到libext目錄下。
問題e:
Error: Could not find or load main class org.apache.oozie.server.EmbeddedOozieServer
原因是:oozie安裝目錄下的embedded-oozie-server/webapp目錄不小心被我刪除了。
注:有時候Hadoop的相關包拷貝到libext目錄下也不能成功加載,原因未找到,直接將包拷貝到lib目錄下也可以。
(6)sharelib上傳到hdfs上
sharelib是oozie依賴的公共包,需要放置在hdfs的目錄中。
oozie-sharelib-5.2.0.tar.gz在oozie的安裝目錄/opt/oozie下,執行如下命令將oozie-sharelib-5.2.0.tar.gz解壓到hdfs上:
oozie-setup.sh sharelib create -fs hdfs://single:9000/user/root/share/lib -locallib oozie-sharelib-5.2.0.tar.gz
成功後如圖:
這裏是oozie各種action依賴的包。
可能會出現如下問題:
java.lang.IllegalArgumentException: Wrong FS: hdfs://single:9000/user/root/share/lib_1234567890, expected: hdfs://single
at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:648)
原因是:命令中hdfs路徑寫錯了,必須是oozie-site.xml中配置的:
<property>
<name>oozie.service.WorkflowAppService.system.libpath</name>
<value>hdfs://single:9000/user/root/share</value>
<description>oozie依賴包路徑</description>
</property>
注:oozie-site.xml中libpath配置必須與fs路徑一致。
(6)創建oozie數據庫
ooziedb.sh create -sqlfile oozie.sql -run
執行成功後,如圖:
可能出現問題二:
java.lang.Exception: Could not connect to the database: java.sql.SQLException: Access denied for user 'oozie'@'single' (using password: YES)
at org.apache.oozie.tools.OozieDBCLI.validateConnection(OozieDBCLI.java:927)
at org.apache.oozie.tools.OozieDBCLI.createDB(OozieDBCLI.java:192)
at org.apache.oozie.tools.OozieDBCLI.run(OozieDBCLI.java:135)
at org.apache.oozie.tools.OozieDBCLI.main(OozieDBCLI.java:83)
Caused by: java.sql.SQLException: Access denied for user 'oozie'@'single' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
原因是:oozie數據庫訪問權限問題。先登錄mysql數據庫,然後給root用戶訪問oozie數據庫的權限:
grant all on oozie.* to 'root'@'192.168.128.%';
可能問題三:
[root@single oozie_server]# ooziedb.sh create -sqlfile oozie.sql -run
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
原因是Hadoop相關依賴未拷貝到libext目錄下。
(8)驗證測試
啓動oozie server:
第一種啓動方式:oozie-start.sh(或者oozied.sh start),該命令方式日誌記錄在logs目錄下,
第二種啓動方式:oozied.sh run,該命令方式,日誌打印在控制檯,可以直接看到錯誤。
建議首次啓動時使用第二種方式,方便查看錯誤。成功啓動後,如圖:
也可以如下查看:
oozie admin -oozie http://localhost:11000/oozie -status
如圖:
頁面方式查看:
http://single:11000/oozie
如圖:
single是安裝oozie server的機器名稱。
安裝好oozie server後,下面我們在同一臺機器上安裝oozie client,事實上,按照好oozie server後,也就是安裝好了oozie server,oozie client通常在其他機器按照,方便訪問oozie server,爲了方便,我們在single再按照以下oozie client作爲演示:
client安裝
(1)解壓
oozie-client-5.2.0.tar.gz包在oozie server安裝目錄/opt/oozie下,直接解壓:
tar -zxvf /opt/oozie/oozie-client-5.2.0.tar.gz -C /opt
然後解壓後的目錄重命名:
mv oozie-client-5.2.0 oozie-client
目錄結構如圖:
bin目錄下只有一個oozie命令。
(2)配置環境變量
打開配置文件:
vi /etc/profile
內容如下:
# oozie client
export OOZIE_CLIENT_HOME=/opt/oozie
export PATH=$PATH:$OOZIE_CLIENT_HOME/bin
配置生效:
source /etc/profile