一吟税、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 可以從一個地方流向另一個地方细疚,如下圖所示。
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胃榕。
source類型:
3.3盛险、Channel
Channel是連接Source和Sink的組件,大家可以將它看做一個數(shù)據(jù)的緩沖區(qū)(數(shù)據(jù)隊列),它可以將事件暫存到內(nèi)存中也可以持久化到本地磁盤上苦掘, 直
到Sink處理完該事件换帜。介紹兩個較為常用的Channel, MemoryChannel和FileChannel鹤啡。
Channel類型:
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ù)狂丝。
Sink類型:
四、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中。
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ù)源來,向外部的目的地去姓惑。
值得注意的是褐奴,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強大之處鳍刷。如下圖所示:
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順序連接
可以將多個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
這種情況應(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中將混雜的日志流分開,然后給每種日志建立一個自己的傳輸通道功舀。
5.4萍倡、load balance功能
上圖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ù)分析渐裂。