一、概述
- Flume是一個分布式、可靠拢操、和高可用的海量日志采集鸭丛、聚合和傳輸?shù)南到y(tǒng),通常用來做日志的采集揭斧。
- Flume的數(shù)據(jù)源非常豐富,可以采集文件,socket數(shù)據(jù)包等各種形式源數(shù)據(jù)屹蚊,又可以將采集到的數(shù)據(jù)輸出到HDFS厕氨、hbase、hive汹粤、kafka等眾多外部存儲系統(tǒng)中命斧;
- Flume針對特殊場景也具備良好的自定義擴展能力,因此嘱兼,flume可以適用于大部分的日常數(shù)據(jù)采集場景国葬;
數(shù)據(jù)流程處理
二、原理
單個agent采集數(shù)據(jù)
多級agent之間串聯(lián)
三芹壕、安裝配置
啟動 Flume
bin/flume-ng agent -n agent -c ./conf -f conf/flume-conf.properties -Dflume.root.logger=DEBUG,console
編寫啟動腳本并指定日志輸出
nohup /usr/libra/flume/bin/flume-ng agent -n agent -c /usr/libra/flume/conf -f /usr/libra/flume/conf/kafka-flume-hdfs.properties -Dflume.root.logger=INFO,console >/usr/libra/flume/logs/flume.log 2>&1 &vi
cdh 版本下載
flume-ng-1.5.0-cdh5.3.6.tar.gz
在下面的網(wǎng)站中找到對應版本得到字符串填入上述鏈接中即可下載對應的版本
http://archive.cloudera.com/cdh5/cdh/5/
四汇四、攔截器
-
Timestamp Interceptor
:在event的header中添加一個key叫:timestamp:value
為當前的時間戳。這個攔截器在sink為hdfs 時很有用踢涌,后面會舉例說到 -
Host Interceptor
:在event的header中添加一個key叫:host:value
為當前機器的hostname或者ip通孽。 -
Static Interceptor
:可以在event的header中添加自定義的key:value
。 -
Regex Filtering Interceptor
:通過正則來清洗或包含匹配的events睁壁。 -
Regex Extractor Interceptor
:通過正則表達式來在header中添加指定的key:value
則為正則匹配的部分 - 自定義攔截器
五利虫、Channel Selectors
-
Replicating Channel Selector
(default): Replicating 會將source過來的events發(fā)往所有channel -
Multiplexing Channel Selector
: 這兩種selector的區(qū)別是: ,而Multiplexing 可以選擇該發(fā)往哪些channel
六、特殊需求
- 前一段時間上線除了個事故堡僻,問題在于 flume 寫入 HDFS 的時候產(chǎn)生大量的小文件糠惫,基本上2 個 json 就會生成一個文件,看文件的時候驚訝道我了钉疫,一個文件大部分都小于 3kb硼讽,造成存儲系統(tǒng)的 NameNode 壓力暴增,不斷的 GC牲阁,告警固阁。。城菊。
- 事故就說到這里备燃,問題來了:奈這么多的小文件何?就想怎么能夠不讓出現(xiàn)這么多的小文件凌唬?
- 于是開始探尋之路并齐,到 flume 的官網(wǎng),發(fā)現(xiàn)了幾個參數(shù):
參數(shù) 默認值 說明 hdfs.rollInterval 30 Number of seconds to wait before rolling current file (0 = never roll based on time interval) hdfs.rollSize 1024 File size to trigger roll, in bytes (0: never roll based on file size) hdfs.rollCount 10 Number of events written to file before it rolled (0 = never roll based on number of events) hdfs.idleTimeout 0 Timeout after which inactive files get closed (0 = disable automatic closing of idle files) - 咋一看客税,貌似能解決我的問題况褪,但是老大發(fā)話了,一天寫一個文件更耻,于是再看看這幾個參數(shù)测垛,也翻了一下其他的,表示沒有找到
- 到網(wǎng)上一搜秧均,出現(xiàn) 0 點滾動文件的標題食侮,于是點進去看了看号涯,這個應該可以,打開看了看發(fā)現(xiàn)是修改源碼的锯七,于是就開始下載源碼開始了修改源碼的道路链快。。起胰。
- 修改源碼??好累久又,就沒有其他辦法了嗎巫延?最后還是搞了出來:把這四個參數(shù)全部關閉效五,然后配置寫入文件的分區(qū)路徑按照時間分區(qū),問題解決了炉峰,只要時間(分區(qū)就是按照業(yè)務時間分區(qū)的)變化畏妖,那么就會切換到新的分區(qū)中。終于告一段落
- 但是疼阔,緊接著發(fā)現(xiàn)一個問題:這個分區(qū)中的文件始終不會關閉戒劫,即文件的后綴始終是
.tmp
,但是不用緊張婆廊,只需要打開hdfs.idleTimeout這個屬性即可迅细,可以設置為 10 分鐘,那么 10 分鐘內(nèi)不寫文件就會關閉這個文件淘邻。
- 于是開始探尋之路并齐,到 flume 的官網(wǎng),發(fā)現(xiàn)了幾個參數(shù):
- 事故就說到這里备燃,問題來了:奈這么多的小文件何?就想怎么能夠不讓出現(xiàn)這么多的小文件凌唬?
- 業(yè)務服務已然上線茵典,但是數(shù)據(jù)服務由于各種問題,導致不能正常上線宾舅,但是軟終端的領導撂話:數(shù)據(jù)不能丟统阿,但是我的 Flume 還有問題沒有解決就不能冒然啟動,否則會造成各種問題筹我。但是 Flume 的上游是 kafka扶平,kafka 可以保留最近 7 天的數(shù)據(jù),也就是說蔬蕊,我們還有 7 天的緩沖期结澄,當然了不能死扣著這個 7 天,盡早上線為好
- 問題就說到這里岸夯,那么如何解決歷史數(shù)據(jù)問題呢