Azkaban 任務調度系統(安裝搭建) 原 薦

無論是在業務開發還是在大數據開發中,腳本都是必不可少的存在,在初期我們會使用crontab來解決問題,那麼當發現規模變大監控需求可視化需求的到來Crontab已經顯然滿足不了需求,抱着一顆解決大數據任務腳本和業務任務腳本難題的心態最終在oozie和Azkaban選擇了使用Azkaban來作爲公共任務調度系統,那麼就隨着筆者一同來學習Azkaban的基礎搭建場景和基本使用吧.

附上:

喵了個咪的博客:w-blog.cn

Azkaban官網: https://azkaban.github.io

官方文檔地址: http://azkaban.github.io/azkaban/docs/latest

一 ,基礎介紹

爲什麼需要任務調度?

一個完整的數據分析系統(業務系統)通常都是由大量任務單元組成:

  • shell腳本程序
  • java,python程序
  • mapreduce程序
  • hive腳本等
  • ...等等

各任務單元之間存在時間先後及前後依賴關係 爲了很好地組織起這樣的複雜執行計劃,需要一個工作流調度系統來調度執行;

1、 通過Hadoop先將原始數據同步到HDFS上;

2、 藉助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;

3、 需要對Hive中多個表的數據進行JOIN處理,得到一個明細數據Hive大表 ; 4、 將明細數據進行復雜的統計分析,得到結果報表信息;

5、 需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。

每一個任務都依賴於上一個任務的結構,在這樣的一個複雜度下顯然Crontab已經滿足不了需求,應爲複雜度的提升還會出現失敗處理分支和重試機制等

Azkaban的三種模式

Azkaban是一套簡單的任務調度服務,整體包括三部分webserver、dbserver、executorserver

  • solo-server模式:exec進程和web進程爲同一個進程,存放元數據的數據庫爲H2
  • two-server模式:與之前的單機版本類似,exec進程和web進程分開,存放元數據的數據庫爲mysql
  • multiple-executor模式:exec進程和web進程在不同的機器上,存放元數據的數據庫爲mysql

二, 安裝

使用系統組件版本如下:

  • centos-7.4
  • mysql-5.7
  • azkaban-3.50.0

首先修改主機名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的編譯出來的可執行文件

三, Azkaban-Solo 方式運行

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任務

生成job任務zip包

> vim  command.job
#command.job
type=command
command=echo 'hello' 

> zip -r command.zip command.job

通過右上角的uplad上傳

五 two-server 方式運行

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

然後在嘗試執行任務已經能夠正常執行了

六 , multiple-executor 方式運行

我們先關閉本機上的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上來回的切換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章