用海豚排程器定時排程從Kafka到HDFS的kettle任務指令碼

海豚调度發表於2024-04-17

在實際專案中,從Kafka到HDFS的資料是每天自動生成一個檔案,按日期區分。而且Kafka在不斷生產資料,因此看看kettle是不是需要時刻執行?能不能按照每日自動生成資料檔案?

為了測試實際專案中的海豚定時排程從Kafka到HDFS的Kettle任務情況,特地提前跑一下海豚定時排程這個任務,看看到底什麼情況,也給大家提供一個參考!

海豚排程任務配置

(一)SHELL指令碼配置

!/bin/bash

source /etc/profile

/opt/install/kettle9.2/data-integration/pan.sh -rep=hurys_linux_kettle_repository -user=admin -pass=admin -dir=/kafka_to_hdfs/ -trans=04_Kafka_to_HDFS_turnratio level=Basic >>/home/log/kettle/04_Kafka_to_HDFS_turnratio_`date +%Y%m%d`.log

file

(二)定時任務設定

定時任務設定為每天的零點,零點一到開始執行任務

file

(三)最後工作流情況

file

啟動工作流

file

工作流啟動,成功!工作流一直在跑
file

相應的任務例項也在跑!

啟動工作流每天HDFS情況

(一)第一天為2023/8/30日

由於第一天開始執行任務,因此自動生成2023/08/30的HDFS檔案

(二)第二天為2023/8/31日

2023/08/31早上更新

(1)04_Kafka_to_HDFS_turnratio任務

file
第二天的海豚任務自動排程,自動生成2023/08/31的HDFS檔案

但問題是,除了再跑31日的任務外,30日的任務還在跑,可能是定時配置有問題,需要最佳化

而且這樣搞容易把kettle搞出問題!

file

2023/08/31晚上更新

(1)04_Kafka_to_HDFS_turnratio任務

不設定定時任務,kettle任務一直執行,已經生成8月31日的檔案,觀察明天會不會自動生成9月1日的資料檔案

file

已生成的8月31日檔案

file

(2)01_Kafka_to_HDFS_queue任務

不設定定時任務,kettle任務一直執行,已經生成8月31日的檔案,觀察明天會不會自動生成9月1日的資料檔案

file

已生成的8月31日檔案

如果明早不能自動生成9月1日的檔案,那就要設定海豚定時為每天的執行時間為0時0分0秒到23時59分59秒 或者在指令碼里設定時間 或者在kettle裡設定時間?我們試試看!

(三)第三天為2023/9/1日

2023/09/01早上更新

昨晚海豚排程的兩個kettle任務以失敗告終,沒有自動生成9月1日的資料檔案
file
今日再嘗試其他的方式

2023/09/01下午更新

下午嘗試用Crontab定時任務排程Kettle指令碼

\[root@hurys22 kettle\_job\_sh\]# crontab -l  
SHELL=/bin/bash

\#  */1 * * * * /bin/sh  /opt/install/kettle9.2/kettle\_job\_sh/test2.sh

06-07 17 * * * /bin/sh  /opt/install/kettle9.2/kettle\_job\_sh/01\_Kafka\_to\_HDFS\_queue.sh  

設定每天的17點的6分到7分中執行

file

但是日誌檔案顯示kettle任務卻一直再跑

file

當然,HDFS中確實生成了9月1日今日的檔案,而且任務執行時間是我設定的17點7分

file

這個方法不行,後面再試試其他方法?怎麼就不會設定任務停止呢

(四)第四天為2023/9/4日

2023/09/04早上更新

由於Kafka裡有時間戳欄位,因此在kettle任務裡獲取當前系統時間戳的日期欄位、然後檔名直接從這個日期欄位獲取

(1)當前系統時間戳的日期欄位

file

(2)HDFS輸出中檔名直接獲取這個日期欄位,這樣kettle任務執行時,是不是能自動生成每天的資料檔案?

file

(3)測試結果,任務可以跑通,但是HDFS生成的檔案不知卻在哪?

file

終於查到了,原來這樣匯出的檔案不在HDFS,而在kettle的安裝檔案裡,即在本地

file
而且這麼直接以日期命名也有問題,因為有多個Kafka,不可能僅僅以日期命名區分

2、2023/09/04晚上更新

因為上午的思路有問題,匯出的檔案沒有在HDFS中,反而在本地,於是下午又換了種思路。
file

還是從系統獲得時間day,但是檔案路徑直接寫成HDFS的檔案路徑+day,這樣的url欄位才是HDFS輸出控制元件中的檔名欄位

file

(1)用海豚排程對比,定時排程01_Kafka_to_HDFS_queue任務

file

目前已生成生成9月4日的檔案

file

(2)用海豚排程對比,不加定時排程04_Kafka_to_HDFS_turnratio任務
file目前已生成生成9月4日的檔案

file

(五)第五天為2023/9/5日

2023/09/05早上更新

雖然自動生成了9月5日的檔案,但是由於資料量過大、加上把hadoop.tmp.dir放在了/opt/soft/hadoop313/hadooptmp,導致opt資料夾磁碟溢位,使得namenode處於安全模式。

