Flume基礎學習筆記

一、什麼是flume

Flume是一個高可用的,高可靠的,分佈式的海量日誌採集、聚合和傳輸的系統,Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。

二、flume特點

flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)並且攜帶有頭信息,這些EventAgent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩衝區,它將保存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另一個Source

flume的可靠性

當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。

flume的可恢復性:

還是靠Channel。推薦使用FileChannel,事件持久化在本地文件系統裏(性能較差)。 

flume的一些核心概念:

Agent使用JVM 運行Flume。每臺機器運行一個agent,但是可以在一個agent中包含多個sourcessinks

Client生產數據,運行在一個獨立的線程。

SourceClient收集數據,傳遞給Channel

SinkChannel收集數據,運行在一個獨立線程。

Channel連接 sources 和 sinks ,這個有點像一個隊列。

Events可以是日誌記錄、 avro 對象等。

值得注意的是,Flume提供了大量內置的SourceChannelSink類型。不同類型的Source,ChannelSink可以自由組合。組合方式基於用戶設置的配置文件,非常靈活。比如:Channel可以把事件暫存在內存裏,也可以持久化到本地硬盤上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等。Flume支持用戶建立多級流,也就是說,多個agent可以協同工作,並且支持Fan-inFan-outContextual RoutingBackup Routes

三、flume架構

Agent:

Flumeagent爲最小的獨立運行單位,一個Agent包含多個sourcechannelsink和其他組件

source

flume提供多種source供用戶進行選擇,儘可能多的滿足大部分日誌採集的需求,常用的source的類型包括avroexecnetcatspooling-directorysyslog等。具體的使用範圍和配置方法詳見source.

channel

flume中的channel不如sourcesink那麼重要,但卻是不可忽視的組成部分。常用的channelmemory-channel,同時也有其他類型的channel,如JDBCfile-channelcustom-channel等,詳情見channel.

sink

flumesink也有很多種,常用的包括avrologgerHDFSHbase以及file-roll等,除此之外還有其他類型的sink,如thriftIRCcustom等。具體的使用範圍和使用方法詳見sink.

四、flume使用

創建配置文件(隨意位置)

vi agent.conf

五、配置

常見的source

avro source:avro可以監聽和收集指定端口的日誌,使用avrosource需要說明被監聽的主機ip和端口號

例子:

agent1.sources = r1

#描述source

agent1.sources.r1.type = avro  (類型爲avro source)

agent1.sources.r1.bind = 0.0.0.0 (指定監聽的主機ip.本機是0.0.0.0.

agent1.sources.r1.port = 16667 (指定監聽的端口號)

 

exec source:可以通過指定的操作對日誌進行讀取,使用exec時需要指定shell命令,對日誌進行讀取

例子:

agent1.source = r2

#描述source

agent1.sources.r2.type = exec 

agent1.sources.r2.command =tail -F /root/flume/log/event.txt (監聽的文件的路徑)

 

Spooling-directory source:可以讀取文件夾裏的日誌,使用時指定一個文件夾,可以讀取該文件夾中的所有文件,當出現新文件時會讀取該文件並獲取數據.需要注意的是該文件夾中的文件在讀取過程中不能修改,同時文件名也不能修改。

1、spoolDirectory是監控目錄,不能爲空,沒有默認值。這個source不具有監控子目錄的功能,也就是不能遞歸監控。如果需要,這需要自己去實現,http://blog.csdn.net/yangbutao/article/details/8835563 這裏有遞歸檢測的實現;

2completedSuffix是文件讀取完畢後給完成文件添加的標記後綴,默認是".COMPLETED"

3deletePolicy這是是否刪除讀取完畢的文件,默認是"never",就是不刪除,目前只支持"never"和“IMMEDIATE”;

4fileHeader是否在eventHeader中添加文件名,boolean類型默認false

5fileHeaderKey這是eventHeader中的key,value是文件名

6batchSize這個是一次處理的記錄數,默認是100

7inputCharset編碼方式,默認是"UTF-8"

8ignorePattern忽略符合條件的文件名

9trackerDirPath被處理文件元數據的存儲目錄,默認".flumespool"

10deserializerType將文件中的數據序列化成event的方式,默認是“LINE---org.apache.flume.serialization.LineDeserializer

11deserializerContext這個主要用在Deserializer中設置編碼方式outputCharset和文件每行最大長度maxLineLength

 

例子:

agent1.sources = r3

#描述source

agent1.sources.r3.type = spooldir

agent1.sources.r3.spoolDir = /root/flume/log  (監聽的文件目錄)

agent1.sources.r3.fileHeader = true

    

NetCat source:用來監聽一個指定端口,並將接收到的數據的每一行轉換爲一個事件。

例子:

agent1.sources = r4 

#描述source

agent1.sources.r4.type = netcat  (source類型)

agent1.sources.r4.bind = 0.0.0.0 (指定綁定的ip或主機名)

agent1.sources.r4.port = 16668   (指定綁定的端口號)

 

HTTP source:接受HTTPGETPOST請求作爲Flume的事件,其中GET方式應該只用於試驗。

type    類型,必須爲"HTTP"

port–   監聽的端口

bind   0.0.0.0    監聽的主機名或ip

handler      org.apache.flume.source.http.JSONHandler處理器類,需要實現HTTPSourceHandler接口

handler.*  –   處理器的配置參數

Selector.type

selector.*   

interceptors  –  

interceptors.*        

enableSSL  false  是否開啓SSL,如果需要設置爲true。注意,HTTP不支持SSLv3

excludeProtocols  SSLv3  空格分隔的要排除的SSL/TLS協議。SSLv3總是被排除的。

keystore      密鑰庫文件所在位置

keystorePassword Keystore 密鑰庫密碼

例子:

agent1.sources.r1.type  = http

agent1.sources.r1.port  = 66666

 

常見的channel

memory channel:內存

例子:

agent1.channels = c1

agent1.channels.c1.type = memory

agent1.channels.c1.capacity = 100000

agent1.channels.c1.transactionCapacity = 100000

 

常見的sink

logger sink:將收集到的日誌寫到flumelog

例子:

agent1.sinks = k1

agent2.sinks.k1.type = logger

 

avro sink:可以將接受到的日誌發送到指定端口,供級聯agent的下一跳收集和接受日誌,使用時需要指定目的ip和端口

例子:

agent1.sinks=k1

agent1.sinks.k2.type = avro

agent1.sinks.k2.channel = c2

agent1.sinks.k2.hostname = hadoop03 (指定的主機名或ip)

agent1.sinks.k2.port = 16666  (指定的端口號)

 

file_roll sink:可以將一定時間內收集到的日誌寫到一個指定的文件中,具體過程爲用戶指定一個文件夾和一個週期,然後啓動agent,這時該文件夾會產生一個文件將該週期內收集到的日誌全部寫進該文件內,直到下一個週期再次產生一個新文件繼續寫入,以此類推,週而復始。

例子:

agent1.sinks=k1

agent1.sinks.k1.type = file_roll

agent1.sinks.k1.channel = c1

agent1.sinks.k1.sink.directory=/root/flumelog (指定文件所在目錄的路徑)

 

hdfs sink:將收集到的日誌寫入到新創建的文件中保存起來,存儲路徑爲分佈式的文件系統hdfs的路徑,同時hdfs創建新文件的週期可以是時間,也可以是文件的大小,還可以是採集日誌的條數

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