Flume原理解析

一吟税、Flume簡介

flume 作為 cloudera 開發(fā)的實時日志收集系統(tǒng)师幕,受到了業(yè)界的認(rèn)可與廣泛應(yīng)用购裙。Flume 初始的發(fā)行版本目前被統(tǒng)稱為 Flume OG(original generation)掏父,屬于 cloudera竣灌。但隨著 FLume 功能的擴展,F(xiàn)lume OG 代碼工程臃腫炬丸、核心組件設(shè)計不合理瘫寝、核心配置不標(biāo)準(zhǔn)等缺點暴露出來,尤其是在 Flume OG 的最后一個發(fā)行版本 0.9.4. 中稠炬,日志傳輸不穩(wěn)定的現(xiàn)象尤為嚴(yán)重矢沿,為了解決這些問題,2011 年 10 月 22 號酸纲,cloudera 完成了 Flume-728,對 Flume 進(jìn)行了里程碑式的改動:重構(gòu)核心組件瑟匆、核心配置以及代碼架構(gòu)闽坡,重構(gòu)后的版本統(tǒng)稱為 Flume NG(next generation);改動的另一原因是將 Flume 納入 apache 旗下愁溜,cloudera Flume 改名為 Apache Flume疾嗅。
  備注:Flume參考資料
    官方網(wǎng)站: http://flume.apache.org/
    用戶文檔: http://flume.apache.org/FlumeUserGuide.html
    開發(fā)文檔: http://flume.apache.org/FlumeDeveloperGuide.html

二、Flume特點

flume是一個分布式冕象、可靠代承、和高可用的海量日志采集、聚合和傳輸?shù)南到y(tǒng)渐扮。支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方论悴,用于收集數(shù)據(jù);同時,F(xiàn)lume提供對數(shù)據(jù)進(jìn)行簡單處理墓律,并寫到各種數(shù)據(jù)接受方(比如文本膀估、HDFS、Hbase等)的能力 耻讽。flume的數(shù)據(jù)流由事件(Event)貫穿始終察纯。事件是Flume的基本數(shù)據(jù)單位,它攜帶日志數(shù)據(jù)(字節(jié)數(shù)組形式)并且攜帶有頭信息,這些Event由Agent外部的Source生成饼记,當(dāng)Source捕獲事件后會進(jìn)行特定的格式化香伴,然后Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩沖區(qū)具则,它將保存事件直到Sink處理完該事件即纲。Sink負(fù)責(zé)持久化日志或者把事件推向另一個Source。
  1)flume的可靠性
    當(dāng)節(jié)點出現(xiàn)故障時乡洼,日志能夠被傳送到其他節(jié)點上而不會丟失崇裁。Flume提供了三種級別的可靠性保障,從強到弱依次分別為: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ù)據(jù)寫到本地,待恢復(fù)后佣耐,繼續(xù)發(fā)送)政勃,Besteffort(數(shù)據(jù)發(fā)送到接收方后,不會進(jìn)行確認(rèn))兼砖。
  2)flume的可恢復(fù)性
    還是靠Channel奸远。推薦使用FileChannel,事件持久化在本地文件系統(tǒng)里(性能較差)讽挟。

三懒叛、Flume的一些核心概念

Client:Client生產(chǎn)數(shù)據(jù),運行在一個獨立的線程耽梅。
  Event: 一個數(shù)據(jù)單元薛窥,消息頭和消息體組成。(Events可以是日志記錄眼姐、 avro 對象等诅迷。)
  Flow: Event從源點到達(dá)目的點的遷移的抽象。
  Agent: 一個獨立的Flume進(jìn)程妥凳,包含組件Source竟贯、 Channel、 Sink逝钥。(Agent使用JVM 運行Flume屑那。每臺機器運行一個agent拱镐,但是可以在一個agent中包含多個sources和sinks。)
  Source: 數(shù)據(jù)收集組件持际。(source從Client收集數(shù)據(jù)沃琅,傳遞給Channel)
  Channel: 中轉(zhuǎn)Event的一個臨時存儲,保存由Source組件傳遞過來的Event蜘欲。(Channel連接 sources 和 sinks 益眉,這個有點像一個隊列。)
  Sink: 從Channel中讀取并移除Event姥份, 將Event傳遞到FlowPipeline中的下一個Agent(如果有的話)(Sink從Channel收集數(shù)據(jù)郭脂,運行在一個獨立線程。)

3.1澈歉、Agent結(jié)構(gòu)

