在一個完整的
離線
大數據處理系統中,除了HDFS+MapReduce+Hive組成分析系統的核心之外,還需要數據采集、結果數據導出、任務調度等不可或缺的輔助系統,而這些輔助工具在hadoop生態體系中都有便捷的開源框架,在此,我們首先來介紹下數據采集部分所用的的開源框架——Flume。
一、FLUME概述
Flume是Cloudera提供的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接受方(可定制)的能力。
由三部分組成:Source/Channel/Sink,Source 相當于數據錄入源,是 生產者 的角色; Channel 相當于數據傳輸通道;Sink 相當于數據接收端,是消費者的角色。在 Flume-ng 中,數據流向是 Source–>Channel–>Sink。
-
Source:從數據發生器接收數據,并將接收的數據以Flume的event格式傳遞給一個或者多個通道channal,Flume提供多種數據接收的方式,比如Avro,Thrift,twitter1%等
-
Channel:channel是一種短暫的存儲容器,它將從source處接收到的event格式的數據緩存起來,直到它們被sinks消費掉,它在source和sink間起著一共橋梁的作用,channal是一個完整的事務,這一點保證了數據在收發的時候的一致性. 并且它可以和任意數量的source和sink鏈接. 支持的類型有: JDBC channel , File System channel , Memort channel等.
-
sink:sink將數據存儲到集中存儲器比如Hbase和HDFS,它從channals消費數據(events)并將其傳遞給目標地. 目標地可能是另一個sink,也可能HDFS,HBase.
二、 Flume的優點
- 可以和任意存儲進程集成。
- 輸入的的數據速率大于寫入目的存儲的速率,flume會進行緩沖,減小hdfs的壓力。
- flume中的事務基于channel,使用了兩個事務模型(sender + receiver),確保消息被可靠發送。
Flume使用兩個獨立的事務分別負責從soucrce到channel,以及從channel到sink的事件傳遞。一旦事務中所有的數據全部成功提交到channel,那么source才認為該數據讀取完成。同理,只有成功被sink寫出去的數據,才會從channel中移除。
三、Flume采集系統結構圖
3.1 簡單結構:單個agent采集數據
3.2 復雜結構:多級agent之間串聯
3.3 Flume組成架構詳解
- Agent
Agent是一個JVM進程,它以事件的形式將數據從源頭送至目的。
Agent主要有3個部分組成,Source、Channel、Sink。 - Source
Source是負責接收數據到Flume Agent的組件
。Source組件可以處理各種類型、各種格式的日志數據,包括avro、thrift、exec
、jms、spooling directory、netcat、sequence generator
、syslog、http、legacy。
- Channel
Channel是位于Source和Sink之間的緩沖區
。因此,Channel允許Source和Sink運作在不同的速率上。Channel是線程安全的,可以同時處理幾個Source的寫入操作和幾個Sink的讀取操作。
??Flume自帶兩種Channel:Memory Channel和File Channel。
??Memory Channel是內存中的隊列。Memory Channel在不需要關心數據丟失的情景下適用
。如果需要關心數據丟失,那么Memory Channel就不應該使用,因為程序死亡、機器宕機或者重啟都會導致數據丟失。
??File Channel將所有事件寫到磁盤
。因此在程序關閉或機器宕機的情況下不會丟失數據。
- Sink
Sink不斷地輪詢Channel中的事件且批量地移除它們,并將這些事件批量寫入到存儲或索引系統、或者被發送到另一個Flume Agent
。
??Sink是完全事務性的
。在從Channel批量刪除數據之前,每個Sink用Channel啟動一個事務。批量事件一旦成功寫出到存儲系統或下一個Flume Agent,Sink就利用Channel提交事務。事務一旦被提交,該Channel從自己的內部緩沖區刪除事件。
??Sink組件目的地包括hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定義。
- Event
傳輸單元,Flume數據傳輸的基本單元,以事件的形式將數據從源頭送至目的地。 Event由可選的header和載有數據的一個byte array 構成。Header是容納了key-value字符串對的HashMap。