????????????????????????????????????????????Flume
一、flume的背景
? ? hadoop使用flume的整體開發(fā)流程:
? ??????

????從Hadoop的業(yè)務(wù)開發(fā)流程圖可以看出,在大數(shù)據(jù)的業(yè)務(wù)處理過程中,數(shù)據(jù)采集是十分重要的一步,也是不可少的一步。
許多公司的平臺(tái)每天會(huì)產(chǎn)生大量的日志(一般為流式數(shù)據(jù),如:搜索引擎的pv、查詢等),處理這些日志需要特定的日志系統(tǒng),一般而言,這些系統(tǒng)需要具備以下幾點(diǎn):
? ? 1.構(gòu)建應(yīng)用系統(tǒng)和分系統(tǒng)的橋梁,并將它們進(jìn)行關(guān)聯(lián)解耦;
? ? 2.支持近實(shí)時(shí)的在線分析和類似于hadoop之類的離線分析系統(tǒng);
? ? 3.具有高擴(kuò)展性,即:當(dāng)數(shù)據(jù)量增加時(shí),可以通過增加節(jié)點(diǎn)進(jìn)行水平擴(kuò)展。
常見的開源日志系統(tǒng),如:Facebook的scribe,Apache的chukwa,linedin的kafka,cloudera的flume等。
二、Flume的簡(jiǎn)介
? ? flume作為cloudera開發(fā)的實(shí)時(shí)日志采集系統(tǒng),受到業(yè)界的認(rèn)可和廣泛的應(yīng)用。Flume初始的發(fā)行版本目前被稱為Flume OG(original generation),屬于cloudera。
? ??但隨著 FLume 功能的擴(kuò)展,F(xiàn)lume OG 代碼工程臃腫、核心組件設(shè)計(jì)不合理、核心配置不標(biāo)準(zhǔn)等缺點(diǎn)暴露出來,尤其是在 Flume OG 的最后一個(gè)發(fā)行版本 0.9.4. 中,日
志傳輸不穩(wěn)定的現(xiàn)象尤為嚴(yán)重,為了解決這些問題,2011 年 10 月 22 號(hào),cloudera 完成了 Flume-728,對(duì) Flume 進(jìn)行了里程碑式的改動(dòng):重構(gòu)核心組件、核心配置以
及代碼架構(gòu),重構(gòu)后的版本統(tǒng)稱為 Flume NG(next generation);改動(dòng)的另一原因是將 Flume 納入 apache 旗下,cloudera Flume 改名為 Apache Flume。
Flume是Apache的頂級(jí)項(xiàng)目,官方網(wǎng)站:http://flume.apache.org/
Flume是一個(gè)分布式、可靠、高可用的海量日志聚合系統(tǒng),支持在系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),F(xiàn)lume提供對(duì)數(shù)據(jù)的簡(jiǎn)單處理,并寫到各種數(shù)據(jù)接收方的能力。
Flume 在0.9.x and 1.x之間有較大的架構(gòu)調(diào)整,1.x版本之后的改稱Flume NG,0.9.x的稱為Flume OG。
Flume目前只有Linux系統(tǒng)的啟動(dòng)腳本,沒有Windows環(huán)境的啟動(dòng)腳本。
? ??3.1 Flume的特點(diǎn)
? ? flume是一個(gè)分布式、可靠、和高可用的海量日志采集、聚合和傳輸系統(tǒng)。支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時(shí),flume提供對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理,并寫到各種數(shù)據(jù)接收方,如(文本、hdfs、hbase的)的能力。
? ? flume的數(shù)據(jù)流由事件(Event)貫穿始終。事件是flume的基本數(shù)據(jù)單位,他攜帶日志數(shù)據(jù)(字節(jié)數(shù)據(jù)形式)兵器攜帶有頭信息,這些event信息有agent外部的source生成,當(dāng)source捕獲時(shí)間后會(huì)進(jìn)行特定的格式化,然后source會(huì)把事件推入(單個(gè)或者多個(gè))channel中??梢园裞hannel理解為一個(gè)緩沖區(qū),它將保存事件直到sink處理完該事件,sink負(fù)責(zé)持久化日志或者把事件推向另一個(gè)source。
? ? ? ? 1.flume的可靠性
? ? ? ? 當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí),日志能夠被傳送到其他節(jié)點(diǎn)上而不丟失。flume提供了三種級(jí)別的可靠性保障,從強(qiáng)到弱依次分別為:end-to-end(收到數(shù)據(jù)的agent首先將event寫到磁盤是上,當(dāng)數(shù)據(jù)傳送成功后,再刪除;如果數(shù)據(jù) 發(fā)送失敗,可以重新發(fā)送。)store on failure (也是scribe的策略,當(dāng)數(shù)據(jù)接收crash時(shí),將數(shù)據(jù)寫入到本地,待回復(fù)后,繼續(xù)發(fā)送),Besteffort(數(shù)據(jù)發(fā)送到接收方后,不會(huì)進(jìn)行確認(rèn))。
? ? ? ? 2.flume的可恢復(fù)性
? ? ? ? ? ? 使用channel,使用filechannel把數(shù)據(jù)持久化到本地當(dāng)中。
3.2 Flume的一些核心概念
Client:Client生產(chǎn)數(shù)據(jù),運(yùn)行在一個(gè)獨(dú)立的線程。
Event: 一個(gè)數(shù)據(jù)單元,消息頭和消息體組成。(Events可以是日志記錄、 avro 對(duì)象等。)
Flow: Event從源點(diǎn)到達(dá)目的點(diǎn)的遷移的抽象。
Agent: 一個(gè)獨(dú)立的Flume進(jìn)程,包含組件Source、 Channel、 Sink。(Agent使用JVM 運(yùn)行Flume。每臺(tái)機(jī)器運(yùn)行一個(gè)agent,但是可以在一個(gè)agent中包含
多個(gè)sources和sinks。)
Source: 數(shù)據(jù)收集組件。(source從Client收集數(shù)據(jù),傳遞給Channel)
Channel: 中轉(zhuǎn)Event的一個(gè)臨時(shí)存儲(chǔ),保存由Source組件傳遞過來的Event。(Channel連接 sources 和 sinks ,這個(gè)有點(diǎn)像一個(gè)隊(duì)列。)
Sink: 從Channel中讀取并移除Event, 將Event傳遞到FlowPipeline中的下一個(gè)Agent(如果有的話)(Sink從Channel收集數(shù)據(jù),運(yùn)行在一個(gè)獨(dú)立線程。)
3.3 Flume NG的體系結(jié)構(gòu)
Flume?運(yùn)行的核心是 Agent。Flume以agent為最小的獨(dú)立運(yùn)行單位。一個(gè)agent就是一個(gè)JVM。它是一個(gè)完整的數(shù)據(jù)收集工具,含有三個(gè)核心組件,分別是
source、 channel、 sink。通過這些組件, Event 可以從一個(gè)地方流向另一個(gè)地方,如下圖所示。

