1 Apache Flume
1.1 概述
Flume是Cloudera提供的一個高可用,高可靠的,分布式的海量日志采集、聚合和傳輸的軟件。
Flume的核心是把數據從數據源(source)收集過來,再將收集到的數據送到指定的目的地(sink)。為了保證輸送的過程一定成功,在送到目的地(sink)之前,會先緩存數據(channel),待數據真正到達目的地(sink)后,flume再刪除自己緩存的數據。
Flume支持定制各類數據發送方,用於收集各類型數據:同時,Flume支持定制各種數據接受放,用於最終存儲數據。一般的采集需求,通過對flume的簡單配置即可實現。針對特殊場景也具備良好的自定義擴展能力。因此,flume可以適用於大部分的日常數據采集場景。
當前Flume有兩個版本。Flume0.9X版本的通常Flume OG(original generation),Flume1.X版本的統稱Flume NG(next generation)。由於Flume NG經過核心組件、核心配置以及代碼架構重構,與Flume OG有很大不同,使用時請注意區分。改動的另一個原因是將Flume納入Apache旗下,Cloudera Flume改名為Apache Flume。
1.2 運行機制
Flume日志采集傳輸系統中核心的角色是agent,agent本身是一個java進程,一般運行在日志收集節點,當然也可以運行在數據下沉的節點。Source、Sink、Channel三個組件是Flume運行的核心。
每一個agent相當於一個數據傳遞員,關於三個組件的介紹:
Source:采集源,用於跟數據源對接,以獲取數據;
Sink:下沉地,采集數據的傳送目的,用於往下一級agent傳遞數據或者往最終存儲系統傳遞數據;
Channel:agent內部的數據傳輸通道,用於從source將數據傳遞到sink;
在整個數據的傳輸的過程中,流動的是event,它是Flume內部數據傳輸的最基本的單元。event將傳輸的數據進行封裝。如果是文本文件,通常是一行記錄,event也是事務的基本單位。event從source,流向channel,再到sink,本身為一個字節數組,並可攜帶headers(頭信息)信息。event代表着一個數據的最小完整單元,從外部數據源來,向外部的目的地去。
一個完整的event包括:event headers、event body、event信息,其中event信息就是flume收集到的日記記錄。
1.3 Flume采集系統結構圖
1.3.1 簡單結構
單個agent采集數據
1.3.2 復雜結構
多級agent之間串聯。
我們知道Flume一個很重要的功能就是應用於大數據環境中采集日志信息,那么對於分布式系統就需要用到下面這種復雜結構的Flume采集系統。在每一台服務器上都部署一個agent進程進行數據采集,再通過一個agent進程對所有采集到的數據進行匯總,並下沉到數據存儲系統。
1.4 官網
documentation-> Flume User Guide頁面左邊菜單的Configuration下面我們可以看到Flume Sources、Flume Sinks、Flume Channels。這里所列舉的數據源、下沉地和傳輸通道基本上包含了大數據領域常用的軟件,能滿足大部分的需求,特殊情況下Flume也支持自定義。
由此我們也可以知道,Flume使用起來重點在於采集方案的配置。針對采集需求使用的是什么樣的source、sink和channel,把服務配置好並啟動起來,就可以進行數據采集、數據的傳輸和數據的下沉。