天天看點

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

文章目錄

  • 一,概述
    • 1.1 為什麼需要工作流排程系統
    • 1.2 Azkaban的适用場景
    • 1.3 什麼是azkaban
    • 1.4 Azkaban特點
    • 1.5 常見工作流排程系統
    • 1.6 ooize和azkaban特性對比
    • 1.7 Azkaban的架構
    • 1.8 Azkaban下載下傳位址
  • 二 Azkaban安裝部署
    • 2.1 安裝前準備
    • 2.2 安裝Azkaban
    • 2.3 生成密鑰庫
    • 2.4 時間同步配置
    • 2.5 配置檔案
      • 2.5.1 Web伺服器配置
      • 2.5.2 執行伺服器配置
    • 2.6 啟動executor伺服器
    • 2.7 啟動web伺服器
  • 三 Azkaban實戰
    • 3.1單一job案例
    • 3.2 多job工作流案例
    • 3.3 java操作任務
    • 3.3 HDFS操作任務
    • 3.4 mapreduce任務
    • 3.5 Hive腳本任務

一,概述

1.1 為什麼需要工作流排程系統

  • 1)一個完整的資料分析系統通常都是由大量任務單元組成:shell腳本程式,java程式,mapreduce程式、hive腳本等
  • 2)各任務單元之間存在時間先後及前後依賴關系
  • 3)為了很好地組織起這樣的複雜執行計劃,需要一個工作流排程系統來排程執行;

例如,我們可能有這樣一個需求,某個業務系統每天産生20G原始資料,我們每天都要對其進行處理,處理步驟如下所示:

  • 1)通過Hadoop先将原始資料上傳到HDFS上(HDFS的操作);
  • 2)使用MapReduce對原始資料進行清洗(MapReduce的操作);
  • 3)将清洗後的資料導入到hive表中(hive的導入操作);
  • 4)對Hive中多個表的資料進行JOIN處理,得到一張hive的明細表(建立中間表);
  • 5)通過對明細表的統計和分析,得到結果報表資訊(hive的查詢操作);
Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

1.2 Azkaban的适用場景

根據以上業務場景: (2)任務依賴(1)任務的結果,(3)任務依賴(2)任務的結果,(4)任務依賴(3)任務的結果,(5)任務依賴(4)任務的結果。一般的做法是,先執行完(1)再執行(2),再一次執行(3)(4)(5)。

這樣的話,整個的執行過程都需要人工參加,并且得盯着各任務的進度。但是我們的很多任務都是在深更半夜執行的,通過寫腳本設定crontab執行。其實,整個過程類似于一個有向無環圖(DAG)。每個子任務相當于大任務中的一個節點,也就是,我們需要的就是一個工作流的排程器,而Azkaban就是能解決上述問題的一個排程器。

1.3 什麼是azkaban

Azkaban是由Linkedin公司推出的一個批量工作流任務排程器,主要用于在一個工作流内以一個特定的順序運作一組工作和流程,它的配置是通過簡單的key:value對的方式,通過配置中的dependencies 來設定依賴關系。Azkaban使用job配置檔案建立任務之間的依賴關系,并提供一個易于使用的web使用者界面維護和跟蹤你的工作流。

1.4 Azkaban特點

  1. 相容任何版本的hadoop
  2. 易于使用的Web使用者界面
  3. 簡單的工作流的上傳
  4. 友善設定任務之間的關系
  5. 排程工作流
  6. 子產品化和可插拔的插件機制
  7. 認證/授權(權限的工作)
  8. 能夠殺死并重新啟動工作流
  9. 有關失敗和成功的電子郵件提醒

1.5 常見工作流排程系統

  1. 簡單的任務排程:直接使用crontab實作;
  2. 複雜的任務排程:開發排程平台或使用現成的開源排程系統,比如ooize、azkaban等

1.6 ooize和azkaban特性對比

下面的表格對上述四種hadoop工作流排程器的關鍵特性進行了比較,盡管這些工作流排程器能夠解決的需求場景基本一緻,但在設計理念,目标使用者,應用場景等方面還是存在顯著的差別,在做技術選型的時候,可以提供參考

特性 Oozie Azkaban
工作流描述語言 XML text file with key/value pairs
是否要web容器 Yes Yes
進度跟蹤 web page web page
Hadoop job排程支援 yes yes
運作模式 daemon daemon
事件通知 no Yes
需要安裝 yes yes
支援的hadoop版本 0.20+ currently unknown
重試支援 workflownode evel yes
運作任意指令 yes yes