Flume 運行的核心是 Agent展鸡。Flume以agent為最小的獨立運行單位。一個agent就是一個JVM埃难。它是一個完整的數(shù)據(jù)收集工具莹弊,含有三個核心組件,分別是source涡尘、 channel忍弛、 sink。通過這些組件考抄, Event 可以從一個地方流向另一個地方细疚,如下圖所示。

image

3.2川梅、source

Source是數(shù)據(jù)的收集端惠昔,負(fù)責(zé)將數(shù)據(jù)捕獲后進(jìn)行特殊的格式化,將數(shù)據(jù)封裝到事件(event) 里挑势,然后將事件推入Channel中。 Flume提供了很多內(nèi)置的
  Source啦鸣, 支持 Avro潮饱, log4j, syslog 和 http post(body為json格式)诫给∠憷可以讓應(yīng)用程序同已有的Source直接打交道,如AvroSource中狂,SyslogTcpSource凫碌。 如果內(nèi)置的Source無法滿足需要, Flume還支持自定義Source胃榕。

  
image

source類型:

  
image

3.3盛险、Channel

Channel是連接Source和Sink的組件,大家可以將它看做一個數(shù)據(jù)的緩沖區(qū)(數(shù)據(jù)隊列),它可以將事件暫存到內(nèi)存中也可以持久化到本地磁盤上苦掘, 直
  到Sink處理完該事件换帜。介紹兩個較為常用的Channel, MemoryChannel和FileChannel鹤啡。

Channel類型:

image

3.4惯驼、Sink

Sink從Channel中取出事件,然后將數(shù)據(jù)發(fā)到別處递瑰,可以向文件系統(tǒng)祟牲、數(shù)據(jù)庫、 hadoop存數(shù)據(jù)抖部, 也可以是其他agent的Source说贝。在日志數(shù)據(jù)較少時,可以將數(shù)據(jù)存儲在文件系統(tǒng)中您朽,并且設(shè)定一定的時間間隔保存數(shù)據(jù)狂丝。

image

Sink類型:

image

四、Flume攔截器哗总、數(shù)據(jù)流以及可靠性

4.1几颜、Flume攔截器

當(dāng)我們需要對數(shù)據(jù)進(jìn)行過濾時,除了我們在Source讯屈、 Channel和Sink進(jìn)行代碼修改之外蛋哭, Flume為我們提供了攔截器,攔截器也是chain形式的涮母。攔截器的位置在Source和Channel之間谆趾,當(dāng)我們?yōu)镾ource指定攔截器后,我們在攔截器中會得到event叛本,根據(jù)需求我們可以對event進(jìn)行保留還是拋棄沪蓬,拋棄的數(shù)據(jù)不會進(jìn)入Channel中。

image

4.2来候、Flume數(shù)據(jù)流

1)Flume 的核心是把數(shù)據(jù)從數(shù)據(jù)源收集過來跷叉,再送到目的地。為了保證輸送一定成功营搅,在送到目的地之前云挟,會先緩存數(shù)據(jù),待數(shù)據(jù)真正到達(dá)目的地后转质,刪除自己緩存的數(shù)據(jù)园欣。
  2) Flume 傳輸?shù)臄?shù)據(jù)的基本單位是 Event,如果是文本文件休蟹,通常是一行記錄沸枯,這也是事務(wù)的基本單位日矫。 Event 從 Source,流向 Channel辉饱,再到 Sink搬男,本身為一個 byte 數(shù)組,并可攜帶 headers 信息彭沼。 Event 代表著一個數(shù)據(jù)流的最小完整單元缔逛,從外部數(shù)據(jù)源來,向外部的目的地去姓惑。

image

值得注意的是褐奴,F(xiàn)lume提供了大量內(nèi)置的Source、Channel和Sink類型于毙。不同類型的Source,Channel和Sink可以自由組合敦冬。組合方式基于用戶設(shè)置的配置文件,非常靈活唯沮。比如:Channel可以把事件暫存在內(nèi)存里脖旱,也可以持久化到本地硬盤上。Sink可以把日志寫入HDFS, HBase介蛉,甚至是另外一個Source等等萌庆。Flume支持用戶建立多級流,也就是說币旧,多個agent可以協(xié)同工作践险,并且支持Fan-in、Fan-out吹菱、Contextual Routing巍虫、Backup Routes,這也正是Flume強大之處鳍刷。如下圖所示:

image

4.3占遥、Flume可靠性

