前言
Sink運行器(Sink Runner)運行一個Sink組(Sink Group)述么,Sink組可以含有一個或多個Sink籍琳。如果組中只存在一個Sink菲宴,那么沒有組將會更有效率。Sink運行器僅僅是一個詢問Sink組(或Sink)來處理下一批事件的線程趋急。每個Sink組有一個Sink處理器(Sink Processor)喝峦,處理器選擇組中的Sink之一去處理下一個事件集合。每個Sink只能從一個Channel獲取數(shù)據(jù)(一個Sink只能有一個Channel)呜达,盡管多個Sink可以從同一個Channel獲取數(shù)據(jù)谣蠢。選定的Sink(或如果沒有組,唯一的Sink)從Channel中接受事件,并將事件寫入到下一階段或最終目的地眉踱。
Sink組
Flume配置框架為每個Sink組實例化一個Sink運行器挤忙,來運行Sink組。每個Sink組可以包含任意數(shù)量的Sink谈喳。Sink運行器持續(xù)請求Sink組册烈,要求其中的一個Sink從自己的Channel中讀取事件。Sink組通常用于RPC Sink叁执,在層之間以負(fù)載均衡或故障轉(zhuǎn)移方式發(fā)送數(shù)據(jù)茄厘。
Sink組中的每個Sink必須單獨進行配置。這包括:Sink從哪個Channel讀取谈宛,寫數(shù)據(jù)到哪些主機或者集群次哈。
在理想情況下,如果Sink組中建立了幾個Sink吆录,所有的Sink將從相同的Channel讀取窑滞,這將有利于在當(dāng)前層以合理的速度清除數(shù)據(jù),確保將要被發(fā)送到多臺集群的數(shù)據(jù)恢筝,以一種支持負(fù)載均衡和故障轉(zhuǎn)移的方式進行發(fā)送哀卫。
Sink處理器
Sink處理器決定任何時候哪個Sink是活躍的組件。
Sink處理器與Sink運行器不同撬槽。sink運行器實際上是運行sink的此改,而sink處理器決定了哪個sink應(yīng)該從自己的channel中拉取事件。
Flume自帶了兩類Sink處理器:load-balancing Sink處理器和failover Sink處理器
Load-Balancing Sink處理器
Load-Balancing Sink 處理器從所有的Sink中選擇一個Sink侄柔,處理來自Channel的事件共啃。
意義所在:
假設(shè)第一層100個agent,第二層有4個agent暂题。第一層每個agent將有4個avro sink用來推送數(shù)據(jù)到第二層的每個agent移剪。該工作正常運行,直到其中第二層的一個agent失敗薪者。此時纵苛,配置發(fā)送數(shù)據(jù)的sink 將不會發(fā)送任何數(shù)據(jù),直到第二層失敗的agent重新上線言津。
這種情況下攻人,sink耗盡了agent上的幾個線程,浪費了CPU周期悬槽,直到第二層agent啟動并運行贝椿,通過創(chuàng)建事件的事務(wù)且回滾。該sink也會給channel造成額外的壓力陷谱。
為了避免這樣的問題,sink組使用load-balancing sink處理器是一個好主意。它將從sink組所有的sink中選擇一個sink烟逊,處理來自channel的事件渣窜。
如果Sink寫入到一個失敗的Agent或者速度太慢的Agent,會導(dǎo)致超時宪躯,Sink處理器會選擇另一個Sink寫數(shù)據(jù)乔宿。
Sink處理器可以配置將失敗的Sink加入黑名單,回退時間以指數(shù)方式增長直到達(dá)到上限值访雪。這能確保相同的Sink不會循環(huán)重復(fù)嘗試且不浪費資源详瑞,直到回退時間過期。
參數(shù) | 描述 |
---|---|
processor.sinks | 空格分割的sink列表 |
processor.type | load_balance / failover |
processor.selector | 默認(rèn)round_robin臣缀,有round_robin和random兩種方式 |
processor.backoff | 默認(rèn)false,失敗的sink是否啟用回退 |
processor.selector.maxTimeOut | 默認(rèn)30000坝橡,該時間之后黑名單時間周期不再增長 |
Sink選擇的順序可以為random或者round-robin。如果順序被設(shè)置為random精置,那么將隨機從Sink組的Sink中選擇一個计寇,用來從自己的Channel中移除事件并將它們寫出。round-robin選項使Sink以循環(huán)的方式被選擇:每個選擇循環(huán)調(diào)用定義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寫數(shù)據(jù)±底瑁可以通過添加多個有相似配置的load-balancing sink處理器的sink組進行修改蝶押。
Failover Sink處理器
Failover Sink處理器從Sink組中以優(yōu)先級的順序選擇Sink。擁有最高優(yōu)先級的Sink先寫數(shù)據(jù)直到它失敗火欧,然后選擇組中其他Sink中擁有最高優(yōu)先級的Sink棋电。這能確保當(dāng)沒有失敗時,每臺機器上只有一個Sink寫入到第二層的所有Agent布隔。
同時离陶,這意味著,即使已經(jīng)失敗的最高優(yōu)先級的sink恢復(fù)了衅檀,F(xiàn)ailover Sink處理器也不會讓寫入該Sink激活招刨,直到目前活躍的sink遇到一個錯誤。
參數(shù) | 描述 |
---|---|
processor.sinks | 空格分割的sink列表 |
processor.type | load_balance / failover |
processor.priority.<sinkName> | sink的優(yōu)先級 |
processor.maxpenalty | 默認(rèn)30000哀军,失敗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處理器的區(qū)別
從上面的例子中我們對比他們的區(qū)別沉眶,Load-Balancing Sink處理器是將左邊4個Sink作為一組,這一組的每個sink的目的地都是不一樣的杉适,每次根據(jù)processor.selector值配置的方式去選擇哪個sink去發(fā)送事件谎倔。
Failover Sink處理器還是將多個sink放到一個sink組中,每次只有一個sink堆外發(fā)送數(shù)據(jù)猿推,優(yōu)先選擇sink的優(yōu)先級最大的去發(fā)送片习,然后往死里用捌肴,直到用掛了,再抬走換下一個藕咏。因此状知,F(xiàn)ailover Sink沒有負(fù)載平衡處理。只是做到容災(zāi)孽查。