花了一上午時間終於解決NameNode的安全模式問題,發現應該把HADOOP 執行時儲存路徑放在home目錄下,因為home的磁碟空間最大

file

2023/09/05晚上更新

驚喜!!!

可能已經找到了解決方法,直接對Kafka裡的時間戳欄位進行擷取,然後拼接檔案路徑,從而形成一個可以根據時間戳欄位的日期變動的HDFS檔案,即每天自動生成一個資料檔案

(1)透過Java自定義檔名 欄位url(HDFS路徑+擷取的可變的時間戳欄位)

var url="hdfs://root:***@hurys22:8020/rtp/queue\_dynamic/queue\_dynamic"+substr(create_time,0,10)

file

(2)在HDFS輸出控制元件的檔案就選擇url欄位

file(3)結果

已經生成了9月5日的資料檔案,不需要海豚定時排程,只需要海豚一直跑kettle任務即可!

雖然還是生成了9月5日的資料檔案,不過我今天下午按照生成每小時維度的資料檔案測試過

file

下午16時執行任務,生成了16時的資料檔案,然後到17時,又生成了17時的資料檔案,這兩個資料檔案都在跑,而且HDFS裡大小顯示都為0。

不過區別是,16時的資料是完整的,17時的資料檔案是不斷增加的。因為Kafka是實時的,17時只會傳送17時的資料,不會傳送16時資料。下面是16時的檔案資料

file

16時的資料檔案是有固定的資料,17點後就沒有再寫入資料。之所以看不到這個這個block的大小,是因為寫入資料的規模太小了,等到這個寫入的資料規模達到128MB,即一個塊大小後才會看到這個block的資料。

file

所以只要一直執行這個kettle任務、不斷寫入資料即可,只要寫入的資料規模達到128MB,第一個block就會被看到。

已用海豚排程一個kettle任務,沒有定時,就一直跑。目前HDFS已生成了9月5日的資料檔案,明天就可以觀察幾點

1、有沒有自動生成明天9月6日的資料檔案

2、今天9月5日的資料檔案裡面的資料是不是固定的、完整的,晚上12點之後不再寫入

3、等到寫入資料規模達到128MB看第一個block的資料大小可不可看到?

明天9月6日除了看這幾點外,還用flume去做Kafka到HDFS的採集工作,以防萬一,這兩天被這個問題搞得頭疼,kettle真是一個易入門難精通的工具!

(六)第六天為2023/9/6日

2023/09/06早上更新

由於昨晚Kafka突然有問題,導致kettle沒能匯入資料到HDFS的檔案,今早已重新啟動Kafka服務

file

(1)目前已重新啟動海豚排程的kettle服務

file

(2)目前已自動生成9月6日的資料檔案

file

(3)只能明天9月7日看一下昨晚的3個問題

1、有沒有自動生成明天9月7日的資料檔案

2、今天9月6日的資料檔案裡面的資料是不是固定的、完整的,晚上12點之後不再寫入

3、等到寫入資料規模達到128MB看第一個block的資料大小可不可看到?

2023/09/06下午更新

(1)為了以防萬一,加了個對比測試。看看如果一天的資料放不滿一個block或者部分多餘資料放不滿一個block,可不可以正常顯示?即使它總的寫入資料量大於128MB

不僅多加了幾臺模擬裝置推送資料,還對動態排隊資料和靜態排隊資料兩個kettle任務進行對比

(2)動態排隊資料有自動日期分割槽,可以自動分成不同日期的檔案,就是昨晚跑的kettle任務

file

(3)而靜態排隊資料沒有日期分割槽,就往第一個日期檔案裡寫入資料

目前靜態排隊資料也已經生成了9月6日的資料檔案,後面會一直寫入這個檔案

file
明早對比這兩個kettle任務的資料檔案看看情況

(七)第七天為2023/9/7日

2023/09/07早上更新

A、HDFS檔案有日期分割槽的動態排隊資料kettle任務狀況

(1)首先是自動生成9月7日的檔案

file
(2)然後是6日的資料檔案固定,沒有7日的資料

file

(3)6日的資料這一塊由於只有62.8MB,因此HDFS的塊沒有顯示大小

file

B、HDFS檔案沒有日期分割槽的靜態排隊資料kettle任務狀況

由於寫入的HDFS檔案沒有日期分割槽,而且資料量寫入超過了128MB,所以這一塊的資料雖然在不斷寫入,但是這一塊的檔案顯示大小為128MB

file
疑問:現在任務依然執行,我想看看這個塊已經有128MB後,會不會在其他block寫入資料?

2023/09/07晚上更新

A、HDFS檔案有日期分割槽的動態排隊資料kettle任務狀況

(1)今日9月7日寫入的資料量超過128MB,因此HDFS已顯示檔案大小

file

總結一下:用kettle採集Kafka資料寫入HDFS這條路是可行的,只要設定變動的檔名、生成每日的資料檔案,然後一直跑任務就好!!!

本文由 白鯨開源 提供釋出支援!

相關文章