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
猜想一下還是那份數據。
- 只會生成兩個分鐘文件夾(每10分鐘一個文件夾,15分鐘的追加就兩個文件夾)
- 每個分鐘文件夾下面有一個秒鐘文件夾
- 每個秒鐘文件夾下面有多個文件。每個文件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