3.4 Source
Source是數(shù)據(jù)的收集端,負(fù)責(zé)將數(shù)據(jù)捕獲后進(jìn)行特殊的格式化,將數(shù)據(jù)封裝到事件(event) 里,然后將事件推入Channel中。
Flume提供了各種source的實(shí)現(xiàn),包括Avro Source、Exce Source、Spooling Directory Source、NetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、HTTP Source、HDFS Source,etc。如果內(nèi)置的Source無法滿足需要, Flume還支持自定義Source。

3.5 Channel
Channel是連接Source和Sink的組件,大家可以將它看做一個(gè)數(shù)據(jù)的緩沖區(qū)(數(shù)據(jù)隊(duì)列),它可以將事件暫存到內(nèi)存中也可以持久化到本地磁盤上,?直到Sink處理完該事件。
Flume對(duì)于Channel,則提供了Memory Channel、JDBC Chanel、File Channel,etc。
MemoryChannel可以實(shí)現(xiàn)高速的吞吐,但是無法保證數(shù)據(jù)的完整性。
MemoryRecoverChannel在官方文檔的建議上已經(jīng)建義使用FileChannel來替換。
FileChannel保證數(shù)據(jù)的完整性與一致性。在具體配置不現(xiàn)的FileChannel時(shí),建議FileChannel設(shè)置的目錄和程序日志文件保存的目錄設(shè)成不同的磁盤,以便提高效率。
3.6 Sink
Flume Sink取出Channel中的數(shù)據(jù),進(jìn)行相應(yīng)的存儲(chǔ)文件系統(tǒng),數(shù)據(jù)庫,或者提交到遠(yuǎn)程服務(wù)器。
Flume也提供了各種sink的實(shí)現(xiàn),包括HDFS sink、Logger sink、Avro sink、File Roll sink、Null sink、HBase sink,etc。
Flume Sink在設(shè)置存儲(chǔ)數(shù)據(jù)時(shí),可以向文件系統(tǒng)中,數(shù)據(jù)庫中,hadoop中儲(chǔ)數(shù)據(jù),在日志數(shù)據(jù)較少時(shí),可以將數(shù)據(jù)存儲(chǔ)在文件系中,并且設(shè)定一定的時(shí)間間隔保存數(shù)據(jù)。在日志數(shù)據(jù)較多時(shí),可以將相應(yīng)的日志數(shù)據(jù)存儲(chǔ)到Hadoop中,便于日后進(jìn)行相應(yīng)的數(shù)據(jù)分析。

