在HUE中繪製WorkFlow並配置schedule定期執行工作流

在前幾篇博客我已將繪製WorkFlow的工作事件都已經設計好了。這裏總結一下如何將這些事件一起組成一個WorkFlow工作流,並且會講一些繪製工作流的注意事項。

首先要注意我們添加的任何一箇中間的事件這裏有兩種情況,分別是 DOCUMENTS ACTIONS :

DOCUMENTS

ACTIONS

也很好理解,DOCUMENTS中添加的事件都是之前我們在Oozie中已經編輯好的那些文件,而ACTIONS添加的則需要我們在這裏自己寫清指令。

1、開始繪製任務要求的WorkFlow

介紹一下這個WorkFlow的具體工作內容,要解決每小時從MySQL產生的數據增量更新到Hive中,並且更新數據後在hive中將幾個表進行數據的彙總與整理,篩除掉各自表中不需要的數據。最後將這個彙總好的表 'trace' 導出到MySQL中,實現按照小時實時更新。

A.通過ACTIONS中的sqoop添加import表事件:

sqoop導入指令:

sqoop import  --connect "jdbc:mysql://192.168.102.18:3306/school?useUnicode=true&characterEncoding=utf-8" --username root --password P@ssw0rd4321 --driver com.mysql.jdbc.Driver --query 'select * from snap_match where alarmTime>date_sub(date_format(now(), "%Y-%m-%d %H"), interval 1 hour) and alarmTime<date_format(now(), "%Y-%m-%d %H") and $CONDITIONS' --target-dir /user/activemq_topic/snap_match/$date_today/$hour --fields-terminated-by '\t' --lines-terminated-by '\n' --null-string '\\N' --null-non-string '\\N' --m 1;

這個直接按住拖動到特定的矩形框就可以了。並且並行執行3個sqoop導入事件。爲什麼這裏不能使用DOCUMENTS中是sqoop事件我在這篇博客中介紹過:         使用hue中的sqoop導入數據被killed

B.在各自的sqoop導入事件後配置DOCUMENTS的Hive加載事件:

hive的load指令:

load data inpath "/user/activemq_topic/snap_match/${date_today}/${hour}" overwrite into table activemq_topic.snap_match_copy partition (datet='${date_today}',hours='${hour}')

之前就寫在文件中:

C.數據導入並加載後再進行數據的彙總與導出

其中hive的彙總數據如下:

insert overwrite table activemq_topic.trace_copy partition(datet='${date_today}',hours='${hour}') 
SELECT h.credentialsNum num,h.humanName xm,type,indexCode,alarmTime,SUBSTR(s.alarmTime,0,10) as date,SUBSTR(s.alarmTime,11,3) as timeHour,s.bkgpicurl as detail,'抓拍機' as fromType
FROM activemq_topic.snap_match_copy s LEFT JOIN activemq_topic.humans h ON s.humanId = h.humanId
WHERE `datet`='${date_today}' AND `hours`='${hour}' 
union all
SELECT XXX ....................
union all
SELECT XXX ....................
union all
SELECT XXX ....................;

sqoop導出指令:

sqoop export  --connect "jdbc:mysql://192.168.102.18:3306/school?useUnicode=true&characterEncoding=utf-8" --username root --password P@ssw0rd4321 --table trace --fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N' --export-dir /user/hive/warehouse/activemq_topic.db/trace_copy/datet=${date_today}/hours=${hour};

這樣就繪製好我所需的WorkFlow。

2、配置schedule定期執行WorkFlow

A.首先創建一個schedule

B.選擇我們要定期執行的WorkFlow

這裏我之前繪製的是Trace_As_Hour_Workflow這個工作流。

C.選擇執行的時間,記得調整時區

注意:這裏一定記得要調整時區,好像默認的是洛杉磯的當地時間。如果不修改到Shanghai則會發現調用的時間總是會推遲幾小時。

D.設定傳入的參數

這個參數會自動從配置的Workflow中獲取,之前繪製的時候各個事件添加的參數這裏給他賦值即可。

我這裏只需要傳入一個當前日期的 date_today,格式  'yyyy-MM-dd' 與上一小時數的 hour,格式  'HH'。

date_today參數:(當天日期)

${coord:formatTime(coord:nominalTime(), 'yyyy-MM-dd')}

hour參數:(上一小時數)

${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'HOUR'), 'HH')}

拓展:這個參數怎麼來的可以參考oozie常見系統常量:

常量表示形式

含義說明

${coord:minutes(int n)}

返回日期時間:從一開始,週期執行n分鐘

${coord:hours(int n)}

返回日期時間:從一開始,週期執行n * 60分鐘

${coord:days(int n)}

返回日期時間:從一開始,週期執行n * 24 * 60分鐘

${coord:months(int n)}

返回日期時間:從一開始,週期執行n * M * 24 * 60分鐘(M表示一個月的天數)

${coord:endOfDays(int n)}

返回日期時間:從當天的最晚時間(即下一天)開始,週期執行n * 24 * 60分鐘

${coord:endOfMonths(1)}

返回日期時間:從當月的最晚時間開始(即下個月初),週期執行n * 24 * 60分鐘

${coord:current(int n)}

返回日期時間:從一個Coordinator動作(Action)創建時開始計算,第n個dataset實例執行時間

${coord:dataIn(String name)}

在輸入事件(input-events)中,解析dataset實例包含的所有的URI

${coord:dataOut(String name)}

在輸出事件(output-events)中,解析dataset實例包含的所有的URI

${coord:offset(int n, String timeUnit)}

表示時間偏移,如果一個Coordinator動作創建時間爲T,n爲正數表示向時刻T之後偏移,n爲負數向向時刻T之前偏移,timeUnit表示時間單位(選項有MINUTE、HOUR、DAY、MONTH、YEAR)

${coord:hoursInDay(int n)}

指定的第n天的小時數,n>0表示向後數第n天的小時數,n=0表示當天小時數,n<0表示向前數第n天的小時數

${coord:daysInMonth(int n)}

指定的第n個月的天數,n>0表示向後數第n個月的天數,n=0表示當月的天數,n<0表示向前數第n個月的天數

${coord:tzOffset()}

ataset對應的時區與Coordinator Job的時區所差的分鐘數

${coord:latest(int n)}

最近以來,當前可以用的第n個dataset實例

${coord:future(int n, int limit)}

當前時間之後的dataset實例,n>=0,當n=0時表示立即可用的dataset實例,limit表示dataset實例的個數

${coord:nominalTime()}

nominal時間等於Coordinator Job啓動時間,加上多個Coordinator Job的頻率所得到的日期時間。

${coord:actualTime()}

Coordinator動作的實際創建時間。例如:start=”2011-05-01T24:00Z”,end=”2011-12-31T24:00Z”,frequency=”${coord:days(1)}”,則實際時間爲:2011-05-01,2011-05-02,2011-05-03,…,2011-12-31

${coord:user()}

啓動當前Coordinator Job的用戶名稱

${coord:dateOffset(String baseDate, int instance, String timeUnit)}

計算新的日期時間的公式:newDate = baseDate + instance * timeUnit,如:baseDate=’2009-01-01T00:00Z’,instance=’2′,timeUnit=’MONTH’,則計算得到的新的日期時間爲’2009-03-01T00:00Z’。

${coord:formatTime(String timeStamp, String format)}

格式化時間字符串,format指定

3、執行測試

我們將schedule啓動後過段時間可以在這裏看到運行的情況,都是成功的:

MySQL數據庫中的trace的表也會按照小時增量更新:

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