天天看點

flume-channel

Channels是events在agent上進行的存儲庫。Source添加events,Sink移除events。

Channel 是位于Source 和Sink 之間的緩沖區。是以,Channel 允許Source 和Sink 運作在不同的速率上。Channel 是Flume 保證資料不丢失的關鍵(當然,這是在正确配置的情況下)。Source 寫入資料到一個或多個Channel 中,再由一個或多個Sink 讀取。Sink隻能從一個Channel 讀取資料,而多個Sink 可以從相同的Channel 讀取以獲得更好的性能。Channel 有事務語義,允許Flume 為寫進Channel 的資料提供明确的保證。

位于Source 和Sink 之間作為緩沖區的Channel 操作,有幾個優點。Channel 允許Source在同一Channel 上操作,以擁有自己的線程模型而不必擔心Sink 從Channel 讀取資料,反之亦然。位于Source 和Sink 之間的緩沖區也允許它們工作在不同的速率,因為寫操作發生在緩沖區的尾部,讀取發生在緩沖區的頭部。這也使得Flume Agent 能處理Source“高峰小時”的負載,即使Sink 無法立即讀取Channel。

Channel 允許多個Source 和Sink 在它們上面進行操作。Channel 本質上是事務性的。每次從Channel 中寫入和讀取資料,都在事務的上下文中發生。隻有當寫事務被送出,事務中的事件才可以被任意Sink 讀取。同樣,如果一個Sink 已經成功讀取了一個事件,該事件對于其他Sink 是不可用的,除非該Sink 復原事務。

在大多數實時應用程式臨時負載出現峰值是很常見的,Flume 被設計用來處理這些情況。事件将緩沖到Channel 直到Sink 移除它們,讓Agent 處理傳入負載的變化。每個Agent可以處理多少額外的資料取決于Channel 的容量。配置設定Channel 的容量應根據預期的所有寫入Channel 的Source 最大峰值負載和所有Sink 的讀取速度的總和。這個設計還允許Source 和Sink 對失敗具備重試邏輯。對于失敗,Source 可以嘗試再次寫入Channel,Sink 可以嘗試再次讀取。

事務工作流

在第2 章“Flume Channel 中的事務”一節中讨論過,Flume Channel 是事務性的。事務本質上是原子性寫入Channel 的批量事件。事件要麼全部批量地存在在Channel 要麼全都不存在。事務提供了重要的保證,它能知曉什麼時候事件被寫入Channel 或從Channel 移除。例如,Sink 可以從Channel 中讀取一個事件,試圖把它寫到HDFS 但是失敗了,在這種情況下,事件應該復原到Channel,這樣就可以被這個可用的Sink 或另外一個Sink 讀取并寫到HDFS。

隻有在事務送出後事件才被移除能保證事件不會丢失,即使寫失敗一次,此時Sink 可以復原該事務。事務可以有一個或多個事件,但由于性能的原因總是推薦每個事務有相當大數量的事件。

批量寫入Channel 是很重要的,尤其是持久的Channel。甚至Agent 或機器重新開機的情況下,持久Channel 也能保證沒有資料丢失,是以它們必須在事務送出期間重新整理和同步所有緩沖事件的資料到磁盤,每批量發生一次。同步到磁盤是昂貴和耗時的操作,應該隻在相當大部分的資料寫入頁面緩存時完成。另外,同步到磁盤需要時間,包括在實際同步之前重要的系統調用的消耗,這一切都随着時間的推移而增加。每一個這樣的批量也表示為一個事務,使得事務對于性能以及可靠性越來越重要。

每個Channel 可以有多個Source 和Sink,分别寫入Channel 和從Channel 讀取。Source和Sink 關于事務以稍微不同的方式工作。Source 不直接處理事務;相反,Source 的Channel 處理器代表它處理事務。Channel 處理器處理事務的工作方式與Sink 幾乎是相同的(除了Sink 是從Channel 讀取資料,而Channel 處理器是将資料放入Channel)。

Sink 用Channel 發起事務是通過調用Channel 的getTransaction 方法,這個方法傳回Transaction 的一個執行個體。然後Sink 開始調用事務對象,它允許Channel 設定任何事務所需的内部狀态。通常,這包括隊列的建立,以用來暫時托管事件直到事務完成。

事務一旦開始,Sink 在Channel 上調用take 方法(Channel 處理器的情況下是put 方法),直到Sink 準備送出事務。一旦Sink 讀取一個事件,該事件将不會被用于相同的或另一個Sink,除非事務復原。