Flume 使用事務(wù)性的方式保證傳送Event整個過程的可靠性。 Sink 必須在Event 被存入 Channel 后输瓜,或者筷频,已經(jīng)被傳達(dá)到下一站agent里,又或者前痘,已經(jīng)被存入外部數(shù)據(jù)目的地之后,才能把 Event 從 Channel 中 remove 掉担忧。這樣數(shù)據(jù)流里的 event 無論是在一個 agent 里還是多個 agent 之間流轉(zhuǎn)芹缔,都能保證可靠,因為以上的事務(wù)保證了 event 會被成功存儲起來瓶盛。比如 Flume支持在本地保存一份文件 channel 作為備份最欠,而memory channel 將event存在內(nèi)存 queue 里示罗,速度快,但丟失的話無法恢復(fù)芝硬。

五蚜点、Flume使用場景

Flume在英文中的意思是水道, 但Flume更像可以隨意組裝的消防水管拌阴,下面根據(jù)官方文檔绍绘,展示幾種Flow。

5.1迟赃、多個agent順序連接

image

可以將多個Agent順序連接起來陪拘,將最初的數(shù)據(jù)源經(jīng)過收集,存儲到最終的存儲系統(tǒng)中纤壁。這是最簡單的情況左刽,一般情況下,應(yīng)該控制這種順序連接的Agent 的數(shù)量酌媒,因為數(shù)據(jù)流經(jīng)的路徑變長了欠痴,如果不考慮failover的話,出現(xiàn)故障將影響整個Flow上的Agent收集服務(wù)秒咨。

5.2喇辽、多個Agent的數(shù)據(jù)匯聚到同一個Agent

image

這種情況應(yīng)用的場景比較多,比如要收集Web網(wǎng)站的用戶行為日志拭荤, Web網(wǎng)站為了可用性使用的負(fù)載集群模式茵臭,每個節(jié)點都產(chǎn)生用戶行為日志,可以為每 個節(jié)點都配置一個Agent來單獨收集日志數(shù)據(jù)舅世,然后多個Agent將數(shù)據(jù)最終匯聚到一個用來存儲數(shù)據(jù)存儲系統(tǒng)旦委,如HDFS上。

5.3雏亚、多級流

Flume還支持多級流缨硝,什么多級流?結(jié)合在云開發(fā)中的應(yīng)用來舉個例子罢低,當(dāng)syslog查辩, java, nginx网持、 tomcat等混合在一起的日志流開始流入一個agent 后宜岛,可以agent中將混雜的日志流分開,然后給每種日志建立一個自己的傳輸通道功舀。

image

5.4萍倡、load balance功能

image

上圖Agent1是一個路由節(jié)點,負(fù)責(zé)將Channel暫存的Event均衡到對應(yīng)的多個Sink組件上辟汰,而每個Sink組件分別連接到一個獨立的Agent上 列敲。

六阱佛、Flume核心組件

Flume主要由3個重要的組件構(gòu)成:
  1)Source: 完成對日志數(shù)據(jù)的收集,分成transtion 和 event 打入到channel之中
     Flume提供了各種source的實現(xiàn)戴而,包括Avro Source凑术、 Exce Source、 Spooling
    Directory Source所意、 NetCat Source淮逊、 Syslog Source、 Syslog TCP Source扁眯、
    Syslog UDP Source壮莹、 HTTP Source、 HDFS Source姻檀, etc命满。
  2)Channel: Flume Channel主要提供一個隊列的功能,對source提供中的數(shù)據(jù)進(jìn)行簡單的緩存绣版。
     Flume對于Channel胶台, 則提供了Memory Channel、 JDBC Chanel杂抽、 File Channel诈唬,etc
  3)Sink: Flume Sink取出Channel中的數(shù)據(jù),進(jìn)行相應(yīng)的存儲文件系統(tǒng)缩麸,數(shù)據(jù)庫铸磅,或者提交到遠(yuǎn)程服務(wù)器。
    包括HDFS sink杭朱、 Logger sink阅仔、 Avro sink彼妻、 File Roll sink误堡、 Null sink、 HBasesink锅铅, etc刃唐。

6.1羞迷、Source

