不管是在業務開發仍是在大數據開發中,腳本都是必不可少的存在,在初期咱們會使用crontab來解決問題,那麼當發現規模變大監控需求可視化需求的到來Crontab已經顯然知足不了需求,抱着一顆解決大數據任務腳本和業務任務腳本難題的心態最終在oozie和Azkaban選擇了使用Azkaban來做爲公共任務調度系統,那麼就隨着筆者一同來學習Azkaban的基礎搭建場景和基本使用吧.java
附上:python
喵了個咪的博客:w-blog.cnmysql
Azkaban官網: https://azkaban.github.iolinux
官方文檔地址: http://azkaban.github.io/azkaban/docs/latestc++
一個完整的數據分析系統(業務系統)一般都是由大量任務單元組成:git
各任務單元之間存在時間前後及先後依賴關係 爲了很好地組織起這樣的複雜執行計劃,須要一個工做流調度系統來調度執行;github
一、 經過Hadoop先將原始數據同步到HDFS上;web
二、 藉助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;sql
三、 須要對Hive中多個表的數據進行JOIN處理,獲得一個明細數據Hive大表 ; 四、 將明細數據進行復雜的統計分析,獲得結果報表信息;shell
五、 須要將統計分析獲得的結果數據同步到業務系統中,供業務調用使用。
每個任務都依賴於上一個任務的結構,在這樣的一個複雜度下顯然Crontab已經知足不了需求,應爲複雜度的提高還會出現失敗處理分支和重試機制等
Azkaban是一套簡單的任務調度服務,總體包括三部分webserver、dbserver、executorserver
使用系統組件版本以下:
首先修改主機名Azkaban(方便配置時直接配置主機名便可)
> hostnamectl --static set-hostname azkaban
安裝Mysql 推薦使用oneinstack的方式安裝,它會把基礎的依賴安裝好,好比ntp時間同步,git和gcc-c++
> mkdir -p /app/install > cd /app/install > wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --db_option 2 --dbinstallmethod 1 --dbrootpwd Sunmi388 # 固然還須要安裝一下java環境,能夠經過yum安裝或者手動安裝都行 > yum install java
下載Azkaban-3.50.0以及修改郵件代碼
> wget https://github.com/azkaban/azkaban/archive/3.50.0.tar.gz > tar -zxvf 3.50.0.tar.gz > cd azkaban-3.50.0 # azkaban關於通知郵件存在一個問題須要修改一段代碼 > vim azkaban-common/src/main/java/azkaban/utils/EmailMessage.java # 找到郵件參數配置的地方 :/props # 增長以下語句 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); #Gradle是一個基於Apache Ant和Apache Maven的項目自動化構建工具。-x test 跳過測試
使用gradle開始編譯,而且吧編譯出來的tar包從文件的深層次拷貝出來
> ./gradlew build installDist -x test > ll azkaban-*/build/distributions/*.tar.gz > cp azkaban-*/build/distributions/*.tar.gz ./
編譯完成以後咱們就能夠獲取到solo,web,exec,db的編譯出來的可執行文件
solo方式其實就是單機模式,運行起來很是簡單,能夠簡單地體驗Azkaban的使用,數據庫使用的是內置的H2數據庫
> tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz > mv azkaban-solo-server-0.1.0-SNAPSHOT /usr/local/azkaban-solo-server
修改配置文件
> vim /usr/local/azkaban-solo-server/conf/azkaban.properties default.timezone.id=Asia/Shanghai
啓動
# 必定要在azkaban更目錄運行,它的配置文件默認是相對路徑 > cd /usr/local/azkaban-solo-server/ > bin/start-solo.sh
訪問8081就能夠看到具體的頁面了,用戶名密碼默認就是Azkaban,能夠經過編輯配置文件中的azka`ban-user.xml更改
若是須要關閉能夠執行以下指令
> /usr/local/azkaban-solo-server/bin/shutdown-solo.sh
生成job任務zip包
> vim command.job #command.job type=command command=echo 'hello' > zip -r command.zip command.job
經過右上角的uplad上傳
tow和solo最大的不一樣在於solo是在一個進程下啓動的,tow模式分別啓動了web-service和exec-server,雖然都是在同一臺機器啓動,tow須要使用mysql做爲數據庫 解壓
> cd /app/install/azkaban-3.50.0/ > tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz > tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz > tar -xzvf azkaban-db-0.1.0-SNAPSHOT.tar.gz
初始化Mysql用戶表.權限.數據
> mysql -u root -p mysql > CREATE DATABASE azkaban_two_server; mysql > CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban'; mysql > GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban_two_server.* to 'azkaban'@'%' WITH GRANT OPTION; mysql > use azkaban_two_server; mysql > source /app/install/azkaban-3.50.0/azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql;
配置web-server
> mv azkaban-web-server-0.1.0-SNAPSHOT /usr/local/azkaban-web-server # 由於web-server 和 exec-server都沒有默認配置文件咱們須要複製solo的配置文件 > cp -r /usr/local/azkaban-solo-server/conf/ /usr/local/azkaban-web-server > cp /app/install/azkaban-3.50.0/azkaban-web-server/src/test/resources/log4j.properties /usr/local/azkaban-web-server/conf > vim /usr/local/azkaban-web-server/conf/azkaban.properties #須要修改的地方 default.timezone.id=Asia/Shanghai #database.type=h2 #h2.path=./h2 #h2.create.tables=true database.type=mysql mysql.port=3306 mysql.host=azkaban mysql.database=azkaban_two_server mysql.user=azkaban mysql.password=azkaban mysql.numconnections=100
添加azkaban.native.lib=false 和 execute.as.user=false屬性
> mkdir -p plugins/jobtypes > vim commonprivate.properties azkaban.native.lib=false execute.as.user=false
啓動web-serrver並驗證
# 先關閉以前啓動的solo實例 > /usr/local/azkaban-solo-server/bin/shutdown-solo.sh > cd /usr/local/azkaban-web-server > bin/start-web.sh
能夠正常登錄便可
由於咱們只運行了web沒有運行exec節點若是執行任務會出現以下報錯
啓動exec
> mv /app/install/azkaban-3.50.0/azkaban-exec-server-0.1.0-SNAPSHOT /usr/local/azkaban-exec-server > cd /usr/local/azkaban-exec-server > cp -r ../azkaban-web-server/conf/ ./ > cp -r ../azkaban-web-server/plugins/ ./ # 運行exec > bin/start-exec.sh
而後在嘗試執行任務已經可以正常執行了
咱們先關閉本機上的exec
> /usr/local/azkaban-exec-server/bin/shutdown-exec.sh
筆者這邊準備了以前搭建好的CDH集羣下的master-1 和 master-2 節點做爲exec運行節點
首先互相配置好hosts在master-1 和 master-2 中配置 Azkaban的IP
> vim /etc/hosts 192.168.1.158 azkaban
在Azkaban服務器上配置master-1和master-2的IP
> vim /etc/hosts 192.168.3.21 master-1 192.168.3.22 master-2
拷貝exec到master-1和master-2節點
> scp -r /usr/local/azkaban-exec-server root@master-1:/usr/local/azkaban-exec-server > scp -r /usr/local/azkaban-exec-server root@master-2:/usr/local/azkaban-exec-server
關閉web-server修改配置文件
> /usr/local/azkaban-web-server/bin/shutdown-web.sh > vim /usr/local/azkaban-web-server/conf/azkaban.properties #啓用multiple-executor模式 azkaban.use.multiple.executors=true
兩種節點選擇規則,咱們由於不必定資源很是的空閒咱們選擇第二種對比選擇的方式選擇執行任務的節點
#在每次分發job時,先過濾出知足條件的executor,而後再作比較篩選 #如最小剩餘內存,MinimumFreeMemory,過濾器會檢查executor空餘內存是否會大於6G,若是不足6G,則web-server不會將任務交由該executor執行。可參考Azkaban Github源碼 #如CpuStatus,過濾器會檢查executor的cpu佔用率是否達到95%,若達到95%,web-server也不會將任務交給該executor執行。可參考Azkaban Github源碼。 #參數含義參考官網說明http://azkaban.github.io/azkaban/docs/latest/#configuration #azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus # 因爲是虛擬機,不須要過濾,只須要比較便可 # 某個任務是否指定了executor id azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1 # 是否比較內存 azkaban.executorselector.comparator.Memory=1 # 是否最後一次被分發 azkaban.executorselector.comparator.LastDispatched=1 # 是否比較CPU azkaban.executorselector.comparator.CpuUsage=1
在azkaban_two_server庫executors表中添加executor
> mysql -u root -p mysql > use azkaban_two_server; mysql > insert into executors(host,port,active) values("master-1",12321,1); mysql > insert into executors(host,port,active) values("master-2",12321,1);
而後能夠啓動程序了,順序爲web-server -> master-1 exec-server -> master-2 exec-server
> cd /usr/local/azkaban-web-server/ > ./bin/start-web.sh
> cd /usr/local/azkaban-exec-server/ > bin/start-exec.sh
咱們在運行一下test的job發現已是在其餘節點執行了,多跑幾回會發現它會在master-1和master-2上來回的切換