如何理解Flume hdfs sink的roll和round

roll相關

roll相關的字段作用對象是文件

字段 默認值 說明
rollInterval 30 每隔30秒截斷一個文件。設置爲0表示不會因爲時間間隔截斷文件
rollSize 1024 文件字節數超過1024截斷一個文件。設置爲0就不因爲文件大小截斷文件
rollCount 10 每10個event截斷一個文件。設置爲0就不因爲event數量截斷文件

別的都好理解。就一個event的需要說一下。

什麼是event?

event的官方解釋是agent最小的傳輸單位。

舉個例子

以tail -f (採集文件變化信息)一個文件爲例子
我們像被採集文件裏追加(新增)三條數據就算三個event

round相關

round相關的字段作用對象是時間戳

時間戳格式

字段 默認值 說明
round false 時間戳需不需要四捨五入(不影響%t)
roundValue 1 時間戳四捨五入的倍數,要小於當前時間
roundUnit second 時間戳四捨五入的單位

光看翻譯就覺得很難以理解。

舉個例子

# 追加數據腳本。每秒向f_log內追加一條數據,這樣會跑15分鐘
for((i=0;i<900;i++));
do
echo "test data:"$i >> f_log
sleep 1
done
rm -rf f_log
touch f_log
a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.type = exec
a1.sources.r1.command = tail -f /home/zzy/f_log

a1.sinks.k1.type = hdfs
# 這裏我們分別根據分鐘和秒數來創建文件夾。
a1.sinks.k1.hdfs.path = /flume/events/%M/%S
a1.sinks.k1.hdfs.filePrefix = flume_events-
# 每100行生成一個文件
# 這裏我們1秒一條數據1分鐘一個文件夾。所有估算一下一個文件最多寫60條數據到不了100
a1.sinks.k1.hdfs.rollCount = 100
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 0
a1.sinks.k1.hdfs.fileTyep = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
# 下面再解釋這些
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 1
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.useLocalTimeStamp=true


a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000


a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

如果不管round相關的設置。我們根據設置應該是每分鐘一個文件夾,每個分鐘文件夾裏面以秒再分割成60個文件夾,每個文件夾裏面存着每秒採集來的數據(理想狀態)。

但是加上round相關,實際就會是這樣的:

我們先來翻譯一下這個

a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 1
a1.sinks.k1.hdfs.roundUnit = minute

我們打算對時間戳根據分鐘以每1分鐘爲單位進行四捨五入。

到達的效果:假設我們job開始的時間是11點49分24秒,根據分鐘四捨五入是11點49分00秒

在這裏插入圖片描述

flume裏重命名就代表關閉文件(因爲.tmp的臨時文件叫打開的文件–正在被寫,更名完—去掉.tmp就不會再寫了)

在這裏插入圖片描述

確實生成了很多以分鐘開頭的目錄。再查看一下數據

[zzy@hadoop001 ~]$hdfs dfs -text /flume/events/minute=05/secont=00/flume_events-.1569009901514

1569009901600	test data:120
1569009901600	test data:121
。
。中間省略
。
1569009958532	test data:178
1569009958532	test data:179

120-179 60條記錄。確實是近1分鐘的數據都在寫這個文件了。

再舉個例子

如果我們把round相關改成

a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute

猜想一下還是那份數據。

  1. 只會生成兩個分鐘文件夾(每10分鐘一個文件夾,15分鐘的追加就兩個文件夾)
  2. 每個分鐘文件夾下面有一個秒鐘文件夾
  3. 每個秒鐘文件夾下面有多個文件。每個文件100行數據(理想狀態)

測試結果

在這裏插入圖片描述

[zzy@hadoop001 ~]$hdfs dfs -text /flume/events/minute=40/secont=00/flume_events-.1569012152239

1569012352990	test data:200
1569012352992	test data:201
.
. 中間太多省略了。確實是100條
.
1569012452025	test data:298
1569012452025	test data:299
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章