Azkaban 安裝請參考博客:
https://blog.csdn.net/hg_harvey/article/details/80342396
登錄Azkaban,首頁有四個菜單
projects:最重要的部分,創建一個工程,所有flows將在工程中運行。
Scheduling:顯示定時任務
Executing:顯示當前運行的任務
History:顯示歷史運行任務
主要介紹Projects部分,在創建工程前,我們先了解下之間的關係,一個工程包含一個或多個flows,一個flow包含多個job。job是你想在azkaban中運行的一個進程,可以是簡單的linux命令,可是java程序,也可以是複雜的shell腳本、或者python腳本,當然,如果你安裝相關插件,也可以運行插件。一個job可以依賴於另一個job,這種多個job和它們的依賴組成的圖表叫做flow。
web-server:節點負責項目作業管理(上傳和分發)
exec-server:負責具體執行的executor會解析job文件
一、commond 類型單一Job
1.創建工程
創建完成後跳轉到如下頁面
Flows:工作流程,有多個job組成
Permissions:權限管理
Project Logs:工程日誌
2.創建Job
job就是一個以.job結尾的文本文件,例如創建一個job,名爲hello.job,用於打印hello azkaban
# hello.job
type = command
command = echo 'hello azkaban'
3.打包
將創建的job打包成.zip壓縮文件,注意只能是.zip格式
4.使用Azkaban UI 界面創建project並上傳壓縮包
點擊Execute執行
然後點擊Continue
執行後,點擊Detail,查看日誌
可以看到打印出來hello azkaban
二、commond 類型多JOb 工作流 flow
1.創建項目
首先,創建一個項目,名爲 command_multiple_job
2.job 創建
假設有這麼一種場景:
(1).task1 依賴 task2
(2).task2 依賴 task3
(3).task3 依賴 task4
說明:假設task1是一個計算指標任務,task2 給 task1 提供執行需要的基礎數據
task3 給 task2 提供數據,以此類推。
3.flow 創建
多個jobs和它們的依賴組成flow。怎麼創建依賴,只要指定dependencies參數就行了
定義4個job:
(1).run_task1.job:計算業務指標數據
(2).run_task2.job:計算task1所需要的數據
(3).run_task3.job:計算task2所需要的數據
(4).run_task4.job:從 slaves 中抽取源數據
依賴關係:
task1 依賴 task2,task2 依賴 task3,task3 依賴 task4
4個job文件內容如下(這裏以執行python爲例,這個比較popular哈)
# run_task1.job
type = command
command = python /home/hadoop/pyshell/run_task1.py
dependencies = run_task2
# run_task2.job
type = command
command = python /home/hadoop/pyshell/run_task2.py
dependencies = run_task3
# run_task3.job
type = command
command = python /home/hadoop/pyshell/run_task3.py
dependencies = run_task4
# run_task4.job
type = command
command = python /home/hadoop/pyshell/run_task4.py
創建python腳本
[hadoop@harvey pyshell]$ touch run_task1.py
[hadoop@harvey pyshell]$ touch run_task2.py
[hadoop@harvey pyshell]$ touch run_task3.py
[hadoop@harvey pyshell]$ touch run_task4.py
4個文件內容如下,筆者只寫了一句打印,這裏根據公司你的業務寫代碼即可。
run_task1.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
print("task1:計算業務指標數據...")
run_task2.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
print("task2:計算基礎數據,爲task1提供數據")
run_task3.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
print("task3:數據清洗,爲task2提供數據")
run_task4.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
print("task4:從Slaves中抽取源數據")
3.將上述 job 打成zip包,上傳至 azkaban
上傳完成後,點擊右側Execute Flow按鈕,查看流程視圖
Flow view:流程視圖。可以禁用,啓用某些job
Notification:定義任務成功或者失敗是否發送郵件
Failure Options:定義一個job失敗,剩下的job怎麼執行
Concurrent:並行任務執行設置
Flow Parametters:參數設置。
4.執行
(1).執行一次,點擊右下角Execute
(2).定時執行,點擊左下角Schedule
設置完成後,執行右下角schedule,即完成調度配置,azkaban這裏的配置與linux下的crontab類似
想要查看job的調度列表,切換到Schedule菜單即可
5.查看項目flow中各個Job的執行情況
綠色代表成功,藍色是運行,紅色是失敗。可以查看job運行時間,依賴和日誌,點擊details可以查看各個job運行情況
run_task4.job
run_task3.job
run_task2.job
run_task1.job
三、MapReduce 任務
Azkaban 執行 MapReduce 任務,我們以 WordCount 爲例
1.準備數據
$ hadoop fs -mkdir -p /azkaban/input /azkaban/output
$ hadoop fs -put data/words.txt /azkaban/input
words.txt文件內容
Welcomt to azkaban
Hello Hadoop
Hello Hive
Hello HBase
Hello Azkaban
使用hadoop提供的jar統計單詞數量
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar wordcount /azkaban/input/* /azkaban/output
運行結果
2.創建項目
3.job創建
job
# mapreduce_wordcount.job
type = command
command=sh /home/hadoop/shell/wordcount.sh
wordcount.sh
#!/bin/bash
# author:harvey
# fileName:wordcount.sh
input=/azkaban/input/*
output=/azkaban/output
hadoop fs -test -e $output
if [ $? -eq 0 ] ;then
printf "%s is exists!\n" $output
hadoop fs -rm -r $output
fi
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar wordcount $input $output
4.打包上傳,執行
5.查看運行結果
azkaban上打印的日誌顯示已經成功
查看運行結果
四、Hive 腳本任務
1.創建項目
2.job創建
我們要完成,hive中創建表,加載數據,然後導出數據到mysql,分爲兩個job
run_task1:將hive中的數據導出到mysql中
run_task2:hive中創建表,加載數據
依賴關係:run_task1 依賴 run_task2
3.flow創建
job 文件內容如下
# run_task1.job
type = command
command = sh /home/hadoop/shell/run_task1.sh
dependencies = run_task2
# run_task2.job
type = command
command = sh /home/hadoop/shell/run_task2.sh
腳本內容如下
#!/bin/bash
# author:harvey
# fileName:run_task1.sh
#!/bin/bash
# author:harvey
# fileName:run_task1.sh
/home/hadoop/software/sqoop1/bin/sqoop export \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root --password P@ssw0rd \
--table emp \
--export-dir /user/hive/warehouse/test.db/emp \
--input-fields-terminated-by '\t' \
--input-null-string '\\N' --input-null-non-string '\\N' \
-m 1
#!/bin/bash
# author:harvey
# fileName:run_task2.sh
hive -f /home/hadoop/sql/test.sql
sql文件 test.sql內容如下
create database if not exists test;
use test;
drop table if exists emp;
create table emp(
empno int,
ename string,
job string
)
row format delimited fields terminated by '\t';
load data local inpath '/home/hadoop/data/emp.txt' overwrite into table emp;
emp.txt文件內容如下
1001 Tom Java
1002 Jack PHP
1003 Harvey BigData
1004 David IOS
1005 Ketty DBA
說明:腳本run_task1.sh中爲什麼使用全路徑的原因是筆者使用sqoop運行後,azkaban報找不到sqoop命令(已經配置了環境變量),具體什麼原因筆者也不清楚,如果你知道,記錄留言一下。使用全路徑後就不會命令找不到了。
4.打包上傳
5.執行,查看運行結果
執行前記得先在mysql中創建表emp,sql語句如下
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`empno` int(11) DEFAULT NULL,
`ename` varchar(255) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;
然後Continue執行
執行完成後hive查看錶emp是否存在mysql中查看錶emp是否有數據