1. 程式人生 > >Flume Agent吞吐量優化方法

Flume Agent吞吐量優化方法

Flume Agent吞吐量優化方法

譯自:Scaling a flume agent to handle 120K events_sec – Data Collective – Medium
在這裡插入圖片描述


Apache Flume 是一種用來收集大量資料(如日誌)的分散式服務。Flume agent 有三個組成部分:source, channel and sink.。簡而言之,資料通過Channel從Source到Sink。Source生產資料,Channel緩衝資料並且Sink將資料寫入儲存。我們可以通過以下方法增加Flume Agent的吞吐量。

Batching

我們可以調整Source和Sink的批處理大小(batchSize)和批處理等待耗時(batchDurationMillis )來增加吞吐量。這些屬性值依賴於Source、Sink的型別以及我們可以提供的接收延遲。通過調整批量大小和吞吐量,我們能夠獲取15K Events/秒。

 <agent_name>.sinks.<sink_name>.batchSize = 10000
 <agent_name>.sinks.<sink_name>.batchDurationMillis = 10000

Sink Parallelization

在我們的例子中,由於處理速度慢Sinik變成了管道的瓶頸。我們試圖通過以下的方法增加Sink的吞吐量。

Sink Group

Sink Group 允許我們將多個Sinks組合為一個。我們配置Sink Group,將帶有負載均衡的Sink處理器將Events資料寫入多個Sink,但整個過程保持不變。檢查論壇後我們發現,在Sink Group中只有一個Sink處於活動狀態,因此效能和單個Sink一樣。
Sink Group

Multiple Sinks

不是將Sink Group附加到Channel上,而是將Sinks直接和Channel聯絡在一起。吞吐量應該增加,因為每一個Sink都在自己的執行緒上執行,但是我們看不到任何明顯的改進。經過各種測試後,我們發現現在Channel變成了瓶頸,因為多個Sinks正在競爭單個Channel的資源。
在這裡插入圖片描述

Multiple Sinks—Multiple Channels

我們配置了多個Channels並且每個Channel都連線了一個Sink。Channel選擇器(channe lselector)用於將events複製到所有的channels。
吞吐量隨每個Channel-Sink對線性增加。我們必須找到一種方法將events分發到多個Channels。

Multiplexing Channel Selector

Flume本身支援兩個Channel Selectors(選擇器):複製(replicating)和多路複用(multiplexing)。在這種情況下,不能使用複製(replicating),因為它會將相同的event複製到所有的Channels。使用多路複用(multiplexing),我們可以根據特定標頭的值將events對映到特定的Channel。這種方法需要均勻的分佈金鑰,並且Channel的數量限制於密鑰的基數。很難為每一個事件流(event stream)找到這種型別的金鑰。

Round-Robin Channel Selector

為了克服多路複用Channel選擇器的問題,我們開發了輪詢 channel 選擇器(Round-Robin channel selector),以輪詢的方式它將events分發到所有的Channel。
在這裡插入圖片描述
Build Round-Robin Channel Selector

git clone https://github.com/saravsars/flume-round- robin-channel-selector.git
cd flume-round-robin-channel-selector mvn clean package
cd target
cp flume-round-robin-channel-selector-1.0.jar FLUME_CLASSPATH/

Configure Round-Robin Channel Selector

agent.sources = source1 
agent.sinks = sink1 sink2 
agent.channels = channel1 channel2

agent.sources.source1.channels = channel1 channel2
agent.sinks.sink1.channel = channel1 agent.sinks.sink2.channel = channel2
agent.sources.source1.selector.type = com.sars.flume.RoundRobinChannelSelector

啟用批處理和輪詢Channel選擇器(Round-Robin channel selector)後,我們能夠在八核機器中實現120K events/秒