Spool Source 如何使用?
  在實際使用的過程中画饥,可以結(jié)合log4j使用衔瓮,使用log4j的時候,將log4j的文件分割機制設(shè)為1分鐘一次抖甘,將文件拷貝到spool的監(jiān)控目錄热鞍。log4j有一個TimeRolling的插件,可以把log4j分割的文件到spool目錄“郑基本實現(xiàn)了實時的監(jiān)控。 Flume在傳完文件之后米奸,將會修 改文件的后綴昼接,變?yōu)?COMPLETED(后綴也可以在配置文件中靈活指定)
  Exec Source 和Spool Source 比較
  1) ExecSource可以實現(xiàn)對日志的實時收集,但是存在Flume不運行或者指令執(zhí)行出錯時悴晰,將無法收集到日志數(shù)據(jù)慢睡,無法何證日志數(shù)據(jù)的完整性。
  2) SpoolSource雖然無法實現(xiàn)實時的收集數(shù)據(jù)铡溪,但是可以使用以分鐘的方式分割文件漂辐,趨近于實時。
  3)總結(jié):如果應(yīng)用無法實現(xiàn)以分鐘切割日志文件的話棕硫,可以兩種 收集方式結(jié)合使用髓涯。

6.2、Channel

1)MemoryChannel可以實現(xiàn)高速的吞吐哈扮, 但是無法保證數(shù)據(jù)完整性
  2)MemoryRecoverChannel在官方文檔的建議上已經(jīng)建義使用FileChannel來替換纬纪。
    FileChannel保證數(shù)據(jù)的完整性與一致性。在具體配置不現(xiàn)的FileChannel時滑肉,建議FileChannel設(shè)置的目錄和程序日志文件保存的目錄設(shè)成不同的磁盤包各,以便提高效率。

6.3靶庙、Sink

Flume Sink在設(shè)置存儲數(shù)據(jù)時问畅,可以向文件系統(tǒng)中,數(shù)據(jù)庫中六荒, hadoop中儲數(shù)據(jù)护姆,在日志數(shù)據(jù)較少時,可以將數(shù)據(jù)存儲在文件系中恬吕,并且設(shè)定一定的時間間隔保存數(shù)據(jù)签则。在日志數(shù)據(jù)較多時,可以將相應(yīng)的日志數(shù)據(jù)存儲到Hadoop中铐料,便于日后進(jìn)行相應(yīng)的數(shù)據(jù)分析渐裂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钠惩,隨后出現(xiàn)的幾起案子柒凉,更是在濱河造成了極大的恐慌,老刑警劉巖篓跛,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膝捞,死亡現(xiàn)場離奇詭異,居然都是意外死亡愧沟,警方通過查閱死者的電腦和手機蔬咬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鲤遥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人林艘,你說我怎么就攤上這事盖奈。” “怎么了狐援?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵钢坦,是天一觀的道長。 經(jīng)常有香客問我啥酱,道長爹凹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任镶殷,我火速辦了婚禮禾酱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘批钠。我一直安慰自己宇植,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布埋心。 她就那樣靜靜地躺著指郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拷呆。 梳的紋絲不亂的頭發(fā)上闲坎,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音茬斧,去河邊找鬼腰懂。 笑死,一個胖子當(dāng)著我的面吹牛项秉,可吹牛的內(nèi)容都是我干的绣溜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼娄蔼,長吁一口氣:“原來是場噩夢啊……” “哼怖喻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岁诉,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锚沸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涕癣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哗蜈,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了距潘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼列。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖音比,靈堂內(nèi)的尸體忽然破棺而出唯鸭,到底是詐尸還是另有隱情,我是刑警寧澤硅确,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站明肮,受9級特大地震影響菱农,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柿估,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一循未、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秫舌,春花似錦的妖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墨缘,卻和暖如春星虹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镊讼。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工宽涌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝶棋。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓卸亮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玩裙。 傳聞我的和親對象是個殘疾皇子兼贸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 閱讀目錄(Content) 一、Flume簡介 二献酗、Flume特點 三寝受、Flume的一些核心概念 3.1、Agen...
    達(dá)微閱讀 4,727評論 0 9
  • 博客原文 翻譯作品罕偎,水平有限很澄,如有錯誤,煩請留言指正。原文請見 官網(wǎng)英文文檔 引言 概述 Apache Flume...
    rabbitGYK閱讀 11,469評論 13 34
  • title: Flume構(gòu)建日志采集系統(tǒng)date: 2018-02-03 19:45tags: [flume,k...
    溯水心生閱讀 16,134評論 3 25
  • 介紹 概述 Apache Flume是為有效收集聚合和移動大量來自不同源到中心數(shù)據(jù)存儲而設(shè)計的可分布甩苛,可靠的蹂楣,可用...
    ximengchj閱讀 3,525評論 0 13
  • 1 介紹 Flume NG是Cloudera提供的一個分布式、可靠讯蒲、可用的系統(tǒng)痊土,它能夠?qū)⒉煌瑪?shù)據(jù)源的海量日志數(shù)據(jù)進(jìn)...
    達(dá)微閱讀 1,487評論 0 0