1.7 Azkaban的架構

Azkaban由三個關鍵元件構成:

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰
  1. 1)AzkabanWebServer:AzkabanWebServer是整個Azkaban工作流系統的主要管理者,它使用者登入認證、負責project管理、定時執行工作流、跟蹤工作流執行進度等一系列任務。
  2. AzkabanExecutorServer:負責具體的工作流的送出、執行,它們通過mysql資料庫來協調任務的執行。
  3. 關系型資料庫(MySQL):存儲大部分執行流狀态,AzkabanWebServer和AzkabanExecutorServer都需要通路資料庫。

1.8 Azkaban下載下傳位址

下載下傳位址:http://azkaban.github.io/downloads.html

二 Azkaban安裝部署

2.1 安裝前準備

  • 将Azkaban Web伺服器、Azkaban執行伺服器、Azkaban的sql執行腳本及MySQL安裝包拷貝到hadoop102虛拟機/opt/software目錄下
    • azkaban-web-server-2.5.0.tar.gz
    • azkaban-executor-server-2.5.0.tar.gz
    • azkaban-sql-script-2.5.0.tar.gz
    • mysql-libs.zip
  • 選擇Mysql作為Azkaban資料庫,因為Azkaban建立了一些Mysql連接配接增強功能,以友善Azkaban設定,并增強服務可靠性。

2.2 安裝Azkaban

1)在/opt/module/目錄下建立azkaban目錄

[[email protected] module]$ mkdir azkaban
           

2)解壓azkaban-web-server-2.5.0.tar.gz、azkaban-executor-server-2.5.0.tar.gz、azkaban-sql-script-2.5.0.tar.gz到/opt/module/azkaban目錄下

[[email protected] software]$ tar -zxvf azkaban-web-server-2.5.0.tar.gz -C /opt/module/azkaban/
[[email protected] software]$ tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C /opt/module/azkaban/
[[email protected] software]$ tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C /opt/module/azkaban/
           

3)對解壓後的檔案重新命名

[[email protected] azkaban]$ mv azkaban-web-2.5.0/ server
[[email protected] azkaban]$ mv azkaban-executor-2.5.0/ executor
           

4)azkaban腳本導入

進入mysql,建立azkaban資料庫,并将解壓的腳本導入到azkaban資料庫。

[[email protected] azkaban]$ mysql -uroot -p000000
mysql> create database azkaban;
mysql> use azkaban;
mysql> source /opt/module/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql
           

注:source後跟.sql檔案,用于批量處理.sql檔案中的sql語句。

2.3 生成密鑰庫

  • Keytool是java資料證書的管理工具,使使用者能夠管理自己的公/私鑰對及相關證書。
  • -keystore 指定密鑰庫的名稱及位置(産生的各類資訊将不在.keystore檔案中)
  • -genkey 在使用者主目錄中建立一個預設檔案".keystore"
  • -alias 對我們生成的.keystore 進行指認别名;如果沒有預設是mykey
  • -keyalg 指定密鑰的算法 RSA/DSA 預設是DSA

1)生成 keystore的密碼及相應資訊的密鑰庫

[[email protected] azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
輸入密鑰庫密碼:  
再次輸入新密碼: 
您的名字與姓氏是什麼?
  [Unknown]:  
您的組織機關名稱是什麼?
  [Unknown]:  
您的組織名稱是什麼?
  [Unknown]:  
您所在的城市或區域名稱是什麼?
  [Unknown]:  
您所在的省/市/自治區名稱是什麼?
  [Unknown]:  
該機關的雙字母國家/地區代碼是什麼?
  [Unknown]:  
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
  [否]:  y

輸入 <jetty> 的密鑰密碼
        (如果和密鑰庫密碼相同, 按回車):  
再次輸入新密碼:
注意:
密鑰庫的密碼至少必須6個字元,可以是純數字或者字母或者數字和字母的組合等等
密鑰庫的密碼最好和<jetty> 的密鑰相同,友善記憶
           

2)将keystore 拷貝到 azkaban web伺服器根目錄中

2.4 時間同步配置

先配置好伺服器節點上的時區

