先說下hadoop 內置工作流的不足
(1)支持job單一
(2)硬編碼
(3)無可視化
(4)無調度機制
(5)無容錯機制
在這種情況下Azkaban就出現了
1)Azkaban是什么
Azkaban是由Linkedin開源的一個批量工作流任務調度器。用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關系,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。
2)Azkaban的功能特點
①Web用戶界面
②方便上傳工作流
③方便設置任務之間的關系
④工作流調度
⑤認證/授權
⑥能夠殺死並重新啟動工作流
⑦模塊化和可插拔的插件機制
⑧項目工作區
⑨工作流和任務的日志記錄和審計
3)Azkaban的架構
MySQL實例 – Azkaban使用MySQL來存儲項目和執行
Azkaban Web服務器 – Azkaban使用Jetty作為Web服務器,用作控制器以及提供Web界面
Azkaban執行服務器 – Azkaban執行服務器執行提交工作流
4)Azkaban三種運行模式
①solo server mode
H2
web server和executor server運行在一個進程里
②two server mode
MySQL(主從結構)
web server和executor server運行在不同的進程
③multiple executor mode
MySQL(主從結構)
web server和executor server運行在不同的進程
executor server有多個
Azkaban 安裝部署
系統時區配置
1.查看時區
[xxx@single azkaban-web-2.5.0]$ more /etc/sysconfig/clock
ZONE="Asia/Shanghai"
UTC=true
ARC=false
2.修改時區
時區文件都在/usr/share/zoneinfo,復制相應時區覆蓋/etc/localtime即可
[lijia@single azkaban-web-2.5.0]$ ll /usr/share/zoneinfo
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
*修改web server 和excutor server 都需要配置時區,必須和系統時區一致
default.timezone.id=Asia/Shanghai
安裝mysql
配置mysql
下載mysql數據腳本
wget https://s3.amazonaws.com/azkaban2/azkaban2/2.5.0/azkaban-sql-script-2.5.0.tar.gz
tar -zxvf azkaban-sql-script-2.5.0.tar.gz –C ~/azkaban/
創建用戶、分配權限並執行腳本
mysql –uroot –pxxxx
創建數據庫: CREATE DATABASE azkaban;
創建用戶名:CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban'
分配權限:GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,INDEX ON `azkaban`.* TO 'azkaban'@'%' WITH GRANT OPTION;
flush privileges;
quit;
通過azkaban賬號登錄mysql:mysql –uazkaban –pazkaban
Use azkaban;
source ~/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql
Azkaban Web Server 安裝
1.下載安裝包 wget https://s3.amazonaws.com/azkaban2/azkaban2/2.5.0/azkaban-web-server-2.5.0.tar.gz tar –zxvf azkaban-web-server-2.5.0.tar.gz –C ~/azkaban/ 2.上傳依賴包 上傳mysql驅動包至 ~/azkaban/azkaban-web-2.5.0/extlib/ 3.生成jetty ssl所需密鑰文件 keytool -keystore keystore -alias jetty -genkey -keyalg RSA Enter keystore password: mysteel What is your first and last name? [Unknown]: mysteel What is the name of your organizational unit? [Unknown]: mysteel What is the name of your organization? [Unknown]: mysteel What is the name of your City or Locality? [Unknown]:SH What is the name of your State or Province? [Unknown]:SH What is the two-letter country code for this unit? [Unknown]:CN Is CN=mysteel, OU= mysteel, O= mysteel, L=SH, ST=SH, C=CN correct? [no]: yes Enter key password for < mysteel > (RETURN if same as keystore password): mysteel
注意:這里keystore的密碼為mysteel,key的密碼為mysteel可自行修改 最后將生成的keystore文件放到 Azkaban安裝目錄中~/azkaban/azkaban-web-2.5.0/ (也可通過修改配置文件改變其默認存放地址)
4.修改配置文件 (conf/azkaban.propreties)
修改首頁樣式及時區信息
azkaban.name=Job Tasks
azkaban.label=mysteel workflow
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai
修改mysql連接,可自行修改
database.type=mysql
mysql.port=3306
mysql.host=192.168.200.184
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
修改 Jetty 服務器屬性,包括 keystore 的相關配置
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081
jetty.keystore=keystore
jetty.password=mysteel
jetty.keypassword= mysteel
jetty.truststore=keystore
jetty.trustpassword= mysteel
修改郵件設置(可選)
mail.sender=xxxxxxx@mysteel.com
mail.host=smtp.126.com
mail.user= xxxxxxx@mysteel.com
mail.password=xxx (注:發送郵箱的密碼)
5.用戶及權限配置
進入 azkaban web 服務器 conf 目錄,修改 azkaban-users.xml ,增加管理員用戶: < azkaban-users> < user username="azkaban" password="azkaban" roles="admin" groups="azkaban" /> < user username="metrics" password="metrics" roles="metrics"/> < user username="admin" password="admin" roles="admin,metrics" /> < role name="admin" permissions="ADMIN" /> < role name="metrics" permissions="METRICS"/> < /azkaban-users>
Azkaban Executor Server安裝
1.下載安裝包
wget https://s3.amazonaws.com/azkaban2/azkaban2/2.5.0/azkaban-executor-server-2.5.0.tar.gz
tar –zxvf azkaban-executor-server-2.5.0.tar.gz –C ~/azkaban/
2.修改配置文件 (conf/azkaban.propreties)
修改時區信息
default.timezone.id=Asia/Shanghai
修改mysql連接,可自行修改
database.type=mysql
mysql.port=3306
mysql.host=192.168.200.184
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
配置端口,默認就好
executor.maxThreads=50
executor.port=12321
executor.flow.threads=30
在web server 的azkaban.properties配置executor的連接,特別注意,如果兩個server不是在一台主機上,web server 需要配置executor.host
# Azkaban Executor settings
executor.port=12321
executor.host=ip/hostname
啟動驗證
啟動web server
~/azkaban/azkaban-web-2.5.0/bin/azkaban-web-start.sh(azkaban-web-shutdown.sh停止)
訪問 https://ip:8443 出現界面安裝成功
啟動 executor server
~/azkaban/azkaban-executor-2.5.0/bin/azkaban-exec-start.sh(azkaban-executor-shutdown.sh 停止
Azkaban web server插件安裝
為了后邊插件的安裝,需要在${AZKABAN_WEB_SERVER}/plugins/目錄下創建viewer目錄,用來安裝各種viewer插件。當安裝好一個插件后需要重啟服務,讓插件生效。
安裝HDFS Viewer插件
1.解壓插件
1.解壓插件 在viewer目錄中解壓azkaban-hdfs-viewer-2.5.0.tar.gz,得到azkaban-hdfs-viewer-2.5.0目錄,將其更名為hdfs。最終,這個插件的目錄路徑是:${AZKABAN_WEB_SERVER}/plugins/viewer/hdfs。
2.配置HDFS Viewer
修改${AZKABAN_WEB_SERVER}/plugins/viewer/hdfs/conf/plugin.properties。根據應用場景修改proxy.user。需要注意的是配置viewer.external.classpaths並沒有任何效果,不知是bug還是我用錯了,以至於需要使用下面的步驟來配置
3.增加依賴jar包
這個版本的Azkaban無法找到Hadoop2中的相關依賴jar,而HDFS Viewer需要以下依賴:
commons-cli-1.2.jar,hadoop-auth-2.5.1.jar,hadoop-common-2.5.1.jar
hadoop-hdfs-2.5.1.jar,protobuf-java-2.5.0.jar
注:這么做的缺點是以后hadoop如果升級,要將這些jar更新
4.查看效果
注意:如果hadoop集群已經有了用戶及權限驗證,需要配置代理用戶等信息,具體請參考官方文檔(http://azkaban.github.io/azkaban/docs/latest/#hadoopsecuritymanager)
安裝Job Summary插件
1.解壓插件
在viewer目錄中解壓azkaban-jobsummary-2.5.0.tar.gz,得到azkaban-jobsummary-2.5.0目錄,將其更名為job summary。最終,這個插件的目錄路徑是
${AZKABAN_WEB_SERVER}/plugins/viewer/jobsummary
2.配置Job Summary
默認情況下不用做任何改到,如果需要修改
${AZKABAN_WEB_SERVER}/plugins/viewer/jobsummary/conf/plugin.properties。
3.查看效果
安裝Reportal插件
Reportal插件的安裝不僅是要在Azkaban Web Server上進行(Viewer插件),也需要在Azkaban Executor Server上進行(Jobtype插件)。本小節主要是說明如何在前者上的安裝;后者上的安裝參考Azkaban Executor Server的安裝和部署。
1.解壓插件
由於azkaban-reportal-2.5.0.tar.gz中不僅包含Viewer插件,還包含Jobtype插件,所以先在一個臨時目錄中解壓這個包,然后將解壓得到的viewer/reportal/目錄拷貝到上步中的viewer目錄下。最終這個插件的目錄路徑為:
${AZKABAN_WEB_SERVER}/plugins/viewer/reportal。
2.配置Reportal Viewer
修改${AZKABAN_WEB_SERVER}/plugins/viewer/reportal/conf/plugin.properties。由於Web Server和Executor Server是分開部署,不能使用本地文件存儲report任務的結果,而是用hdfs存儲:
reportal.output.filesystem=hdfs
3.效果
配置成功后,首頁導航欄會出現Reportal鏈接
Azkaban Executor Server 插件安裝
進入${AZKABAN_EXECUTOR_SERVER}/plugins目錄,在該目錄下解壓azkaban-jobtype-2.5.0.tar.gz得到目錄:azkaban-jobtype-2.5.0。將該目錄更名為jobtypes。這個目錄用來存放之后安裝的所有插件,與Web Server中的viewer目錄類似。每次插件的安裝配置需要重啟Executor Server。
1.修改配置文件
修改common.properties
修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/common.properties,設置hadoop.home和hive.home,與你的環境變量HADOOP_HOME和HIVE_HOME分布保持一致。例如:
hadoop.home=/usr/local/hadoop
hive.home=/opt/hive
修改commonprivate.properties
修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties,同樣需要設置hadoop.home和hive.home。另外修改jobtype.global.classpath。例如:
hadoop.home=/usr/local/hadoop
hive.home=/opt/hive
jobtype.global.classpath=${hadoop.home}/etc/hadoop,${hadoop.home}/share/hadoop/common/*,${hadoop.home}/share/hadoop/common/lib/*,${hadoop.home}/share/hadoop/hdfs/*,${hadoop.home}/share/hadoop/hdfs/lib/*,${hadoop.home}/share/hadoop/yarn/*,${hadoop.home}/share/hadoop/yarn/lib/*,${hadoop.home}/share/hadoop/mapreduce/*,${hadoop.home}/share/hadoop/mapreduce/lib/*
2.安裝Hive插件
在上步中hive插件已經被安裝了,這里主要是如何配置hive插件。
配置
在配置之前需要注意的是,azkaban默認hive aux lib的目錄是$HIVE_HOME/aux/lib,所以請在$HIVE_HOME目錄下創建相應的目錄,或者修改下面提到的兩個配置文件中的hive.aux.jars.path和hive.aux.jar.path為你期望的路徑,此外我在這兩個屬性值都加上file://,來指定使用本地文件。
修改private.properties
修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/private.properties,如下:
jobtype.classpath=${hive.home}/conf,${hive.home}/lib/*
hive.aux.jar.path=file://${hive.home}/aux/lib
jobtype.classpath與${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中的jobtype.global.classpath一起組合成hive任務的classpath。所以這兩個屬性如何賦值,可以靈活設置,保證classpath是你要的即可。
修改plugin.properties
修改${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/plugin.properties,如下:
hive.aux.jars.path=file://${hive.home}/aux/lib
源碼的修改與編譯
這個版本的Azkaban中的${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/azkaban-jobtype-2.5.0.jar有bug,在Hadoop2.5.1上(其他2.x未驗證),運行hive任務會拋出如下異常:
Exception in thread "main" java.lang.NoSuchMethodError:
org.apache.hadoop.hive.shims.HadoopShims.usesJobShell()Z
at azkaban.jobtype.HadoopSecureHiveWrapper.runHive(HadoopSecureHiveWrapper.java:148)
at azkaban.jobtype.HadoopSecureHiveWrapper.main(HadoopSecureHiveWrapper.java:115)
解決辦法是修改
${AZKABAN_PLUGINS_SOURCE}/plugins/jobtype/src/azkaban/jobtype/HadoopSecureHiveWrapper.java,找到如下代碼片段:
if (!ShimLoader.getHadoopShims().usesJobShell()) {
}
將其中的if條件去掉,也就是刪除兩行。然后進入
${AZKABAN_PLUGINS_SOURCE}/plugins/hadoopsecuritymanager/目錄,運行:
sudo ant
再進入${AZKABAN_PLUGINS_SOURCE}/plugins/jobtype,同樣運行:
sudo ant
成功后會生成${AZKABAN_PLUGINS_SOURCE}/dist/jobtype/jars/azkaban-jobtype-2.5.0-rc3.jar,使用這個jar來替換${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive/azkaban-jobtype-2.5.0.jar。
安裝Reportalhive插件
1.解壓部署
解壓azkaban-reportal-2.5.0.tar.gz, 將jobtypes/reportalhive/拷貝到${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes目錄。完整的目錄路徑是:${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive。
2.更新依賴jar
在Reportalhive插件根目錄下的azkaban-hadoopsecuritymanager-2.2.jar和azkaban-jobtype-2.1.jar兩個jar和當前版本不一致。需要用hive插件中的對應jar(${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/hive)來替換掉這兩個jar,否則在運行report任務時會如下報錯:
Exception in thread "main" java.lang.ClassNotFoundException: azkaban.jobtype.ReportalHiveRunner
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at azkaban.jobtype.HadoopJavaJobRunnerMain.getObject(HadoopJavaJobRunnerMain.java:299)
at azkaban.jobtype.HadoopJavaJobRunnerMain.(HadoopJavaJobRunnerMain.java:146)
at azkaban.jobtype.HadoopJavaJobRunnerMain.main(HadoopJavaJobRunnerMain.java:76)
${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive/lib/azkaban-reportal-2.5.jar也有bug,
需要修改
${AZKABAN_PLUGINS_SOURCE}/plugins/reportal/src/azkaban/jobtype/ReportalHiveRunner.java文件,找到如下代碼片段:
if (!ShimLoader.getHadoopShims().usesJobShell()) {.
}
刪除if條件,然后進入${AZKABAN_PLUGINS_SOURCE}/plugins/reportal,運行sudo ant生成${AZKABAN_PLUGINS_SOURCE}/dist/reportal/jars/azkaban-reportal-2.5.jar,用這個jar來替換掉${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/reportalhive/lib/azkaban-reportal-2.5.jar,否則在運行report任務時會報如下錯誤:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.shims.HadoopShims.usesJobShell()Z
at azkaban.jobtype.HadoopSecureHiveWrapper.runHive(HadoopSecureHiveWrapper.java:148)
at azkaban.jobtype.HadoopSecureHiveWrapper.main(HadoopSecureHiveWrapper.java:115)
3.配置Reportalhive
配置plugin.properties
可以注釋掉hive.home,因為我們在${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/common.properties和${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中已經配置過了,其他修改的屬性:
hive.aux.jars.path=file://${hive.home}/aux/lib
hadoop.dir.conf=${hadoop.home}/etc/Hadoop
hive.aux.jars.path - 使用本地的hive aux lib,如果使用hdfs,將file改為hdfs即可
hadoop.dir.conf - hadoop2的配置目錄與hadoop1不一樣,請注意修改
配置private.properties
同上,可以注釋掉hive.home,其他修改的屬性:
jobtype.classpath=${hadoop.home}/conf,${hadoop.home}/lib/*,${hive.home}/lib/*,./lib/*
hive.aux.jars.path=file://${hive.home}/aux/lib
hadoop.dir.conf=${hadoop.home}/etc/hadoop
jobtype.classpath - 與hive插件的配置不一樣,需要將插件本身的lib目錄加入到classpath,以使用azkaban-reportal-2.5.jar,否則會報錯。
jobtype.global.classpath - 已在${AZKABAN_EXECUTOR_SERVER}/plugins/jobtypes/commonprivate.properties中定義,可以注釋掉。
hive.classpath.items - 未用,也可以注釋掉。
4.效果
Ajax API適用
http://azkaban.github.io/azkaban/docs/latest/#ajax-api
Web 界面操作
http://azkaban.github.io/azkaban/docs/latest/#using-azkaban