天天看點

Flume總結Flume總結 --huzhan

Flume總結 --huzhan

1、 你是如何實作Flume資料傳輸的監控的

使用第三方架構 Ganglia 實時監控 Flume。

2 、Flume的 Source,Sink,Channel的作用?你們 Source是什麼類型?

1、作用

(1)Source 元件是專門用來收集資料的,可以處理各種類型、各種格式的日志資料,

包括 avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy

(2)Channel 元件對采集到的資料進行緩存,可以存放在 Memory 或 File 中。

(3)Sink 元件是用于把資料發送到目的地的元件,目的地包括 HDFS、Logger、avro、

thrift、ipc、file、Hbase、solr、自定義。

2、我公司采用的 Source 類型為

(1)監控背景日志:exec

(2)監控背景産生日志的端口:netcat

Exec spooldir

3、Flume 的Channel Selectors

Channel Selectors,可以讓不同的項目日志通過不同的Channel到不同的Sink中去。

官方文檔上Channel Selectors 有兩種類型:Replicating Channel Selector (default)和Multiplexing Channel Selector

這兩種Selector的差別是:Replicating 會 将source過來的events發往所有channel,而Multiplexing可以選擇該發往哪些Channel。

4、 Flume 參數調優

1、Source

增加 Source 個(使用 Tair Dir Source 時可增加 FileGroups 個數)可以增大 Source 的讀取資料的能力。例如:當某一個目錄産生的檔案過多時需要将這個檔案目錄拆分成多個檔案目錄,同時配置好多個 Source 以保證 Source 有足夠的能力擷取到新産生的資料。batchSize 參數決定 Source 一次批量運輸到 Channel 的 event 條數,适當調大這個參數可以提高 Source 搬運 Event 到 Channel 時的性能。

2、Channel

type 選擇 memory 時 Channel 的性能最好,但是如果 Flume 程序意外挂掉可能會丢失資料。type 選擇 file 時 Channel 的容錯性更好,但是性能上會比 memory channel 差。使用 file Channel 時 dataDirs 配置多個不同盤下的目錄可以提高性能。Capacity 參數決定 Channel 可容納最大的 event 條數。transactionCapacity 參數決定每次 Source 往 channel 裡面寫的最大 event 條數和每次 Sink 從 channel 裡面讀的最大 event條數。

transactionCapacity 需要大于 Source 和 Sink 的 batchSize 參數。

3、Sink

增加 Sink 的個數可以增加 Sink 消費 event 的能力。Sink 也不是越多越好夠用就行,過多的 Sink 會占用系統資源,造成系統資源不必要的浪費。batchSize 參數決定 Sink 一次批量從 Channel 讀取的 event 條數,适當調大這個參數可以提高 Sink 從 Channel 搬出 event 的性能。

5 、Flume 的事務機制

Flume 的事務機制(類似資料庫的事務機制):Flume 使用兩個獨立的事務分别負責從Soucrce 到 Channel,以及從 Channel 到 Sink 的事件傳遞。比如 spooling directory source 為檔案的每一行建立一個事件,一旦事務中所有的事件全部傳遞到 Channel 且送出成功,那麼 Soucrce 就将該檔案标記為完成。同理,事務以類似的方式處理從 Channel 到 Sink 的傳遞過程,如果因為某種原因使得事件無法記錄,那麼事務将會復原。且所有的事件都會保持到 Channel 中,等待重新傳遞。

6、 Flume采集資料會丢失嗎?

根據 Flume 的架構原理,Flume 是不可能丢失資料的,其内部有完善的事務機制,Source 到 Channel 是事務性的,Channel 到 Sink 是事務性的,是以這兩個環節不會出現資料的丢失,唯一可能丢失資料的情況是 Channel 采用 memoryChannel,agent 當機導緻資料丢失,或者 Channel 存儲資料已滿,導緻 Source 不再寫入,未寫入的資料丢失。

Flume 不會丢失資料,但是有可能造成資料的重複,例如資料已經成功由 Sink 發出,但是沒有接收到響應,Sink 會再次發送資料,此時可能會導緻資料的重複。

7、介紹一下flume的channel

channel被設計為event中轉臨時緩沖區,存儲source收集并且沒有被sink讀取的event,平衡source收集和sink讀取的速度,可以将其視為flume内部的消息隊列。channel線程安全并且具有事務性,支援source寫失敗寫,sink讀失敗重複讀的操作。常見的類型包括Memory Channel,File Channel,Kafka Channel

8、Memory Channel與File Channel的優缺點

Memory Channel讀寫速度快,但是存儲資料量小。Flume程序挂掉、伺服器停機或者重新開機都會導緻資料丢失。在資源充足,不關心資料丢失的場景下可以使用。

File Channel存儲容量大,無資料丢失的風險。讀寫速度慢,但可以通過配置多磁盤檔案路徑,通過磁盤并行寫入提高File Channel性能。Flume将Event順序寫入到File Channel檔案的末尾,可以通過配置maxFileSize參數配置資料檔案大小,當檔案大小達到這個值,建立新的檔案,并将該檔案設定為隻讀,直到Flume把該檔案讀取完成,删除該檔案。

9、Kafka Channel的優點有哪些

Memory Channel有很大程度丢失資料的風險,File Channel雖然無資料丢失風險,但如果緩存下來的消息來沒來得及寫入Sink,Agent就出現故障,File Channel中的消息一樣不能被繼續使用。Kafka的容錯能力解決了這一點。