1)如果在/usr/share/zoneinfo/這個目錄下不存在時區配置檔案Asia/Shanghai,就要用 tzselect 生成。

[[email protected] azkaban]$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
 1) Afghanistan           18) Israel                35) Palestine
 2) Armenia               19) Japan                 36) Philippines
 3) Azerbaijan            20) Jordan                37) Qatar
 4) Bahrain               21) Kazakhstan            38) Russia
 5) Bangladesh            22) Korea (North)         39) Saudi Arabia
 6) Bhutan                23) Korea (South)         40) Singapore
 7) Brunei                24) Kuwait                41) Sri Lanka
 8) Cambodia              25) Kyrgyzstan            42) Syria
 9) China                 26) Laos                  43) Taiwan
10) Cyprus                27) Lebanon               44) Tajikistan
11) East Timor            28) Macau                 45) Thailand
12) Georgia               29) Malaysia              46) Turkmenistan
13) Hong Kong             30) Mongolia              47) United Arab Emirates
14) India                 31) Myanmar (Burma)       48) Uzbekistan
15) Indonesia             32) Nepal                 49) Vietnam
16) Iran                  33) Oman                  50) Yemen
17) Iraq                  34) Pakistan
#? 9
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#? 1

The following information has been given:

        China
        Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Local time is now:      Thu Oct 18 16:24:23 CST 2018.
Universal Time is now:  Thu Oct 18 08:24:23 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
        TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
           

2)拷貝該時區檔案,覆寫系統本地時區配置

[[email protected] azkaban]$ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
           

3)叢集時間同步(同時發給三個視窗)

2.5 配置檔案

2.5.1 Web伺服器配置

1)進入azkaban web伺服器安裝目錄 conf目錄,打開azkaban.properties檔案

[[email protected] conf]$ pwd
/opt/module/azkaban/server/conf
[[email protected] conf]$ vim azkaban.properties
           

2)按照如下配置修改azkaban.properties檔案。

#Azkaban Personalization Settings
#伺服器UI名稱,用于伺服器上方顯示的名字
azkaban.name=Test
#描述
azkaban.label=My Local Azkaban
#UI顔色
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
#預設web server存放web檔案的目錄
web.resource.dir=/opt/module/azkaban/server/web/
#預設時區,已改為亞洲/上海 預設為美國
default.timezone.id=Asia/Shanghai

#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
#使用者權限管理預設類(絕對路徑)
user.manager.xml.file=/opt/module/azkaban/server/conf/azkaban-users.xml

#Loader for projects
#global配置檔案所在位置(絕對路徑)
executor.global.properties=/opt/module/azkaban/executor/conf/global.properties
azkaban.project.dir=projects

#資料庫類型
database.type=mysql
#端口号
mysql.port=3306
#資料庫連接配接IP
mysql.host=hadoop102
#資料庫執行個體名
mysql.database=azkaban
#資料庫使用者名
mysql.user=root
#資料庫密碼
mysql.password=000000
#最大連接配接數
mysql.numconnections=100

# Velocity dev mode
velocity.dev.mode=false

# Azkaban Jetty server properties.
# Jetty伺服器屬性.
#最大線程數
jetty.maxThreads=25
#Jetty SSL端口
jetty.ssl.port=8443
#Jetty端口
jetty.port=8081
#SSL檔案名(絕對路徑)
jetty.keystore=/opt/module/azkaban/server/keystore
#SSL檔案密碼
jetty.password=000000
#Jetty主密碼與keystore檔案相同
jetty.keypassword=000000
#SSL檔案名(絕對路徑)
jetty.truststore=/opt/module/azkaban/server/keystore
#SSL檔案密碼
jetty.trustpassword=000000

# Azkaban Executor settings
executor.port=12321

# mail settings
mail.sender=
mail.host=
job.failure.email=
job.success.email=

lockdown.create.projects=false

cache.directory=cache
           

3)web伺服器使用者配置

在azkaban web伺服器安裝目錄 conf目錄,按照如下配置修改azkaban-users.xml 檔案,增加管理者使用者。

[[email protected] conf]$ vim 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>
           

2.5.2 執行伺服器配置

1)進入執行伺服器安裝目錄conf,打開azkaban.properties

[[email protected] conf]$ pwd
/opt/module/azkaban/executor/conf
[[email protected] conf]$ vim azkaban.properties
           

2)按照如下配置修改azkaban.properties檔案。

