本節書摘來自華章出版社《flume日志收集與mapreduce模式》一書中的第1章,第1.5節,作者 [美] 史蒂夫·霍夫曼(steve hoffman)斯裡納特·佩雷拉(srinath perera),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
flume傳輸的基本的資料負載叫作事件。事件由0個或多個頭與體組成。
頭是一些鍵值對,可用于路由判定或是承載其他的結構化資訊(比如說事件的時間戳或是發出事件的伺服器主機名)。你可以将其看作是與http頭完成相同的功能——傳遞與體不同的額外資訊的方式。
體是個位元組數組,包含了實際的負載。如果輸入由日志檔案組成,那麼該數組就非常類似于包含了單行文本的utf-8編碼的字元串。

flume可能會自動添加頭(比如,源添加了資料來自的主機名或是建立了事件時間戳),不過體基本上是不受影響的,除非你在中途使用攔截器對其進行了編輯。
攔截器指的是資料流中的一個點,你可以在這裡檢查和修改flume事件。你可以在源建立事件後或是接收器發送事件前連結0個或多個攔截器。如果熟悉aop spring架構,那麼它非常類似于methodinterceptor。在java servlets中,它類似于servletfilter。在一個源上連結了4個攔截器,如下圖所示。
通道選擇器負責将資料從一個源轉向一個或多個通道上。flume自帶了兩個通道選擇器,這涵蓋了你可能會遇到的大多數場景。不過如果需要你也可以編寫自己的選擇器。複制通道選擇器(預設的)隻是将事件的副本放到每個通道中,前提是你已經配置好了多個通道。相反,多路通道選擇器會根據某些頭資訊将事件寫到不同的通道中。搭配上攔截器邏輯,這兩種選擇器構成了将輸入路由到不同通道的基礎。
最後,輸入處理器指的是這樣一種機制,你可以通過它為輸入器建立故障恢複路徑,或是跨越一個通道的多個輸入器建立負載均衡事件。
你可以根據特定的需求連結flume代理。比如,你可以以分層的方式插入代理來限制想要直接連接配接到hadoop的用戶端數量。很多時候,源機器沒有足夠的磁盤空間來處理長期停機或是維護視窗,這樣就可以在源與hadoop叢集之間建立一個擁有大量磁盤空間的層次。
從下圖中可以看到,資料在兩個地方被建立(位于左側),并且有兩個最終目的地(位于右側的hdfs與elasticsearch雲氣泡)。下面增加點兒趣味性,假設有一台機器生成了兩種資料(我們将其稱作正方形資料與三角形資料)。我們在左下角的代理中使用了多路通道選擇器将這兩種資料劃分到了不同的通道中。接下來,矩形通道被路由到了右上角的代理(以及來自于左上角的資料)。合并後的總資料被一同寫到了資料中心1的hdfs中。與此同時,三角形資料被發送到了代理,該代理将其寫到資料中心2的elasticsearch中。請記住,資料轉換可能發生在任何源之後以及任何接收器之前。随後将會介紹如何通過這些元件建構複雜的資料流。