1.區(qū)分ETL任務(wù)計劃工具和任務(wù)流計劃工具
Kettle是ETL工具Extract-Transform-Load(ETL)的縮寫,即數(shù)據(jù)提取、轉(zhuǎn)換和裝載過程。
Kettle中文名字叫水壺。MATT是該項目的主要程序員,他希望將各種數(shù)據(jù)放入一個壺中,并以指定的格式泄露出去。
所以他的重點是數(shù)據(jù)。
Oozie將作業(yè)的執(zhí)行順序指定為放置在從屬于控制的直接加速圖形(DAG)中的一系列操作(例如,Hadoop中的映射/Reduce操作、Pig操作等)
Oozie工作流有數(shù)據(jù)流,但重心在工作流的定義中。
兩者都有相關(guān)的功能和數(shù)據(jù)流動,但實際用途不同。
2.ETL任務(wù)調(diào)度程序
2.1Sqoop調(diào)度工具
2.1.1列出所有數(shù)據(jù)庫
查看幫助
Bin/sqoop help列出了所有Linux上的數(shù)據(jù)庫
bin/sq OOP list-databases-connect JDBC : MySQL ://localhost :3306-username root-password
bin/sq OOP list-databases-connect JDBC : MySQL ://192 . 168 . 22 . 3633603306-username root
bin/sq OOP list-tables-connect HDFS : MySQL ://localhost :3306/MySQL-username root-;
(1)確認(rèn)MySQL服務(wù)已正確啟動
通過檢查查詢控制端口和查詢過程,您可以通過兩種方式確認(rèn)MySQL是否處于啟動狀態(tài)。
方法1:端口查詢
$ netstat -tulpnMySQL監(jiān)視的TCP的3306端口,如果顯示3306,則證明MySQL服務(wù)正在運行
方法2:查詢過程
可以查看Mysql進(jìn)程
未指定導(dǎo)入Ps -ef | grep mysqld數(shù)據(jù)的目錄。默認(rèn)值為/user/root/表名
Bin/sqoop import \
-connect JDBC : MySQL ://192 . 168 . 77 . 137/zhjy \
- password 123456 \
- username root \
-tablezf _ jygz _ thjc \
-m1 \
-fields-terminated-by' \ t '
或者是
Bin/sqoop import \
-connect JDBC : MySQL ://192 . 168 . 77 . 137/zhjy \
- password 123456 \
- username root \
-tablezf _ jygz _ thjc \
-M5 \
- split-by ZF_BH _ BH(通常在設(shè)置-m1時使用)
-fields-terminated-by' \ t '原因:
如果表具有主鍵,則可以將m值設(shè)置為大于1的值。如果沒有主鍵,則只能將m值設(shè)置為1?;蛘?,如果希望m值大于1,則必須使用- split-by指定字段
如果設(shè)置為-m 1,則只有一個maptask執(zhí)行數(shù)據(jù)輸入。默認(rèn)情況下,4個maptask執(zhí)行輸入操作,但必須指定列作為拆分標(biāo)準(zhǔn)
將數(shù)據(jù)導(dǎo)入指定目錄
將表數(shù)據(jù)導(dǎo)入到HDFS中時,可以使用Sqoop導(dǎo)入程序指定大象目錄。使用-target-dir參數(shù)指定導(dǎo)出目標(biāo),使用-delete-target-dir參數(shù)檢查導(dǎo)出目錄是否存在,如果存在,則將其刪除
Bin/sqoop import \
-connect JDBC : MySQL ://192 . 168 . 77 . 137/zhjy \
- username root \
- password 123456 \
- delete-target-dir \ -如果目錄存在,則刪除該目錄
-tablezf _ jygz _ thjc \
-target-dir/user/zhjy \-指定存儲目錄
-m1 \
-fields-terminated-by' \ t '獲取查詢
Bin/sqoop import \
-connect JDBC : MySQL ://192 . 168 . 72 . 13:3306/company \
- username root \
-passwordroot \
-target-dir/user/company \
-delete-target-dir \
-num-mappers1 \
-fields-terminated-by' \ t' \
- query 'select n
ame,sex from staff where id <=1 and $CONDITIONS;'提示:must contain '$CONDITIONS' in WHERE clause。
where id <=1 匹配條件
$CONDITIONS:傳遞作用。
如果 query 后使用的是雙引號,則 $CONDITIONS前必須加轉(zhuǎn)義符,防止 shell 識別為自己的變量。
--query時不能使用--table一起使用
需要指定--target-dir路徑
導(dǎo)入到hdfs指定目錄并指定要求
bin/sqoop import \
--connect jdbc:mysql://192.168.72.133:3306/company \
--username root \
--password root\
#提高數(shù)據(jù)庫到hadoop的傳輸速度
--direct
--table staff \
--delete-target-dir \
#導(dǎo)入指定列,涉及到多列,用逗號分隔
--column id,sex \
--target-dir /user/company \
--num-mappers 1 \
#指定分隔符
--fields-terminated-by '\t'
#指定導(dǎo)出存儲格式
--as-textfile
#指定數(shù)據(jù)壓縮(壓縮,解壓縮方式)
--compress
--compression-codec org.a
數(shù)據(jù)導(dǎo)出儲存方式(數(shù)據(jù)存儲文件格式---( textfil parquet)--as-textfileImports data as plain text (default)--as-parquetfile Imports data to Parquet Files)
導(dǎo)入表數(shù)據(jù)子集到HDFS
bin/sqoop import \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root \
--password root \
--table emp_add \
--target-dir /sqoop/emp_add \
-m 1 \
--delete-target-dir \
--where "city = 'sec-bad'"
sqoop導(dǎo)入BLOB數(shù)據(jù)到Hive
對于CLOB,如xml文本,sqoop可以遷移到Hive表,對應(yīng)字段存儲為字符類型。
對于BLOB,如jpg圖片,sqoop無法直接遷移到Hive表,只能先遷移到HDFS路徑,然后再使用Hive命令加載到Hive表。遷移到HDFS后BLOB字段存儲為16進(jìn)制形式。
bin/sqoop-import \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table ceshi \
--columns "id,name,photo" \
--split-by id \
-m 4 \
--inline-lob-limit=16777126 \設(shè)置內(nèi)聯(lián)的LOB對象的大小
--target-dir /user/hive/warehouse
2.1.3導(dǎo)入關(guān)系表到Hive
第一步:導(dǎo)入需要的jar包
將我們mysql表當(dāng)中的數(shù)據(jù)直接導(dǎo)入到hive表中的話,我們需要將hive的一個叫做的jar包拷貝到sqoop的lib目錄下
cp /export/servers/hive-1.1.0-cdh5.14.0/lib/ /export/server
第二步:開始導(dǎo)入
day=`date -d "yesterday" +%Y%m%d`
sqoop import \ --導(dǎo)入數(shù)據(jù)
--connect jdbc:mysql://10.2.111.87:3306/ehl_apmp \ --連接url
--username root \ --用戶名
--password root \ --密碼
--table zf_jygz_thjc \ --要導(dǎo)入的表
-m 1 \ --maptask
--hive-drop-import-delims \ --導(dǎo)入時刪除數(shù)據(jù)庫中特殊字符
--hive-overwrite \ --覆蓋導(dǎo)入
--hive-import \ --導(dǎo)入到hive表中
--hive-database ods \ --導(dǎo)入到hive中哪個數(shù)據(jù)庫
--hive-table ods_zf_jygz_thjc \ --導(dǎo)入到hive中哪個表
--fields-terminated-by '\t' \ --字段分隔符
--lines-terminated-by '\n' --指定行分隔符
--null-string '\\N' \ --字符串類型為null是代替字符
--null-non-string '\\N' \ --字非符串類型為null是的代替字符
--hive-partition-key day \ --hive表的分區(qū)字段
--hive-partition-value "$day" --指定導(dǎo)入表的分區(qū)值
導(dǎo)入關(guān)系表到hive并自動創(chuàng)建hive表
們也可以通過命令來將我們的mysql的表直接導(dǎo)入到hive表當(dāng)中去
sqoop import --connect jdbc:mysql://10.2.111.87:3306/ehl_apmp \
--username root --password root \
--table $1 \
--hive-import \
--hive-database ods \
--create-hive-table \
--fields-terminated-by '\t' \
--null-string '\\N' \
--null-non-string '\\N' \
--split-by code \
-m 4
通過這個命令,我們可以直接將我們mysql表當(dāng)中的數(shù)據(jù)以及表結(jié)構(gòu)一起倒入到hive當(dāng)中去
2.1.4增量導(dǎo)入
--incremental<mode> 增量模式。
Append id 是獲取一個某一列的某個值。
lastmodified “2016-12-15 15:47:35” 獲取某個時間后修改的所有數(shù)據(jù)
-append 附加模式
-merge-key id 合并模式
--check-column<column name> 用來指定一些列,可以去指定多個列;通常的是指定主鍵id
--last -value<last check column value> 從哪個值開始增量
==注意:增量導(dǎo)入的時候,一定不能加參數(shù)--delete-target-dir 否則會報錯==
第一種增量導(dǎo)入方式(不常用)
1.append方式
使用場景:有個訂單表,里面每個訂單有一個唯一標(biāo)識的自增列id,在關(guān)系型數(shù)據(jù)庫中以主鍵的形式存在。之前已經(jīng)將id在0-1000之間的編號的訂單導(dǎo)入到HDFS 中;如果在產(chǎn)生新的訂單,此時我們只需指定incremental參數(shù)為append,--last-value參數(shù)為1000即可,表示只從id大于1000后開始導(dǎo)入。
(1)創(chuàng)建一個MySQL表
CREATE TABLE orders(
o_id INT PRIMARY KEY AUTO_INCREMENT,
o_name VARCHAR(255),
o_price INT
);
INSERT INTO orders(o_id,o_name,o_price) VALUES(1,'聯(lián)想',5000);
INSERT INTO orders(o_id,o_name,o_price) VALUES(2,'海爾',3000);
INSERT INTO orders(o_id,o_name,o_price) VALUES(3,'雷神',5000);
INSERT INTO orders(o_id,o_name,o_price) VALUES(4,'JACK JONES',800);
INSERT INTO orders(o_id,o_name,o_price) VALUES(5,'真維斯',200);
(2)創(chuàng)建一個hive表(表結(jié)構(gòu)與mysql一致)
bin/sqoop import \
--connect jdbc:mysql://192.168.22.30:3306/userdb \
--username root \
--password root \
--table emp \
--target-dir /sqoop/increment \
--num-mappers 1 \
--incremental append \
--check-column id \
--last-value 1202
注意:
append 模式不支持寫入到hive表中
2.lastModify方式
此方式要求原有表有time字段,它能指定一個時間戳,讓sqoop把該時間戳之后的數(shù)據(jù)導(dǎo)入到HDFS;因為后續(xù)訂單可能狀體會變化,變化后time字段時間戳也會變化,此時sqoop依然會將相同狀態(tài)更改后的訂單導(dǎo)入HDFS,當(dāng)然我們可以只當(dāng)merge-key參數(shù)為order-id,表示將后續(xù)新的記錄和原有記錄合并。
# 將時間列大于等于閾值的數(shù)據(jù)增量導(dǎo)入HDFS
sqoop import \
--connect jdbc:mysql://192.168.xxx.xxx:3316/testdb \
--username root \
--password transwarp \
--query “select order_id, name from order_table where \$CONDITIONS” \
--target-dir /user/root/order_all \
--split-by id \
-m 4 \
--incremental lastmodified \
--merge-key order_id \
--check-column time \
# remember this date !!!
--last-value “2014-11-09 21:00:00”
使用 lastmodified 方式導(dǎo)入數(shù)據(jù),要指定增量數(shù)據(jù)是要 --append(追加)還是要 --merge-key(合并)last-value 指定的值是會包含于增量導(dǎo)入的數(shù)據(jù)中。
第二種增量導(dǎo)入方式(推薦)
==通過where條件選取數(shù)據(jù)更加精準(zhǔn)==
yesterday=`date -d "yesterday" +%Y_%m_%d`
where="update_time >= \"${yesterday}""
day=`date -d "yesterday" +%Y-%m-%d`
sqoop import \ --導(dǎo)入數(shù)據(jù)
--connect jdbc:mysql://10.2.111.87:3306/ehl_apmp \ --連接url
--username root \ --用戶名
--password root \ --密碼
--table zf_jygz_thjc \ --要導(dǎo)入的表
-m 1 \ --maptask
--hive-drop-import-delims \ --導(dǎo)入時刪除數(shù)據(jù)庫中特殊字符
--hive-overwrite \ --覆蓋導(dǎo)入
--hive-import \ --導(dǎo)入到hive表中
--hive-database ods \ --導(dǎo)入到hive中哪個數(shù)據(jù)庫
--hive-table ods_zf_jygz_thjc \ --導(dǎo)入到hive中哪個表
--fields-terminated-by '\t' \ --字段分隔符
--lines-terminated-by '\n' --指定行分隔符
--columns 'zf_bh,zf_xm' \ --導(dǎo)入的字段(可選)
--where "${where}" \ --條件導(dǎo)入
--null-string '\\N' \ --字符串類型為null是代替字符
--null-non-string '\\N' \ --字非符串類型為null是的代替字符
--hive-partition-key day \ --hive表的分區(qū)字段
--hive-partition-value "$day" --指定導(dǎo)入表的分區(qū)值
2.1.5從RDBMS到hbase
bin/sqoop import
--connect jdbc:mysql://192.168.22.30:3306/userdb \
--username root \
--password root \
--table emp \
--columns "id,name,sex" \
--column-family "info"
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_test" \
--split-by id \
--num-mappers 1
會報錯
原因: 只支持 HBa 之前的版本的自動創(chuàng)建 HBase 表的功能。
解決方案:手動創(chuàng)建 HBase 表
hbase> create 'hbase_staff','info'
2.1.6從HDFS到RDBMS
導(dǎo)出前,目標(biāo)表必須存在與目標(biāo)數(shù)據(jù)庫中
默認(rèn)操作是將文件中的數(shù)據(jù)使用insert語句插入到表中
數(shù)據(jù)是在HDFS當(dāng)中的如下目錄/sqoop/emp,數(shù)據(jù)內(nèi)容如下
1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1
1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0
1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
第一步:創(chuàng)建MySQL表
CREATE TABLE `emp_out` (
`id` INT(11) DEFAULT NULL,
`name` VARCHAR(100) DEFAULT NULL,
`deg` VARCHAR(100) DEFAULT NULL,
`salary` INT(11) DEFAULT NULL,
`dept` VARCHAR(10) DEFAULT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=utf8;
第二步:執(zhí)行導(dǎo)出命令
通過export來實現(xiàn)數(shù)據(jù)的導(dǎo)出,將hdfs的數(shù)據(jù)導(dǎo)出到mysql當(dāng)中去
全量導(dǎo)出
bin/sqoop export \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root \
--password admin \
--table emp_out \
--export-dir /sqoop/emp \
--columns id,name \(當(dāng)文件數(shù)據(jù)與表結(jié)構(gòu)一致時,可以不指定)
--input-fields-terminated-by ","
增量導(dǎo)出
bin/sqoop export \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table emp_out \
--update-key id \
--update-mode allowinsert \(新增的數(shù)據(jù)被導(dǎo)出)
--export-dir '/user/hive/warehouse/ods_ceshi/part-m-00000' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--input-fields-terminated-by ',' \
-m 1
更新導(dǎo)出
bin/sqoop export \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table emp_out \
--update-key id \
--update-mode updateonly \(只能導(dǎo)出修改后的數(shù)據(jù),不能導(dǎo)出新增的數(shù)據(jù))
--export-dir '/user/hive/warehouse/ods_ceshi/part-m-00000' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--input-fields-terminated-by ',' \
-m 1
總結(jié):
參數(shù)介紹
--update-key 后面也可以接多個關(guān)鍵字列名,可以使用逗號隔開,Sqoop將會匹配多個關(guān)鍵字后再執(zhí)行更新操作。
--export-dir 參數(shù)配合--table或者--call參數(shù)使用,指定了HDFS上需要將數(shù)據(jù)導(dǎo)入到MySQL中的文件集目錄。
--update-mode updateonly和allowinsert。 默認(rèn)模式為updateonly,如果指定--update-mode模式為allowinsert,可以將目標(biāo)數(shù)據(jù)庫中原來不存在的數(shù)據(jù)也導(dǎo)入到數(shù)據(jù)庫表中。即將存在的數(shù)據(jù)更新,不存在數(shù)據(jù)插入。
組合測試及說明
1、當(dāng)指定update-key,且關(guān)系型數(shù)據(jù)庫表存在主鍵時:
A、allowinsert模式時,為更新目標(biāo)數(shù)據(jù)庫表存的內(nèi)容,并且原來不存在的數(shù)據(jù)也導(dǎo)入到數(shù)據(jù)庫表;
B、updateonly模式時,為更新目標(biāo)數(shù)據(jù)庫表存的內(nèi)容,并且原來不存在的數(shù)據(jù)也不導(dǎo)入到數(shù)據(jù)庫表;
2、當(dāng)指定update-key,且關(guān)系型數(shù)據(jù)庫表不存在主鍵時:
A、allowinsert模式時,為全部數(shù)據(jù)追加導(dǎo)入到數(shù)據(jù)庫表;
B、updateonly模式時,為更新目標(biāo)數(shù)據(jù)庫表存的內(nèi)容,并且原來不存在的數(shù)據(jù)也不導(dǎo)入到數(shù)據(jù)庫表;
3、當(dāng)不指定update-key,且關(guān)系型數(shù)據(jù)庫表存在主鍵時:
A、allowinsert模式時,報主鍵沖突,數(shù)據(jù)無變化;
B、updateonly模式時,報主鍵沖突,數(shù)據(jù)無變化;
4、當(dāng)不指定update-key,且關(guān)系型數(shù)據(jù)庫表不存在主鍵時:
A、allowinsert模式時,為全部數(shù)據(jù)追加導(dǎo)入到數(shù)據(jù)庫表;
B、updateonly模式時,為全部數(shù)據(jù)追加導(dǎo)入到數(shù)據(jù)庫表;
實際案例:
(1)mysql批量導(dǎo)入hive
#!/bin/bash
source /etc/profile
num=0
list="table1 table2 table3"
for i in $list; do
echo "$sum"
echo "$i"
echo "sqoop開始批量導(dǎo)入......"
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --hive-table db.$i --delete-target-dir --hive-overwrite --hive-import &
num=$(expr $num + 1)
if [$sum -gt 4 ]; then
{
echo "等待批量任務(wù)完成"
wait
echo "開始下一批導(dǎo)入"
num = 0
}
fi
done
echo "等待最后一批任務(wù)完成"
wait
echo "全部導(dǎo)入完成"
使用shell腳本:
#!/bin/sh
export SQOOP_HOME=/usr/share
hostname="192.168.1.199"
user="root"
password="root"
database="test"
table="tags"
curr_max=0
function db_to_hive(){
${SQOOP_HOME}/bin/sqoop import
--connect jdbc:mysql://${hostname}/${database} \
--username ${user} \
--password ${password} \
--table ${table} \
--split-by docid \
--hive-import \
--hive-table lan.ding
--fields-terminated-by '\t' --incremental append --check-column docid --last-value ${curr_max}
result=`mysql -h${hostname} -u${user} -p${password} ${database}<<EOF
select max(docid) from ${table};
EOF`
curr_max=`echo $result |awk '{print $2}'`
}
if [ $# -eq 0 ];then
while true
do
db_to_hive
sleep 120
done
exit
fi
筆者目前用sqoop把mysql數(shù)據(jù)導(dǎo)入到Hive中,最后實現(xiàn)命令行導(dǎo)入,sqoop版本1.4.7,實現(xiàn)如下
sqoop job --import --connect jdbc:mysql://10.4.20.93:3303 \
--username user \
--password 123456 \
--query "select user_name ,user_id,identype from users where $CONDITIONS" \
--hive-import \
--hive-database haibian_odbc \
--hive-table users \
--split-by id \
--fields-terminated-by '\01' \
--lines-terminated-by '\n' \
--target-dir /user/hive/tmp/users \
--hive-delims-replacement ' ' --incremental append \
--check-column id \
--last-value 0
最后需要把這個導(dǎo)入搞成job,每天定時去跑,實現(xiàn)數(shù)據(jù)的自動化增量導(dǎo)入,sqoop支持job的管理,可以把導(dǎo)入創(chuàng)建成job重復(fù)去跑,并且它會在metastore中記錄增值,每次執(zhí)行增量導(dǎo)入之前去查詢
創(chuàng)建job命令如下
sqoop job --create users -- import --connect jdbc:mysql://10.4.20.93:3303 \--username user \--password 123456 \--query "select user_name ,user_id,identype from users where $CONDITIONS" \--hive-import \--hive-database haibian_odbc \--hive-table users \--split-by id \--fields-terminated-by '\01' \--lines-terminated-by '\n' \--target-dir /user/hive/tmp/users \--hive-delims-replacement ' ' --incremental append \--check-column id \--last-value 0
創(chuàng)建完job就可以去執(zhí)行它了
sqoop job --exec users
可以把該指令設(shè)為Linux定時任務(wù),或者用Azkaban定時去執(zhí)行它
shell腳本循環(huán)遍歷日期,用于sqoop腳本
#! /bin/bash
first="$1"
second="$2"
while [ "$first" != "$second" ]
do
date=`date -d "$first" +"%Y-%m-%d"`
sqoop export \
--connect jdbc:mysql:// \
--username \
--password \
--table dwd_fact_front_orderinfo \
--export-dir /user/hive/warehouse;$date" \
--input-null-non-string '\\N' \
--input-null-string '\\N' \
--input-fields-terminated-by "\t" \
--update-key id \
--update-mode allowinsert \
--m 1;
let first=`date -d "-1 days ago ${first}" +%Y%m%d`
done
Sqoop導(dǎo)出問題總結(jié)
hive導(dǎo)出到MySQL時,date類型數(shù)據(jù)發(fā)生變化?
問題原因:時區(qū)設(shè)置問題,date -R查看服務(wù)器時間,show VARIABLES LIKE "%time_zone"查看Mysql時間,system并不表示中國的標(biāo)準(zhǔn)時間,要將時間設(shè)置為東八區(qū)
set global time_zone = '+08:00';
set time_zone = '+08:00';
flush privileges;
2.2Kettle調(diào)度工具
3.任務(wù)流調(diào)度工具
3.1調(diào)度工具對比
(1):對市面上最流行的兩種調(diào)度器,給出以下詳細(xì)對比,以供技術(shù)選型參考??傮w來說,ooize相比azkaban是一個重量級的任務(wù)調(diào)度系統(tǒng),功能全面,但配置使用也更復(fù)雜。如果可以不在意某些功能的缺失,輕量級調(diào)度器azkaban是很不錯的候選對象。
(2):功能:
兩者均可以調(diào)度mapreduce,pig,java,腳本工作流任務(wù);
兩者均可以定時執(zhí)行工作流任務(wù);
(3):工作流定義:
Azkaban使用Properties文件定義工作流;
Oozie使用XML文件定義工作流;
(4):工作流傳參:
Azkaban支持直接傳參,例如${input};
Oozie支持參數(shù)和EL表達(dá)式,例如${fs:dirSize(myInputDir)};
(5):定時執(zhí)行:
Azkaban的定時執(zhí)行任務(wù)是基于時間的;
Oozie的定時執(zhí)行任務(wù)基于時間和輸入數(shù)據(jù);
(6):資源管理:
Azkaban有較嚴(yán)格的權(quán)限控制,如用戶對工作流進(jìn)行讀/寫/執(zhí)行等操作;
Oozie暫無嚴(yán)格的權(quán)限控制;
(7):工作流執(zhí)行:
Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一臺節(jié)點)和multi server mode(executor server和web server可以部署在不同節(jié)點);
Oozie作為工作流服務(wù)器運行,支持多用戶和多工作流;
(8):工作流管理:
Azkaban支持瀏覽器以及ajax方式操作工作流;
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流;
3.2 Azkaban調(diào)度工具
3.1.1啟動solo-server
cd /export/server
bin
3.1.2瀏覽器頁面訪問
瀏覽器頁面訪問
http://node03:8081/
3.3 Oozie調(diào)度工具
使用Oozie時通常整合hue,用戶數(shù)據(jù)倉庫調(diào)度
3.3.1數(shù)倉流程說明
大致流程:
MySQL -> HDFS -> ODS -> DWD -> DWS -> ADS -> MySQL
具體流程:
1. MySQL業(yè)務(wù)通過Sqoop數(shù)據(jù)導(dǎo)入HDFS
2. 將HDFS數(shù)據(jù)導(dǎo)入Hive數(shù)倉ODS層
3. 將ODS數(shù)據(jù)簡單清洗寫入DWD層
4. 將DWD數(shù)據(jù)輕度匯總寫入DWS層寬表
5. 將DWS層數(shù)據(jù)統(tǒng)計結(jié)果寫入ADS層
6. 將ADS層數(shù)據(jù)通過Sqoop導(dǎo)出到MySQL匯總表
3.3.2創(chuàng)建工作流
1. 創(chuàng)建工作流
2. 編輯工作流
3. 上傳腳本
4. 添加文件
就是剛才選擇的腳本
5. 填寫參數(shù)
腳本里需要的參數(shù),盡量設(shè)置為動態(tài)自動獲取,如 ${date}
第一步的參數(shù)是所有文件和當(dāng)天日期,后面的只需要日期,最后一步是導(dǎo)出所有結(jié)果,相應(yīng)填入
6. 依次添加后續(xù)任務(wù)
添加文件和設(shè)置相應(yīng)參數(shù)
7. 保存,或者運行
8. 狀態(tài)提示
運行后會有狀態(tài)提示頁面,可以看到任務(wù)進(jìn)度
9. 其他
點擊調(diào)度任務(wù)的頁面情況
定時調(diào)度
1. 創(chuàng)建定時計劃(schedule)
2. 修改屬性
修改定時任務(wù)名和描述
3. 添加任務(wù)
添加需要定時調(diào)度的任務(wù)
4. 設(shè)置調(diào)度時間
5. Crontab高級語法模式
6. 參數(shù)設(shè)置
sm-workflow的參數(shù)都是寫死的,沒有設(shè)置動態(tài),這里的下拉列表就不會有可選項。
設(shè)置參數(shù)
將sm-workflow的日期修改為 ${do_date},保存
進(jìn)入定時計劃sm-dw中,會看到有參數(shù) do_date
填入相應(yīng)參數(shù),前一天日期
${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, ‘DAY’), ‘yyyyMMdd’)}
Oozie常用系統(tǒng)常量
當(dāng)然,也可以通過這樣將參數(shù)傳入workflow任務(wù)中,代碼或者shell中需要的參數(shù)。
如,修改sm-workflow 中的 ,添加一個參數(shù) ${num}。
編輯文件(需要登陸Hue的用戶有對HDFS操作的權(quán)限),修改shell中的一個值為參數(shù),保存。
在workflow中,編輯添加參數(shù) ${num} ,或者num=${num} 保存。
進(jìn)入schedule中,可以看到添加的參數(shù),編輯輸入相應(yīng)參數(shù)即可。
Bundle
Bundle統(tǒng)一管理所有定時調(diào)度,階段劃分:Bundle > Schedule > workflow
1.《【solo命令】計劃工具(ETL任務(wù)流)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【solo命令】計劃工具(ETL任務(wù)流)》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/2505425.html