#Azkaban
#時區
default.timezone.id=Asia/Shanghai

# Azkaban JobTypes Plugins
#jobtype 插件所在位置
azkaban.jobtype.plugin.dir=plugins/jobtypes

#Loader for projects
executor.global.properties=/opt/module/azkaban/executor/conf/global.properties
azkaban.project.dir=projects

database.type=mysql
mysql.port=3306
mysql.host=hadoop102
mysql.database=azkaban
mysql.user=root
mysql.password=000000
mysql.numconnections=100

# Azkaban Executor settings
#最大線程數
executor.maxThreads=50
#端口号(如修改,請與web服務中一緻)
executor.port=12321
#線程數
executor.flow.threads=30
           

2.6 啟動executor伺服器

在executor伺服器目錄下執行啟動指令

[[email protected] executor]$ pwd
/opt/module/azkaban/executor
[[email protected] executor]$ bin/azkaban-executor-start.sh
           

2.7 啟動web伺服器

在azkaban web伺服器目錄下執行啟動指令

[[email protected] server]$ pwd
/opt/module/azkaban/server
[[email protected] server]$ bin/azkaban-web-start.sh
           

注意:

先執行executor,再執行web,避免Web Server會因為找不到執行器啟動失敗。

jps檢視程序

[[email protected] server]$ jps
3601 AzkabanExecutorServer
5880 Jps
3661 AzkabanWebServer
           

啟動完成後,在浏覽器(建議使用谷歌浏覽器)中輸入https://伺服器IP位址:8443,即可通路azkaban服務了。

在登入中輸入剛才在azkaban-users.xml檔案中新添加的戶用名及密碼,點選 login。

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

三 Azkaban實戰

Azkaba内置的任務類型支援command、java

3.1單一job案例

1)建立job描述檔案

[[email protected] jobs]$ vim first.job
#first.job
type=command
command=echo 'this is my first job'
           
  1. 将job資源檔案打包成zip檔案
[[email protected] jobs]$ zip first.zip first.job 
  adding: first.job (deflated 15%)
[[email protected] jobs]$ ll
總用量 8
-rw-rw-r--. 1 atguigu atguigu  60 10月 18 17:42 first.job
-rw-rw-r--. 1 atguigu atguigu 219 10月 18 17:43 first.zip
           

注意:

目前,Azkaban上傳的工作流檔案隻支援xxx.zip檔案。zip應包含xxx.job運作作業所需的檔案和任何檔案(檔案名字尾必須以.job結尾,否則無法識别)。作業名稱在項目中必須是唯一的。

3)通過azkaban的web管理平台建立project并上傳job的zip包

首先建立project

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

上傳zip包

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

4)啟動執行該job

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

點選執行工作流

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

點選繼續

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

5)Job執行成功

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

6)點選檢視job日志

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

3.2 多job工作流案例

1)建立有依賴關系的多個job描述

第一個job:start.job

[[email protected] jobs]$ vim start.job
#start.job
type=command
command=touch /opt/module/kangkang.txt
           

第二個job:step1.job依賴start.job

[[email protected] jobs]$ vim step1.job
#step1.job
type=command
dependencies=start
command=echo "this is step1 job"
           

第三個job:step2.job依賴start.job

[[email protected] jobs]$ vim step2.job
#step2.job
type=command
dependencies=start
command=echo "this is step2 job"
           

第四個job:finish.job依賴step1.job和step2.job

[[email protected] jobs]$ vim finish.job
#finish.job
type=command
dependencies=step1,step2
command=echo "this is finish job"
           

2)将所有job資源檔案打到一個zip包中

[[email protected] jobs]$ zip jobs.zip start.job step1.job step2.job finish.job
updating: start.job (deflated 16%)
  adding: step1.job (deflated 12%)
  adding: step2.job (deflated 12%)
  adding: finish.job (deflated 14%) 
           

3)在azkaban的web管理界面建立工程并上傳zip包

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

4)啟動工作流flow

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

5)檢視結果

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

思考:

将student.txt檔案上傳到hdfs,根據所傳檔案建立外部表,再将表中查詢到的結果寫入到本地檔案

3.3 java操作任務

使用Azkaban排程java程式

1)編寫java程式

import java.io.IOException;

