該文章是基於 Hadoop2.7.6_01_部署 、 Hive-1.2.1_01_安裝部署 進行的 1. 前言 在一個完整的大數據處理系統中,除了hdfs+mapreduce+hive組成分析系統的核心之外,還需要數據採集、結果數據導出、任務調度等不可或缺的輔助系統,而這些輔助工具在hadoop生態 ...
該文章是基於 Hadoop2.7.6_01_部署 、 Hive-1.2.1_01_安裝部署 進行的
1. 前言
在一個完整的大數據處理系統中,除了hdfs+mapreduce+hive組成分析系統的核心之外,還需要數據採集、結果數據導出、任務調度等不可或缺的輔助系統,而這些輔助工具在hadoop生態體系中都有便捷的開源框架,如圖所示:
2. 工作流調度器azkaban概述
2.1. 為什麼需要工作流調度系統
- 一個完整的數據分析系統通常都是由大量任務單元組成:
shell腳本程式,java程式,mapreduce程式、hive腳本等
- 各任務單元之間存在時間先後及前後依賴關係
- 為了很好地組織起這樣的複雜執行計劃,需要一個工作流調度系統來調度執行;
例如,我們可能有這樣一個需求,某個業務系統每天產生20G原始數據,我們每天都要對其進行處理,處理步驟如下所示:
1、 通過Hadoop先將原始數據同步到HDFS上;
2、 藉助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;
3、 需要對Hive中多個表的數據進行JOIN處理,得到一個明細數據Hive大表;
4、 將明細數據進行複雜的統計分析,得到結果報表信息;
5、 需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。
2.2. 工作流調度實現方式
簡單的任務調度:直接使用linux的crontab來定義;
複雜的任務調度:開發調度平臺
或使用現成的開源調度系統,比如ooize、azkaban等
2.3. 常見工作流調度系統
市面上目前有許多工作流調度器
在hadoop領域,常見的工作流調度器有Oozie, Azkaban,Cascading,Hamake等
2.4. Azkaban與Oozie對比
對市面上最流行的兩種調度器,給出以下詳細對比,以供技術選型參考。總體來說,ooize相比azkaban是一個重量級的任務調度系統,功能全面,但配置使用也更複雜。如果可以不在意某些功能的缺失,輕量級調度器azkaban是很不錯的候選對象。
詳情如下:
- 功能
兩者均可以調度mapreduce,pig,java,腳本工作流任務
兩者均可以定時執行工作流任務
- 工作流定義
Azkaban使用Properties文件定義工作流
Oozie使用XML文件定義工作流
- 工作流傳參
Azkaban支持直接傳參,例如${input}
Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)}
- 定時執行
Azkaban的定時執行任務是基於時間的
Oozie的定時執行任務基於時間和輸入數據
- 資源管理
Azkaban有較嚴格的許可權控制,如用戶對工作流進行讀/寫/執行等操作
Oozie暫無嚴格的許可權控制
- 工作流執行
Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一臺節點)和multi server mode(executor server和web server可以部署在不同節點)
Oozie作為工作流伺服器運行,支持多用戶和多工作流
- 工作流管理
Azkaban支持瀏覽器以及ajax方式操作工作流
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流
3. Azkaban介紹
Azkaban是由Linkedin開源的一個批量工作流任務調度器。用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關係,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。
它有如下功能特點:
Web用戶界面
方便上傳工作流
方便設置任務之間的關係
調度工作流
認證/授權(許可權的工作)
能夠殺死並重新啟動工作流
模塊化和可插拔的插件機制
項目工作區
工作流和任務的日誌記錄和審計
3.1. Azkaban使用MySQL存儲state的信息
AzkabanWebServer和AzkabanExecutorServer 都是能夠訪問MySQL的
web server使用DB的原因如下:
Project Management 項目,項目的許可權以及上傳的文件
Executing Flow State 跟蹤執行流,執行程式運行它們
Previous Flow/Jobs 搜索之前的作業和流程執行,以及訪問他們的日誌文件
Scheduler 保持預定的工作狀態
SLA 保持所有sla規則
executor server使用DB的原因如下:
Access the project 從資料庫中檢索項目文件
Executing Flows/Jobs 檢索和更新 流和正在執行的數據
Logs 將輸出日誌存儲到作業中並流入到db中
Interflow dependency 如果流在不同的執行器上運行,則它將從DB中獲取狀態
4. Azkaban安裝部署
將安裝文件上傳到集群,最好上傳到安裝 hive、sqoop的機器上,方便命令的執行
準備工作
Azkaban Web伺服器
azkaban-web-server-2.5.0.tar.gz
Azkaban執行伺服器
azkaban-executor-server-2.5.0.tar.gz
MySQL
azkaban-2.5.0只支持 mysql,需安裝mysql伺服器,本文檔中預設已安裝好mysql伺服器,下文中會建立 azkaban用戶,密碼 azkaban.
1 # 相關信息 2 [yun@mini01 azkaban]$ pwd 3 /app/software/azkaban 4 [yun@mini01 azkaban]$ ll 5 total 22612 6 -rw-r--r-- 1 yun yun 11157302 May 14 00:59 azkaban-executor-server-2.5.0.tar.gz 7 -rw-r--r-- 1 yun yun 1928 May 14 00:57 azkaban-sql-script-2.5.0.tar.gz 8 -rw-r--r-- 1 yun yun 11989669 May 14 00:59 azkaban-web-server-2.5.0.tar.gz 9 # 解壓縮包 10 [yun@mini01 azkaban]$ tar xf azkaban-executor-server-2.5.0.tar.gz 11 [yun@mini01 azkaban]$ tar xf azkaban-web-server-2.5.0.tar.gz 12 [yun@mini01 azkaban]$ tar xf azkaban-sql-script-2.5.0.tar.gz 13 [yun@mini01 azkaban]$ ll 14 total 22616 15 drwxrwxr-x 2 yun yun 4096 Jul 29 17:02 azkaban-2.5.0 16 drwxrwxr-x 7 yun yun 92 Jul 29 17:02 azkaban-executor-2.5.0 17 -rw-r--r-- 1 yun yun 11157302 May 14 00:59 azkaban-executor-server-2.5.0.tar.gz 18 -rw-r--r-- 1 yun yun 1928 May 14 00:57 azkaban-sql-script-2.5.0.tar.gz 19 drwxrwxr-x 8 yun yun 103 Jul 29 17:02 azkaban-web-2.5.0 20 -rw-r--r-- 1 yun yun 11989669 May 14 00:59 azkaban-web-server-2.5.0.tar.gz
4.1. MySQL部署
建庫並授權
1 # 在mini03上操作 2 # 建庫 3 MariaDB [(none)]> CREATE DATABASE azkaban DEFAULT CHARACTER SET utf8 ; 4 Query OK, 1 row affected (0.00 sec) 5 6 MariaDB [(none)]> show create database azkaban; 7 +----------+------------------------------------------------------------------+ 8 | Database | Create Database | 9 +----------+------------------------------------------------------------------+ 10 | azkaban | CREATE DATABASE `azkaban` /*!40100 DEFAULT CHARACTER SET utf8 */ | 11 +----------+------------------------------------------------------------------+ 12 1 row in set (0.00 sec) 13 14 MariaDB [(none)]> show databases; 15 +--------------------+ 16 | Database | 17 +--------------------+ 18 | information_schema | 19 | azkaban | 20 | hive | 21 | mysql | 22 | performance_schema | 23 | test | 24 | zhang | 25 +--------------------+ 26 7 rows in set (0.00 sec) 27 28 # 授權 29 MariaDB [(none)]> grant all on azkaban.* to azkaban@'%' identified by 'azkaban'; 30 Query OK, 0 rows affected (0.00 sec) 31 32 MariaDB [(none)]> 33 MariaDB [(none)]> flush privileges; 34 Query OK, 0 rows affected (0.00 sec) 35 36 MariaDB [(none)]> select user,host from mysql.user; 37 +---------+-----------+ 38 | user | host | 39 +---------+-----------+ 40 | azkaban | % | 41 | hive | % | 42 | root | % | 43 | root | 127.0.0.1 | 44 | root | ::1 | 45 | | localhost | 46 | root | localhost | 47 | | mini03 | 48 | hive | mini03 | 49 | root | mini03 | 50 +---------+-----------+ 51 10 rows in set (0.00 sec)
導入數據
1 # 在有azkaban的SQL語句機器上操作 2 [yun@mini01 azkaban-2.5.0]$ pwd 3 /app/software/azkaban/azkaban-2.5.0 4 [yun@mini01 azkaban-2.5.0]$ ll 5 total 88 6 -rwxr-xr-x 1 yun yun 129 Apr 22 2014 create.active_executing_flows.sql 7 -rwxr-xr-x 1 yun yun 216 Apr 22 2014 create.active_sla.sql 8 -rwxr-xr-x 1 yun yun 4694 Apr 22 2014 create-all-sql-2.5.0.sql # 包含所有庫信息 9 -rwxr-xr-x 1 yun yun 610 Apr 22 2014 create.execution_flows.sql 10 -rwxr-xr-x 1 yun yun 519 Apr 22 2014 create.execution_jobs.sql 11 -rwxr-xr-x 1 yun yun 358 Apr 22 2014 create.execution_logs.sql 12 -rwxr-xr-x 1 yun yun 224 Apr 22 2014 create.project_events.sql 13 -rwxr-xr-x 1 yun yun 227 Apr 22 2014 create.project_files.sql 14 -rwxr-xr-x 1 yun yun 280 Apr 22 2014 create.project_flows.sql 15 -rwxr-xr-x 1 yun yun 285 Apr 22 2014 create.project_permissions.sql 16 -rwxr-xr-x 1 yun yun 294 Apr 22 2014 create.project_properties.sql 17 -rwxr-xr-x 1 yun yun 380 Apr 22 2014 create.projects.sql 18 -rwxr-xr-x 1 yun yun 325 Apr 22 2014 create.project_versions.sql 19 -rwxr-xr-x 1 yun yun 155 Apr 22 2014 create.properties.sql 20 -rwxr-xr-x 1 yun yun 498 Apr 22 2014 create.schedules.sql 21 -rwxr-xr-x 1 yun yun 189 Apr 22 2014 create.triggers.sql 22 -rwxr-xr-x 1 yun yun 22 Apr 22 2014 database.properties 23 -rwxr-xr-x 1 yun yun 671 Apr 22 2014 update-all-sql-2.1.sql 24 -rwxr-xr-x 1 yun yun 156 Apr 22 2014 update-all-sql-2.2.sql 25 -rwxr-xr-x 1 yun yun 395 Apr 22 2014 update.execution_logs.2.1.sql 26 -rwxr-xr-x 1 yun yun 59 Apr 22 2014 update.project_properties.2.1.sql 27 [yun@mini01 azkaban-2.5.0]$ ll /app/software/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql # 要導入的SQL文件 28 -rwxr-xr-x 1 yun yun 4694 Apr 22 2014 /app/software/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql 29 [yun@mini01 azkaban-2.5.0]$ 30 [yun@mini01 azkaban-2.5.0]$ mysql -hmini03 -uazkaban -pazkaban 31 Welcome to the MariaDB monitor. Commands end with ; or \g. 32 Your MariaDB connection id is 4 33 Server version: 5.5.56-MariaDB MariaDB Server 34 35 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. 36 37 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 38 39 MariaDB [(none)]> use azkaban; # 使用庫 40 Database changed 41 MariaDB [azkaban]> source /app/software/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql 42 ……………… 43 MariaDB [azkaban]> show tables; 44 +------------------------+ 45 | Tables_in_azkaban | 46 +------------------------+ 47 | active_executing_flows | 48 | active_sla | 49 | execution_flows | 50 | execution_jobs | 51 | execution_logs | 52 | project_events | 53 | project_files | 54 | project_flows | 55 | project_permissions | 56 | project_properties | 57 | project_versions | 58 | projects | 59 | properties | 60 | schedules | 61 | triggers | 62 +------------------------+ 63 15 rows in set (0.00 sec)
4.2. azkaban執行服器和web伺服器部署
1 [yun@mini01 azkaban]$ pwd 2 /app/software/azkaban 3 [yun@mini01 azkaban]$ ll 4 total 22616 5 drwxrwxr-x 2 yun yun 4096 Jul 29 17:02 azkaban-2.5.0 6 drwxrwxr-x 7 yun yun 92 Jul 29 17:02 azkaban-executor-2.5.0 7 -rw-r--r-- 1 yun yun 11157302 May 14 00:59 azkaban-executor-server-2.5.0.tar.gz 8 -rw-r--r-- 1 yun yun 1928 May 14 00:57 azkaban-sql-script-2.5.0.tar.gz 9 drwxrwxr-x 8 yun yun 103 Jul 29 17:02 azkaban-web-2.5.0 10 -rw-r--r-- 1 yun yun 11989669 May 14 00:59 azkaban-web-server-2.5.0.tar.gz 11 # 先創建/app/azkaban/ 目錄 12 [yun@mini01 azkaban]$ cp -a azkaban-executor-2.5.0 /app/azkaban/executor-2.5.0 13 [yun@mini01 azkaban]$ cp -a azkaban-web-2.5.0 /app/azkaban/web-server-2.5.0 14 [yun@mini01 azkaban]$ cd /app/azkaban/ 15 [yun@mini01 azkaban]$ ll 16 total 0 17 drwxrwxr-x 7 yun yun 92 Jul 29 17:02 executor-2.5.0 18 drwxrwxr-x 8 yun yun 103 Jul 29 17:02 web-server-2.5.0
4.3. 為azkaban創建SSL配置
1 [yun@mini01 azkaban]$ pwd 2 /app/azkaban 3 [yun@mini01 azkaban]$ ll 4 total 4 5 drwxrwxr-x 7 yun yun 92 Jul 29 17:02 executor-2.5.0 6 drwxrwxr-x 8 yun yun 103 Jul 29 17:02 web-server-2.5.0 7 [yun@mini01 azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA 8 Enter keystore password: # 輸入123456 9 Re-enter new password: # 輸入123456 10 What is your first and last name? 11 [Unknown]: 12 What is the name of your organizational unit? 13 [Unknown]: 14 What is the name of your organization? 15 [Unknown]: 16 What is the name of your City or Locality? 17 [Unknown]: 18 What is the name of your State or Province? 19 [Unknown]: 20 What is the two-letter country code for this unit? 21 [Unknown]: CN 22 Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN correct? 23 [no]: yes 24 25 Enter key password for <jetty> 26 (RETURN if same as keystore password): 27 # 查看生成的keystore 28 [yun@mini01 azkaban]$ ll 29 total 4 30 drwxrwxr-x 7 yun yun 92 Jul 29 17:02 executor-2.5.0 31 -rw-rw-r-- 1 yun yun 2233 Jul 29 17:46 keystore 32 drwxrwxr-x 8 yun yun 103 Jul 29 17:02 web-server-2.5.0 33 [yun@mini01 azkaban]$ cp -a keystore web-server-2.5.0/ # 將keystore拷貝到azkaban的web中 34 [yun@mini01 azkaban]$ ll web-server-2.5.0/ 35 total 12 36 -rw-r--r-- 1 yun yun 105 Apr 22 2014 azkaban.version 37 drwxr-xr-x 2 yun yun 112 Apr 22 2014 bin 38 drwxr-xr-x 2 yun yun 57 Jul 29 17:02 conf 39 drwxr-xr-x 2 yun yun 6 Apr 22 2014 extlib 40 -rw-rw-r-- 1 yun yun 2233 Jul 29 17:46 keystore 41 drwxr-xr-x 2 yun yun 4096 Jul 29 17:02 lib 42 drwxr-xr-x 2 yun yun 6 Apr 22 2014 plugins 43 drwxr-xr-x 6 yun yun 73 Jul 29 17:02 web
4.4. 配置文件
註:先配置好伺服器節點上的時區
1、先生成時區配置文件Asia/Shanghai,用互動式命令 tzselect 即可
2、拷貝該時區文件,覆蓋系統本地時區配置
1 # 也可以是軟連接 2 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4.4.1. web伺服器配置
1 [yun@mini01 conf]$ pwd 2 /app/azkaban/web-server-2.5.0/conf 3 [yun@mini01 conf]$ ll 4 total 8 5 -rw-r--r-- 1 yun yun 1007 Jul 29 19:29 azkaban.properties 6 -rw-r--r-- 1 yun yun 266 Apr 22 2014 azkaban-users.xml 7 #### azkaban.properties 配置 8 [yun@mini01 conf]$ vim azkaban.properties 9 #Azkaban Personalization Settings 10 azkaban.name=Test #伺服器UI名稱,用於伺服器上方顯示的名字 11 azkaban.label=My Local Azkaban #描述 12 azkaban.color=#FF3601 #UI顏色 13 azkaban.default.servlet.path=/index 14 web.resource.dir=web/ #預設根web目錄 15 default.timezone.id=Asia/Shanghai #時區 16 17 #Azkaban UserManager class 18 user.manager.class=azkaban.user.XmlUserManager #用戶許可權管理預設類 19 user.manager.xml.file=conf/azkaban-users.xml #用戶配置,具體配置參加下文 20 21 #Loader for projects 22 executor.global.properties=conf/global.properties # global配置文件所在位置 23 azkaban.project.dir=projects 24 25 database.type=mysql 26 mysql.port=3306 27 mysql.host=mini03 28 mysql.database=azkaban 29 mysql.user=azkaban 30 mysql.password=azkaban 31 mysql.numconnections=100 #最大連接數 32 33 # Velocity dev mode 34 velocity.dev.mode=false 35 36 # Azkaban Jetty server properties. 37 jetty.maxThreads=25 #最大線程數 38 jetty.ssl.port=8443 #Jetty SSL埠 39 jetty.port=8081 #Jetty埠 40 jetty.keystore=keystore #SSL文件名 41 jetty.password=123456 #SSL文件密碼 42 jetty.keypassword=123456 #Jetty主密碼 與 keystore文件相同 43 jetty.truststore=keystore #SSL文件名 44 jetty.trustpassword=123456 # SSL文件密碼 45 46 # Azkaban Executor settings 47 executor.port=12321 #執行伺服器埠 48 49 # mail settings 50 mail.sender= #發送郵箱 51 mail.host= #發送郵箱smtp地址 52 job.failure.email= #任務失敗時發送郵件的地址 53 job.success.email= #任務成功時發送郵件的地址 54 55 lockdown.create.projects=false 56 57 cache.directory=cache #緩存目錄 58 59 ###### azkaban-users.xml 配置 60 [yun@mini01 conf]$ vim azkaban-users.xml 61 <azkaban-users> 62 <user username="azkaban" password="azkaban" roles="admin" groups="azkaban" /> 63 <user username="metrics" password="metrics" roles="metrics"/> 64 <user username="admin" password="admin" roles="admin,metrics" /> 65 66 <role name="admin" permissions="ADMIN" /> 67 <role name="metrics" permissions="METRICS"/> 68 </azkaban-users>
4.4.2. executor執行伺服器配置
1 [yun@mini01 conf]$ pwd 2 /app/azkaban/executor-2.5.0/conf 3 [yun@mini01 conf]$ vim azkaban.properties 4 #Azkaban 5 default.timezone.id=Asia/Shanghai 6 7 # Azkaban JobTypes Plugins 8 azkaban.jobtype.plugin.dir=plugins/jobtypes #jobtype 插件所在位置 9 10 #Loader for projects 11 executor.global.properties=conf/global.properties 12 azkaban.project.dir=projects 13 14 database.type=mysql 15 mysql.port=3306 16 mysql.host=mini03 17 mysql.database=azkaban 18 mysql.user=azkaban 19 mysql.password=azkaban 20 mysql.numconnections=100 #最大連接數 21 22 # Azkaban Executor settings 23 executor.maxThreads=50 #最大線程數 24 executor.port=12321 #埠號(如修改,請與web服務中一致) 25 executor.flow.threads=30 #線程數
4.5. 啟動azkaban
先執行executor,再執行web,避免Web Server會因為找不到執行器啟動失敗。
執行伺服器
1 [yun@mini01 executor-2.5.0]$ pwd 2 /app/azkaban/executor-2.5.0 3 [yun@mini01 executor-2.5.0]$ ./bin/azkaban-executor-start.sh 4 # 或者 nohup ./bin/azkaban-executor-start.sh > azkaban-exec_$(date +%Y%m%d%H%M%S).log & 5 # 方便查看日誌 6 ………………
web伺服器
1 [yun@mini01 web-server-2.5.0]$ pwd 2 /app/azkaban/web-server-2.5.0 3 [yun@mini01 web-server-2.5.0]$ ./bin/azkaban-web-start.sh # 日誌會自己記錄 4 ………………
查看java進程
1 [yun@mini01 executor-2.5.0]$ jps 2 4083 AzkabanWebServer 3 3988 AzkabanExecutorServer 4 4171 Jps
4.6. 瀏覽器訪問
1 https://mini01:8443/
使用admin登錄之後
5. Azkaban實戰
Azkaba內置的任務類型支持command、java
5.1. Command類型單一job示例
創建job描述文件
在Windows創建文件 command.job,內容如下
command.job
1 #command.job 2 type=command 3 # command=sh hello.sh 4 command=echo 'hello'
hello.sh
1 #!/bin/bash 2 echo 'hello World!' > /tmp/azkaban.info
將job資源文件打包成zip文件
zip command.job
創建project、上傳包並執行
1、通過azkaban的web管理平臺創建project並上傳job壓縮包
首先創建project
2、上傳zip包
3、啟動執行該job
5.2. Command類型多job工作流flow
1、創建有依賴關係的多個job描述
第一個job:foo.job
1 # foo.job 2 type=command 3 command=echo foo
第二個job:bar.job依賴foo.job
1 # bar.job 2 type=command 3 dependencies=foo 4 command=echo bar
2、將所有job資源文件打到一個zip包中
3、在azkaban的web管理界面創建工程並上傳zip包
4、啟動工作流flow
5.3. HDFS操作任務
1、創建job描述文件
fs_01.job
1 # fs.job 2 type=command 3 command=/app/hadoop/bin/hadoop fs -mkdir -p /azkaban/test03_new
fs_02.job
1 # fs.job 2 type=command 3 dependencies=fs_01 4 command=/app/hadoop/bin/hadoop fs -put /app/software/apache-flume-1.8.0-bin.tar.gz /azkaban/test03_new
2、將job資源文件打包成zip文件
3、通過azkaban的web管理平臺創建project並上傳job壓縮包
4、啟動執行該job
5.4. MAPREDUCE任務
Mr任務依然可以使用command的job類型來執行
1、創建job描述文件,及mr程式jar包(示例中直接使用hadoop自帶的example jar)
mrwc_01.job
1 # mrwc.job 2 type=command 3 command=/app/hadoop/bin/hadoop fs -mkdir -p /azkaban/wordcount/input
mrwc_02.job
1 # mrwc.job 2 type=command 3 dependencies=mrwc_01 4 command=/app/hadoop/bin/hadoop fs -put test.info zhang.info /azkaban/wordcount/input
mrwc_03.job
1 # mrwc.job 2 type=command 3 dependencies=mrwc_02 4 command=/app/hadoop/bin/hadoop jar hadoop-mapreduce-examples-2.7.6.jar wordcount /azkaban/wordcount/input /azkaban/wordcount/output
test.info
1 111 2 222 3 333 4 444 5 555 6 333 7 222 8 222 9 222
zhang.info
1 zxcvbnm 2 asdfghjkl 3