四、Flume的部署類型
4.1 單一流程

4.2 多代理流程(多個(gè)agent順序連接)

可以將多個(gè)Agent順序連接起來,將最初的數(shù)據(jù)源經(jīng)過收集,存儲(chǔ)到最終的存儲(chǔ)系統(tǒng)中。這是最簡(jiǎn)單的情況,一般情況下,應(yīng)該控制這種順序連接的Agent的數(shù)量,因?yàn)閿?shù)據(jù)流經(jīng)的路徑變長(zhǎng)了,如果不考慮failover的話,出現(xiàn)故障將影響整個(gè)Flow上的Agent收集服務(wù)。?
4.3 流的合并(多個(gè)Agent的數(shù)據(jù)匯聚到同一個(gè)Agent?)

這種情況應(yīng)用的場(chǎng)景比較多,比如要收集Web網(wǎng)站的用戶行為日志,Web網(wǎng)站為了可用性使用的負(fù)載集群模式,每個(gè)節(jié)點(diǎn)都產(chǎn)生用戶行為日志,可以為每 個(gè)節(jié)點(diǎn)都配置一個(gè)Agent來單獨(dú)收集日志數(shù)據(jù),然后多個(gè)Agent將數(shù)據(jù)最終匯聚到一個(gè)用來存儲(chǔ)數(shù)據(jù)存儲(chǔ)系統(tǒng),如HDFS上。
4.4 多路復(fù)用流(多級(jí)流)
Flume還支持多級(jí)流,什么多級(jí)流?來舉個(gè)例子,當(dāng)syslog,java,nginx、tomcat等混合在一起的日志流開始流入一個(gè)agent后,可以agent中將混雜的日志流分開,然后給每種日志建立一個(gè)自己的傳輸通道。

4.5 load balance功能
下圖Agent1是一個(gè)路由節(jié)點(diǎn),負(fù)責(zé)將Channel暫存的Event均衡到對(duì)應(yīng)的多個(gè)Sink組件上,而每個(gè)Sink組件分別連接到一個(gè)獨(dú)立的Agent上?。

五、Flume的安裝
5.1 Flume的下載
下載地址:
http://mirrors.hust.edu.cn/apache/
http://flume.apache.org/download.html
5.2 Flume的安裝
Flume框架對(duì)hadoop和zookeeper的依賴只是在jar包上,并不要求flume啟動(dòng)時(shí)必須將hadoop和zookeeper服務(wù)也啟動(dòng)。
(1)將安裝包上傳到服務(wù)器并解壓
[hadoop@hadoop1 ~]$tar -zxvf apache-flume-1.8.0-bin.tar.gz -C apps/
(2)創(chuàng)建軟連接
[hadoop@hadoop1 ~]$ln -s apache-flume-1.8.0-bin/ flume
(3)修改配置文件
/home/hadoop/apps/apache-flume-1.8.0-bin/conf
[hadoop@hadoop1 conf]$cp flume-env.sh.template flume-env.sh

(4)配置環(huán)境變量
[hadoop@hadoop1 conf]$vi ~/.bashrc
#FLUME
export FLUME_HOME=/home/hadoop/apps/flume
export PATH=$PATH:$FLUME_HOME/bin
保存使其立即生效
[hadoop@hadoop1 conf]$source ~/.bashrc
(5)查看版本
[hadoop@hadoop1 ~]$flume-ng version