public class AzkabanTest {
	public void run() throws IOException {
        // 根據需求編寫具體代碼
		FileOutputStream fos = new FileOutputStream("/opt/module/azkaban/output.txt");
		fos.write("this is a java progress".getBytes());
		fos.close();
    }

	public static void main(String[] args) throws IOException {
		AzkabanTest azkabanTest = new AzkabanTest();
		azkabanTest.run();
	}
}
           

2)将java程式打成jar包,建立lib目錄,将jar放入lib内

[[email protected] azkaban]$ mkdir lib
[[email protected] azkaban]$ cd lib/
[[email protected] lib]$ ll
總用量 4
-rw-rw-r--. 1 atguigu atguigu 3355 10月 18 20:55 azkaban-0.0.1-SNAPSHOT.jar
           

3)編寫job檔案

[[email protected] jobs]$ vim azkabanJava.job
#azkabanJava.job
type=javaprocess
java.class=com.atguigu.azkaban.AzkabanTest
classpath=/opt/module/azkaban/lib/*

           

4)将job檔案打成zip包

[[email protected] jobs]$ zip azkabanJava.zip azkabanJava.job 
  adding: azkabanJava.job (deflated 19%)
           

5)通過azkaban的web管理平台建立project并上傳job壓縮包,啟動執行該job

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰
[[email protected] azkaban]$ pwd
/opt/module/azkaban
[[email protected] azkaban]$ ll
總用量 24
drwxrwxr-x.  2 atguigu atguigu 4096 10月 17 17:14 azkaban-2.5.0
drwxrwxr-x. 10 atguigu atguigu 4096 10月 18 17:17 executor
drwxrwxr-x.  2 atguigu atguigu 4096 10月 18 20:35 jobs
drwxrwxr-x.  2 atguigu atguigu 4096 10月 18 20:54 lib
-rw-rw-r--.  1 atguigu atguigu   23 10月 18 20:55 output
drwxrwxr-x.  9 atguigu atguigu 4096 10月 18 17:17 server
[[email protected] azkaban]$ cat output 
this is a java progress
           

3.3 HDFS操作任務

1)建立job描述檔案

[[email protected] jobs]$ vim fs.job
#hdfs job
type=command
command=/opt/module/hadoop-2.7.2/bin/hadoop fs -mkdir /azkaban
           

2)将job資源檔案打包成zip檔案

[[email protected] jobs]$ zip fs.zip fs.job 
  adding: fs.job (deflated 12%)
           

3)通過azkaban的web管理平台建立project并上傳job壓縮包

4)啟動執行該job

5)檢視結果

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰
Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

3.4 mapreduce任務

mapreduce任務依然可以使用azkaban進行排程

1)建立job描述檔案,及mr程式jar包

[[email protected] jobs]$ vim mapreduce.job
#mapreduce job
type=command
command=/opt/module/hadoop-2.7.2/bin/hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount/input /wordcount/output
           

2)将所有job資源檔案打到一個zip包中

[[email protected] jobs]$ zip mapreduce.zip mapreduce.job 
  adding: mapreduce.job (deflated 43%)
           

3)在azkaban的web管理界面建立工程并上傳zip包

4)啟動job

5)檢視結果

Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

3.5 Hive腳本任務

1)建立job描述檔案和hive腳本

(1)Hive腳本:student.sql

[[email protected] jobs]$ vim student.sql
use default;
drop table student;
create table student(id int, name string)
row format delimited fields terminated by '\t';
load data local inpath '/opt/module/datas/student.txt' into table student;
insert overwrite local directory '/opt/module/datas/student'
row format delimited fields terminated by '\t'
select * from student;
           

(2)Job描述檔案:hive.job

[[email protected] jobs]$ vim hive.job
#hive job
type=command
command=/opt/module/hive/bin/hive -f /opt/module/azkaban/jobs/student.sql
           

2)将所有job資源檔案打到一個zip包中

[[email protected] jobs]$ zip hive.zip hive.job 
  adding: hive.job (deflated 21%)
           

3)在azkaban的web管理界面建立工程并上傳zip包

4)啟動job

5)檢視結果

[[email protected] student]$ cat /opt/module/datas/student/000000_0 
1001    yangyang
1002    bobo
1003    banzhang
1004    pengpeng
           
Azkaban學習之路 —— 一文帶你了解Azkaban一,概述二 Azkaban安裝部署三 Azkaban實戰

繼續閱讀