flume架構(gòu)總結(jié)
介紹flume之前先看一下Hadoop業(yè)務(wù)的整體流程開發(fā):
從hadoop的業(yè)務(wù)流程圖中可以看出寞忿,在大數(shù)據(jù)的業(yè)務(wù)邏輯處理過程中贞盯,對于數(shù)據(jù)的搜集是十分重要的一步,也是不可避免的一步壳快,本文下面將對flume的架構(gòu)進(jìn)行詳細(xì)的介紹洼专。
1.flume概念
flume是一個(gè)分布式、可靠和高可用的海量日志聚合的系統(tǒng)者祖,支持在系統(tǒng)中地址各類數(shù)據(jù)發(fā)送方立莉,用于手機(jī)數(shù)據(jù);同時(shí)七问,flume提供對數(shù)據(jù)進(jìn)行簡單處理蜓耻,并寫到各種數(shù)據(jù)接收方(可定制)的能力。
1.1設(shè)計(jì)目標(biāo)
可靠性
當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí)烂瘫,日志能夠被傳送到其他節(jié)點(diǎn)上而不丟失媒熊。flume提供三種級別的可靠性保障,從強(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ā)送趋急。
- Best effort
數(shù)據(jù)發(fā)送到接收方后喝峦,不會進(jìn)行確認(rèn)。
可擴(kuò)展性
Flume采用了三層架構(gòu)呜达,分別為agent谣蠢,collector和storage,每一層均可以水平擴(kuò)展查近。其中眉踱,所有agent和collector由master統(tǒng)一管理,這使得系統(tǒng)容易監(jiān)控和維護(hù)霜威,且master允許有多個(gè)(使用ZooKeeper進(jìn)行管理和負(fù)載均衡)谈喳,這就避免了單點(diǎn)故障問題。
可管理性
所有agent和colletor由master統(tǒng)一管理戈泼,這使得系統(tǒng)便于維護(hù)婿禽。多master情況赏僧,F(xiàn)lume利用ZooKeeper和gossip,保證動態(tài)配置數(shù)據(jù)的一致性谈宛。用戶可以在master上查看各個(gè)數(shù)據(jù)源或者數(shù)據(jù)流執(zhí)行情況次哈,且可以對各個(gè)數(shù)據(jù)源配置和動態(tài)加載。Flume提供了web 和shell script command兩種形式對數(shù)據(jù)流進(jìn)行管理吆录。
功能可擴(kuò)展性
用戶可以根據(jù)需要添加自己的agent窑滞,collector或者storage。此外恢筝,F(xiàn)lume自帶了很多組件哀卫,包括各種agent(file, syslog等)撬槽,collector和storage(file此改,HDFS等)。
2.Event概念
flume的核心就是把數(shù)據(jù)從數(shù)據(jù)源(source)收集過來侄柔,再將收集到的數(shù)據(jù)送到指定的目的地(sink)共啃。為了保證輸送的過程一定成功,在送到目的地之前暂题,會先緩存數(shù)據(jù)(channel)移剪,待數(shù)據(jù)真正的送到目的地(sink)后,flume再刪除緩存中的數(shù)據(jù)(channel中的數(shù)據(jù))薪者。
在整個(gè)數(shù)據(jù)的傳輸過程中纵苛,流動的是event,即事務(wù)保證是在event級別進(jìn)行的言津。那么什么是event呢攻人?——event將傳輸?shù)臄?shù)據(jù)進(jìn)行封裝,是flume傳輸數(shù)據(jù)的基本單位悬槽,如果是文本文件怀吻,通常是一行記錄,event也是事務(wù)的基本單位初婆。event從source蓬坡,流向channel,再到sink烟逊,本身為一個(gè)字節(jié)數(shù)組渣窜,并可攜帶header信息铺根,event代表著一個(gè)數(shù)據(jù)的最小完整單元宪躯,從外部數(shù)據(jù)源來,想外部的目的地去位迂。形象展示如下圖:
一個(gè)完整的event包括:event headers,event body, event信息(即文本文件中的單行記錄)访雪。
其中event就是flume收集到的日志記錄详瑞。
3.flume架構(gòu)介紹
flume的關(guān)鍵就是它的設(shè)計(jì),這個(gè)設(shè)計(jì)就是agent臣缀,啊跟他本身就是一個(gè)java進(jìn)程坝橡,運(yùn)行在日志收集節(jié)點(diǎn)(所謂的日志收集節(jié)點(diǎn)就是服務(wù)器節(jié)點(diǎn))。
agent里面包含三大核心組件:source--->channel--->sink,類似生產(chǎn)者精置、倉庫计寇、消費(fèi)者的架構(gòu)。
- source
source組件是專門用來收集數(shù)據(jù)的脂倦,可以處理各種類型番宁、各種格式的日志數(shù)據(jù),包括avro赖阻、thrift蝶押、exec、jms火欧、spooling directory棋电、netcat、sequence generator苇侵、syslog赶盔、http、legacy衅檀、自定義數(shù)據(jù)等招刨。
- channel
source組件把數(shù)據(jù)收集以后,臨時(shí)存放在channel中哀军,即channel組件在agent中是專門用來存放臨時(shí)數(shù)據(jù)的——對采集到的數(shù)據(jù)進(jìn)行簡單的緩存沉眶,可以存放在memory、jdbc杉适、file等谎倔。
- sink
sink組件是用于把數(shù)據(jù)發(fā)送大目的地 的組件,目的地包括hdfs猿推、logger片习、avro、thrift蹬叭、ipc藕咏、file、null秽五、hbse孽查、solr、自定義坦喘。
4.flume的運(yùn)行機(jī)制
flume的核心就是agent盲再,這個(gè)agent對外有兩個(gè)進(jìn)行交互的地方西设,一個(gè)是接收數(shù)據(jù)的輸入source,一個(gè)是數(shù)據(jù)的數(shù)據(jù)sink答朋,sink負(fù)責(zé)將數(shù)據(jù)發(fā)送到外部指定的目的地贷揽。source接收到數(shù)據(jù)之后,將數(shù)據(jù)發(fā)送給channel梦碗,channel作為一個(gè)數(shù)據(jù)緩沖區(qū)會臨時(shí)存放這些數(shù)據(jù)禽绪,隨后sink會將channel中的數(shù)據(jù)發(fā)送到指定的地方——例如hdfs等。注意:只有在sink將channel中的數(shù)據(jù)發(fā)送成功后洪规,channel才會將臨時(shí)的數(shù)據(jù)進(jìn)行刪除丐一,這種機(jī)制保證了數(shù)據(jù)傳輸?shù)目煽啃耘c安全性。
5.flume的廣義用法
flume之所以這么神奇淹冰,其原因也在于flume可以支持多級flume的agent库车,即flume可以先后相繼,例如sink可以將數(shù)據(jù)寫到下一個(gè)agent的source中樱拴,這樣的話就可以連成串柠衍,可以整體處理。flume還支持扇入(fan-in)晶乔、扇出(fan-out)珍坊。所謂扇入就是source可以接受多個(gè)輸入,所謂扇出就是sink可以將數(shù)據(jù)輸出多個(gè)目的地destination中正罢。