Flume一旦配置了Kafka為Channel,則不再需要配置Sink元件,減少了Flume啟動的程序數,降低了伺服器記憶體、磁盤等資源的使用率。

4.Flume的攔截器是什麼

Source在将Event寫入到Channel之前可以使用攔截器對Event進行各種形式的處理,Source和Channel之間可以設定多個攔截器,不同的攔截器可以設定不同的規則對Event進行處理

5.Flume的選擇器是什麼

Source發送的Event通過Channel選擇器來選擇以哪種方式寫入到Channel中,Flume提供了三種類型的選擇器,複制選擇器、複用選擇器以及自定義選擇器

1)複制選擇器:一個Source以複制的方式将一個Event寫入到多個Channel中,不同的Sink可以從不同的Channel中擷取到相同的Event。

如果Source沒有指定Channel選擇器,則該SOurce使用複制Channel選擇器,複制選擇器有一個配置參數optional,該參數指定的所有channel是可選的,當時間寫入到這些channel時有失敗發生,則忽略這些失敗,否則抛出異常,要求Source重試。

a1.sources = r1
a1.channels = c1 c2 c3
a1.sources.r1.selector.type = replicating
a1.sources.r1.channels = c1 c2 c3
a1.sources.r1.selector.optional = c3
           

2)複用選擇器:需要和攔截器配合使用,根據Event的頭資訊的不同寫入到不同的Channel中。

a1.sources = r1
a1.channels = c1 c2 c3 c4
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = state
a1.sources.r1.selector.mapping.CZ = c1
a1.sources.r1.selector.mapping.US = c2 c3
a1.sources.r1.selector.optional.US = c4
a1.sources.r1.selector.default = c4
           

3)自定義選擇器:自定義選擇器需要實作ChannelSelector接口,或者繼承AbstractChannelSelector類。

10、了解Flume的負載均衡和故障轉移嗎

設定sink組,同一個sink組内有多個sink,不同sink之間可以配置成負載均衡或故障轉移

11、Flume的事務機制

flume基于事務傳輸event(批量傳輸),使用兩個獨立的事務分别處理source到channel和channel到sink,失敗時會将所有資料復原進行重試。該事務遵循“最少一次”語義,是以資料不會丢失,但有可能重複。

source-channel之間的重複可以靠TailDir Source自帶的斷點續傳功能解決

put事務:

1)doPut:将批資料先寫入到臨時緩沖區putLIst(putList就是一個臨時的緩沖區)

2)doCommit:檢查channel記憶體隊列是否足夠合并

3)doRollback:channel記憶體隊列空間不足,復原,等待記憶體通道的容量滿足合并

channel-sink之間的重複,可以延長等待時間,或者設定UUID攔截器,然後再redis裡維護一個布隆表來使下遊實時應用去重。

take事務:

1)doTake:将資料取到臨時緩沖區takeList

2)将資料發送到下一個節點

3)doCommit:如果資料全部發送成功,則清除臨時緩沖區takeList

4)doRollback:資料發送過程中如果出現異常,rollback将臨時緩沖區takeList中的資料歸還給channel記憶體隊列

TairDir Source配置

# source的名字
agent.sources = s1
# channels的名字
agent.channels = c1
# sink的名字
agent.sinks = r1

# 指定source使用的channel
agent.sources.s1.channels = c1
# 指定sink使用的channel
agent.sinks.r1.channel = c1

######## source相關配置 ########
# source類型
agent.sources.s1.type = TAILDIR
# 中繼資料位置
agent.sources.s1.positionFile = /Users/wangpei/tempData/flume/taildir_position.json
# 監控的目錄
agent.sources.s1.filegroups = f1
agent.sources.s1.filegroups.f1=/Users/wangpei/tempData/flume/data/.*log
agent.sources.s1.fileHeader = true

######## channel相關配置 ########
# channel類型
agent.channels.c1.type = file
# 資料存放路徑
agent.channels.c1.dataDirs = /Users/wangpei/tempData/flume/filechannle/dataDirs
# 檢查點路徑
agent.channels.c1.checkpointDir = /Users/wangpei/tempData/flume/filechannle/checkpointDir
# channel中最多緩存多少
agent.channels.c1.capacity = 1000
# channel一次最多吐給sink多少
agent.channels.c1.transactionCapacity = 100

######## sink相關配置 ########
# sink類型
agent.sinks.r1.type = org.apache.flume.sink.kafka.KafkaSink
# brokers位址
agent.sinks.r1.kafka.bootstrap.servers = localhost:9092
# topic
agent.sinks.r1.kafka.topic = testTopic3
# 壓縮
agent.sinks.r1.kafka.producer.compression.type = snappy
           

12、Flume參數調優(二)

Source:

1)增加Source個數,可以增大Source讀取資料的能力。

2)batchSize參數決定Source一次批量運輸到Channel的event條數,适當調大這個參數可以提高Source搬運Event到Channel時的性能。

Channel:

1)使用File Channel時dataDirs配置多個不同盤下的目錄可以提高性能

2)Capacity參數決定Channel可容納最大的Event條數。transactionCapacty參數決定每次Source往Channel裡面寫的最大event條數和每次sink從channel裡面讀的最大event條數,transactionCapacty需要大于Source和Sink的batchSize參數

Sink:

1)适當增加Sink的個數可以增加Sink消費event的能力,但過多的sink會占用系統資源,造成不必要的浪費

2)batchSize參數決定Sink批量從Channel讀取的event條數,适當調大這個參數可以提高Sink從Channel搬運Event的性能。