由于性能的原因Sink(和Channel 處理器)通常會将一些事件批量放入一個事務中。一旦Sink 完成了它的批量任務,Sink 就對事務調用commit 方法。一旦sink-side 事務(隻進行讀取的事務)被送出,該事務中的事件被Channel 标記為删除,也不能被其他Sink再次使用。一旦source-side 事務(Channel 處理器所擁有的事務)被送出,Channel 中的事件就是安全的。另外,這意味着隻有當Sink 讀取完事件并送出,這些事件才能從Channel 中被删除。

我們需要注意的是,如果Sink 讀取完一個事件,該事件對于其他Sink 就是不可用的,除非該Sink 復原事務,導緻該Sink 中的事務能被再次讀取。這是專門設計用來當多個Sink 操作相同的Channel 時,避免重複的。Channel 的每一個事件實際上可以讀取和送出一次,之後事件從Channel 中移除。

取決于所使用的特定的Channel,即使機器或JVM 重新開機,Channel 中的事件也可能是可用的。Sink 寫所有的事件到任意它所支援的地方也有可能失敗,是以必須重試。在這種情況下,Sink 在事務中使用rollback 方法復原整個事務。一旦事務被復原到Sink 這邊,Channel 重新存儲事件到Channel 并使它們對Sink 可用以用來讀取。在source-side 事務復原的情況下,就好像這個事務從來沒有發生過,在事務期間寫入的事件從來沒有寫入Channel。當復原是由逾時或其他失敗引起的,這時事件可能已經送出到下一階段的Channel 中,復原可能會造成重複。

當事務送出或復原之後,通過調用close 方法關閉事務,來清理事務使用的任何資源。圖4-1 說明了事務的工作流。

flume-channel

單個事務不能同時寫入和讀取事件。這保證了Source 隻能往Channel 中放入事件,Sink隻能從Channel 中取走事件。

flime内置的幾個Channel:

events存儲在配置最大大小的記憶體隊列中。對于流量較高和由于agent故障而準備丢失資料的流程來說,這是一個理想的選擇。

flume-channel
flume-channel

agent a1示例:

flume-channel

events存儲在持久化存儲庫中(其背後是一個資料庫)。JDBC channel目前支援嵌入式Derby。這是一個持續的channel,對于可恢複性非常重要的流程來說是理想的選擇。

flume-channel
flume-channel

events存儲在Kafka叢集中。Kafka提供高可用性和高可靠性,是以當agent或者kafka broker 崩潰時,events能馬上被其他sinks可用。

Kafka channel可以被多個場景使用:

Flume source和sink - 它為events提供可靠和高可用的channel

Flume source和interceptor,但是沒sink - 它允許寫Flume evnets到Kafka topic

Flume sink,但是沒source - 這是一種低延遲,容錯的方式從Kafka發送events到Flume sinks 例如 HDFS, HBase或者Solr

flume-channel
flume-channel
flume-channel

省略...

上述詳情可以檢視官網:

http://flume.apache.org/FlumeUserGuide.html#kafka-channel

或者flume1.8 使用指南學習感悟(一)、flume1.8 使用指南學習感悟(二)關于Kafka部分

javascript:void(0)  4.6.8 Kafka Source

javascript:void(0)  1.11 Kafka Sink

flume-channel
flume-channel

events存儲在記憶體隊列和磁盤中。該channel目前正在試驗中,不要求在生産環境中使用。

flume-channel
flume-channel

讓記憶體channel隊列使用失效,功能類似file channel:

flume-channel

讓磁盤溢出使用失效,功能類似in-memory channel:

flume-channel

注意:Pseudo Transaction Channel隻用于單元測試,不用于生産環境使用。

flume-channel

自定義channel是你實作Channel接口。當Flume agent啟動時,一個自定義channel類和它依賴項必須包含在agent的classpath。

flume-channel

agent a1的示例:

flume-channel

如果類型沒有指定,那麼預設“replicating”。

flume-channel

agent a1和它的source 為 r1:

flume-channel

在上面的配置中,c3是一個可選性的channel。寫event到c3出錯将會被忽略。因為c1和c2沒有标記為可選,寫到這些channels失敗将會導緻事務送出失敗。

flume-channel

agent a1和它的source為r1:

flume-channel

 一個自定義channel選擇器(selector)是實作ChannelSelector的接口。當Flume agent啟動時,一個自定義channel  selector類和它依賴項必須包含在agent的classpath。

flume-channel
flume-channel

 參考資料:

https://flume.apache.org/FlumeUserGuide.html

上一篇: go-channel
下一篇: 線性表