聲明
我對(duì)Flume的研究并不深,這一篇文章來(lái)源于2016年3月的某一個(gè)下午對(duì)Flume的調(diào)研,僅有一個(gè)下午,所以可能有一些觀點(diǎn)是不對(duì)的。另外钠导,文章很多內(nèi)容來(lái)源于一些大神的博文,當(dāng)時(shí)匆匆沒(méi)有記錄引用來(lái)源森瘪。所以辈双,如果有人可以發(fā)現(xiàn)本文的錯(cuò)誤,以及引用的文章柜砾,還請(qǐng)?jiān)诹粞灾兄赋雠韧Hf(wàn)分感謝。
Flume OG
Flume OG:Flume Original Generation痰驱,初代Flume证芭。
由三種角色構(gòu)成:代理點(diǎn)(agent)、收集節(jié)點(diǎn)(collector)担映、主節(jié)點(diǎn)(master)
- agent 從各個(gè)數(shù)據(jù)源收集日志數(shù)據(jù)废士,將收集到的數(shù)據(jù)集中到 collector,然后由收集節(jié)點(diǎn)匯總存入 hdfs蝇完。
- master 負(fù)責(zé)管理 agent官硝,collector 的活動(dòng)。
- agent短蜕、collector 都稱為 node氢架,node 的角色根據(jù)配置的不同分為 logical node(邏輯節(jié)點(diǎn))、physical node(物理節(jié)點(diǎn))朋魔。對(duì) logical nodes 和 physical nodes 的區(qū)分岖研、配置、使用一直以來(lái)都是使用者最頭疼的地方警检。
-
agent孙援、collector由Source、Sink組成扇雕,當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)是從Source傳送到Sink的拓售。
flume-og-01.png
Flume NG
Flume NG:Flume New Generation
- NG只有一種角色節(jié)點(diǎn):代理點(diǎn)(agent)。
- 沒(méi)有collector镶奉、master節(jié)點(diǎn)础淤。這是核心組件最核心的變化崭放。
- 去除了 physical nodes、logical nodes 的概念和相關(guān)內(nèi)容值骇。
- agent 節(jié)點(diǎn)的組成也發(fā)生了變化莹菱。NG agent 由 source移国、sink吱瘩、channel 組成。
-
NG刪減了角色迹缀,脫離了對(duì)Zookeeper的依賴
flume-ng.png
Flume NG分析
基本概念
- Event:一個(gè)數(shù)據(jù)單元使碾,帶有一個(gè)可選的消息頭。
- Flow:Event從源點(diǎn)到達(dá)目的點(diǎn)的遷移的抽象祝懂。
- Client:操作位于源點(diǎn)處的Event票摇,將其發(fā)送到Flume Agent。
- Agent:一個(gè)獨(dú)立的Flume進(jìn)程砚蓬,包含組件Source矢门、Channel、Sink灰蛙。
- Source:用來(lái)消費(fèi)傳遞到該組件的Event 祟剔,存入channel中。
- Channel:中轉(zhuǎn)Event的一個(gè)臨時(shí)存儲(chǔ)摩梧,保存有Source組件傳遞過(guò)來(lái)的Event物延。
- Sink:從Channel中讀取并移除Event,將Event傳遞到Flow Pipeline中的下一個(gè)Agent(如果有的話)仅父。
數(shù)據(jù)流:
Flume 的核心是把數(shù)據(jù)從數(shù)據(jù)源收集過(guò)來(lái)叛薯,再送到目的地。為了保證輸送一定成功笙纤,在送到目的地之前耗溜,會(huì)先緩存數(shù)據(jù),待數(shù)據(jù)真正到達(dá)目的地后省容,刪除自己緩存的數(shù)據(jù):當(dāng)sink寫入失敗后强霎,可以自動(dòng)重啟,不會(huì)造成數(shù)據(jù)丟失蓉冈,因此很可靠城舞。
Flume 傳輸?shù)臄?shù)據(jù)的基本單位是 Event,如果是文本文件寞酿,通常是一行記錄家夺,這也是事務(wù)的基本單位。Event 從 Source伐弹,流向 Channel拉馋,再到 Sink,本身為一個(gè) byte 數(shù)組,并可攜帶 headers 信息煌茴。Event 代表著一個(gè)數(shù)據(jù)流的最小完整單元随闺,從外部數(shù)據(jù)源來(lái),向外部的目的地去蔓腐。
核心組件:
Source
- ExecSource: 以運(yùn)行 Linux 命令的方式矩乐,持續(xù)的輸出最新的數(shù)據(jù),如 tail -F 文件名 指令回论,在這種方式下散罕,取的文件名必須是指定的。 ExecSource 可以實(shí)現(xiàn)對(duì)日志的實(shí)時(shí)收集傀蓉,但是存在Flume不運(yùn)行或者指令執(zhí)行出錯(cuò)時(shí)欧漱,將無(wú)法收集到日志數(shù)據(jù),無(wú)法保證日志數(shù)據(jù)的完整性葬燎。
- SpoolSource: 監(jiān)測(cè)配置的目錄下新增的文件误甚,并將文件中的數(shù)據(jù)讀取出來(lái)。需要注意兩點(diǎn):拷貝到 spool 目錄下的文件不可以再打開(kāi)編輯谱净;spool 目錄下不可包含相應(yīng)的子目錄窑邦。SpoolSource無(wú)法實(shí)現(xiàn)實(shí)時(shí)的收集數(shù)據(jù),但可以設(shè)置以分鐘的方式分割文件岳遥,趨于實(shí)時(shí)奕翔。
Channel
Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel浩蓉。比較常見(jiàn)的是前三種 channel派继。
- MemoryChannel 可以實(shí)現(xiàn)高速的吞吐,但是無(wú)法保證數(shù)據(jù)的完整性捻艳。
- MemoryRecoverChannel 在官方文檔的建議上已經(jīng)建義使用FileChannel來(lái)替換驾窟。
-
FileChannel保證數(shù)據(jù)的完整性與一致性。在具體配置FileChannel時(shí)认轨,建議FileChannel設(shè)置的目錄和程序日志文件保存的目錄設(shè)成不同的磁盤绅络,以便提高效率。
flume-channel.png
Sink
可靠性
在Flume NG中嘁字,可靠性指的是在數(shù)據(jù)流的傳輸過(guò)程中恩急,保證events的可靠傳遞。
在Flume NG中纪蜒,所有的events都保存在Agent的Channel中衷恭,然后被發(fā)送到數(shù)據(jù)流下一個(gè)Agent或者最終的存儲(chǔ)服務(wù)中。當(dāng)且僅當(dāng)它們被保存到下一個(gè)Agent的Channel中纯续,或者被保存到最終的存儲(chǔ)服務(wù)中随珠。這就是Flume 提供數(shù)據(jù)流中點(diǎn)到點(diǎn)的可靠性保證的最基本的單跳消息語(yǔ)義傳遞灭袁。
首先,Agent間的事務(wù)交換窗看。Flume使用事務(wù)的辦法來(lái)保證events的可靠傳遞茸歧。Source和Sink分別被封裝在事務(wù)中,這些事務(wù)由保存event的存儲(chǔ)提供或者由Channel提供显沈。這就保證了event在數(shù)據(jù)流的點(diǎn)對(duì)點(diǎn)傳輸中是可靠的软瞎。在多級(jí)數(shù)據(jù)流中,如下圖构罗,上一級(jí)的Sink和下一級(jí)的Source都被包含在事務(wù)中铜涉,保證數(shù)據(jù)可靠地從一個(gè)Channel到另一個(gè)Channel轉(zhuǎn)移智玻。
下圖A:正常情況下的 events流程遂唧。
下圖B:Agent2 跟central event store失聯(lián),Agent2提交的事務(wù)失敗吊奢,將events緩存起來(lái)盖彭。
下圖C:重新恢復(fù)時(shí),再恢復(fù)失聯(lián)之前的任務(wù)以及后續(xù)的events發(fā)送页滚。
高可用
如下圖所示召边,Agent1中,只有要有一個(gè)Sink組件可用裹驰,events就被傳遞到下一個(gè)組件隧熙,如果一個(gè)Sink能成功處理Event(事務(wù)完成),則會(huì)加入到一個(gè)Pool中幻林, 否則贞盯,則會(huì)從Pool中移除,并計(jì)算失敗次數(shù)沪饺,設(shè)置懲罰因子躏敢。所以,如果某一個(gè)Flow中某一層的Agent只有一個(gè)整葡,或者全部宕機(jī)件余,可能導(dǎo)致這些Events被存儲(chǔ)在流水線上最后一個(gè)存活節(jié)點(diǎn)。