Flume Sink組、Sink處理器

Flume Sink組、Sink處理器

 

前言

Sink運行器(Sink Runner)運行一個Sink組(Sink Group),Sink組可以含有一個或多個Sink。如果組中只存在一個Sink,那麼沒有組將會更有效率。Sink運行器僅僅是一個詢問Sink組(或Sink)來處理下一批事件的線程。每個Sink組有一個Sink處理器(Sink Processor),處理器選擇組中的Sink之一去處理下一個事件集合。每個Sink只能從一個Channel獲取數據(一個Sink只能有一個Channel),儘管多個Sink可以從同一個Channel獲取數據。選定的Sink(或如果沒有組,唯一的Sink)從Channel中接受事件,並將事件寫入到下一階段或最終目的地。

Sink組

Flume配置框架爲每個Sink組實例化一個Sink運行器,來運行Sink組。每個Sink組可以包含任意數量的Sink。Sink運行器持續請求Sink組,要求其中的一個Sink從自己的Channel中讀取事件。Sink組通常用於RPC Sink,在層之間以負載均衡或故障轉移方式發送數據。

Sink組中的每個Sink必須單獨進行配置。這包括:Sink從哪個Channel讀取,寫數據到哪些主機或者集羣。

在理想情況下,如果Sink組中建立了幾個Sink,所有的Sink將從相同的Channel讀取,這將有利於在當前層以合理的速度清除數據,確保將要被髮送到多臺集羣的數據,以一種支持負載均衡和故障轉移的方式進行發送。

Sink處理器

Sink處理器決定任何時候哪個Sink是活躍的組件。

Sink處理器與Sink運行器不同。sink運行器實際上是運行sink的,而sink處理器決定了哪個sink應該從自己的channel中拉取事件。
Flume自帶了兩類Sink處理器:load-balancing Sink處理器和failover Sink處理器

Load-Balancing Sink處理器

Load-Balancing Sink 處理器從所有的Sink中選擇一個Sink,處理來自Channel的事件。

意義所在:
假設第一層100個agent,第二層有4個agent。第一層每個agent將有4個avro sink用來推送數據到第二層的每個agent。該工作正常運行,直到其中第二層的一個agent失敗。此時,配置發送數據的sink 將不會發送任何數據,直到第二層失敗的agent重新上線。
這種情況下,sink耗盡了agent上的幾個線程,浪費了CPU週期,直到第二層agent啓動並運行,通過創建事件的事務且回滾。該sink也會給channel造成額外的壓力。

案例

爲了避免這樣的問題,sink組使用load-balancing sink處理器是一個好主意。它將從sink組所有的sink中選擇一個sink,處理來自channel的事件。

如果Sink寫入到一個失敗的Agent或者速度太慢的Agent,會導致超時,Sink處理器會選擇另一個Sink寫數據。

Sink處理器可以配置將失敗的Sink加入黑名單,回退時間以指數方式增長直到達到上限值。這能確保相同的Sink不會循環重複嘗試且不浪費資源,直到回退時間過期。

參數 描述
processor.sinks 空格分割的sink列表
processor.type load_balance / failover
processor.selector 默認round_robin,有round_robin和random兩種方式
processor.backoff 默認false,失敗的sink是否啓用回退
processor.selector.maxTimeOut 默認30000,該時間之後黑名單時間週期不再增長

Sink選擇的順序可以爲random或者round-robin。如果順序被設置爲random,那麼將隨機從Sink組的Sink中選擇一個,用來從自己的Channel中移除事件並將它們寫出。round-robin選項使Sink以循環的方式被選擇:每個選擇循環調用定義Sink組中指定順序Sink的process方法。

配置示例

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processor.selector = random

該配置意味着,在任何時候每個agent只有一個sink寫數據。可以通過添加多個有相似配置的load-balancing sink處理器的sink組進行修改。

Failover Sink處理器

Failover Sink處理器從Sink組中以優先級的順序選擇Sink。擁有最高優先級的Sink先寫數據直到它失敗,然後選擇組中其他Sink中擁有最高優先級的Sink。這能確保當沒有失敗時,每臺機器上只有一個Sink寫入到第二層的所有Agent。

同時,這意味着,即使已經失敗的最高優先級的sink恢復了,Failover Sink處理器也不會讓寫入該Sink激活,直到目前活躍的sink遇到一個錯誤。

參數 描述
processor.sinks 空格分割的sink列表
processor.type load_balance / failover
processor.priority.<sinkName> sink的優先級
processor.maxpenalty 默認30000,失敗Sink的最大回退時間

failover sink 處理器工作流程

配置示例

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 5
a1.sinkgroups.g1.processor.priority.k2 = 10
a1.sinkgroups.g1.processor.maxpenalty = 10000

Load-Balancing Sink和Failover Sink處理器的區別

案例

從上面的例子中我們對比他們的區別,Load-Balancing Sink處理器是將左邊4個Sink作爲一組,這一組的每個sink的目的地都是不一樣的,每次根據processor.selector值配置的方式去選擇哪個sink去發送事件。

Failover Sink處理器還是將多個sink放到一個sink組中,每次只有一個sink堆外發送數據,優先選擇sink的優先級最大的去發送,然後往死裏用,直到用掛了,再擡走換下一個。因此,Failover Sink沒有負載平衡處理。只是做到容災。

發佈了70 篇原創文章 · 獲贊 57 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章