閱讀目錄(Content)
前言
最近有一點(diǎn)浮躁,遇到了很多不該發(fā)生在我身上的事情宣鄙。沒有袍镀,忘掉這些。好好的學(xué)習(xí)冻晤,才是正道苇羡!
一、Flume簡(jiǎn)介
flume 作為 cloudera 開發(fā)的實(shí)時(shí)日志收集系統(tǒng)鼻弧,受到了業(yè)界的認(rèn)可與廣泛應(yīng)用设江。Flume 初始的發(fā)行版本目前被統(tǒng)稱為 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參考資料
官方網(wǎng)站: http://flume.apache.org/
用戶文檔: http://flume.apache.org/FlumeUserGuide.html
開發(fā)文檔: http://flume.apache.org/FlumeDeveloperGuide.html
二、Flume特點(diǎn)
flume是一個(gè)分布式丘喻、可靠脯宿、和高可用的海量日志采集、聚合和傳輸?shù)南到y(tǒng)泉粉。支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方连霉,用于收集數(shù)據(jù);同時(shí),F(xiàn)lume提供對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理嗡靡,
并寫到各種數(shù)據(jù)接受方(比如文本跺撼、HDFS、Hbase等)的能力 讨彼。
flume的數(shù)據(jù)流由事件(Event)貫穿始終歉井。事件是Flume的基本數(shù)據(jù)單位,它攜帶日志數(shù)據(jù)(字節(jié)數(shù)組形式)并且攜帶有頭信息点骑,這些Event由Agent外部的Source生成酣难,當(dāng)
Source捕獲事件后會(huì)進(jìn)行特定的格式化,然后Source會(huì)把事件推入(單個(gè)或多個(gè))Channel中黑滴。你可以把Channel看作是一個(gè)緩沖區(qū)憨募,它將保存事件直到Sink處理完該事件。
Sink負(fù)責(zé)持久化日志或者把事件推向另一個(gè)Source袁辈。
1)flume的可靠性
當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí)菜谣,日志能夠被傳送到其他節(jié)點(diǎn)上而不會(huì)丟失。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,事件持久化在本地文件系統(tǒng)里(性能較差)帜消。
三棠枉、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.1、Agent結(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.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的組件,大家可以將它看做一個(gè)數(shù)據(jù)的緩沖區(qū)(數(shù)據(jù)隊(duì)列)钓株,它可以將事件暫存到內(nèi)存中也可以持久化到本地磁盤上实牡, 直
到Sink處理完該事件。介紹兩個(gè)較為常用的Channel轴合, MemoryChannel和FileChannel创坞。
Channel類型:
3.4、Sink
Sink從Channel中取出事件受葛,然后將數(shù)據(jù)發(fā)到別處摆霉,可以向文件系統(tǒng)、數(shù)據(jù)庫奔坟、 hadoop存數(shù)據(jù)携栋, 也可以是其他agent的Source。在日志數(shù)據(jù)較少時(shí)咳秉,可
以將數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)中婉支,并且設(shè)定一定的時(shí)間間隔保存數(shù)據(jù)。
Sink類型:
四澜建、Flume攔截器向挖、數(shù)據(jù)流以及可靠性
4.1蝌以、Flume攔截器
當(dāng)我們需要對(duì)數(shù)據(jù)進(jìn)行過濾時(shí),除了我們?cè)赟ource何之、 Channel和Sink進(jìn)行代碼修改之外跟畅, Flume為我們提供了攔截器,攔截器也是chain形式的溶推。
攔截器的位置在Source和Channel之間徊件,當(dāng)我們?yōu)镾ource指定攔截器后,我們?cè)跀r截器中會(huì)得到event蒜危,根據(jù)需求我們可以對(duì)event進(jìn)行保留還是
拋棄虱痕,拋棄的數(shù)據(jù)不會(huì)進(jìn)入Channel中纲熏。
4.2匈辱、Flume數(shù)據(jù)流
1)Flume 的核心是把數(shù)據(jù)從數(shù)據(jù)源收集過來,再送到目的地珍促。為了保證輸送一定成功响委,在送到目的地之前新思,會(huì)先緩存數(shù)據(jù),待數(shù)據(jù)真正到達(dá)目的地后赘风,
刪除自己緩存的數(shù)據(jù)表牢。
2) Flume 傳輸?shù)臄?shù)據(jù)的基本單位是 Event,如果是文本文件贝次,通常是一行記錄,這也是事務(wù)的基本單位彰导。 Event 從 Source蛔翅,流向 Channel,再到 Sink位谋,
本身為一個(gè) byte 數(shù)組山析,并可攜帶 headers 信息。 Event 代表著一個(gè)數(shù)據(jù)流的最小完整單元掏父,從外部數(shù)據(jù)源來笋轨,向外部的目的地去。
值得注意的是赊淑,F(xiàn)lume提供了大量?jī)?nèi)置的Source爵政、Channel和Sink類型。不同類型的Source,Channel和Sink可以自由組合陶缺。組合方式基于用戶設(shè)置的配置文件钾挟,非常靈活。
比如:Channel可以把事件暫存在內(nèi)存里饱岸,也可以持久化到本地硬盤上掺出。Sink可以把日志寫入HDFS, HBase徽千,甚至是另外一個(gè)Source等等。Flume支持用戶建立多級(jí)流汤锨,
也就是說双抽,多個(gè)agent可以協(xié)同工作,并且支持Fan-in闲礼、Fan-out牍汹、Contextual Routing、Backup Routes位仁,這也正是Flume強(qiáng)大之處柑贞。如下圖所示:
4.3聂抢、Flume可靠性
Flume 使用事務(wù)性的方式保證傳送Event整個(gè)過程的可靠性钧嘶。 Sink 必須在Event 被存入 Channel 后,或者琳疏,已經(jīng)被傳達(dá)到下一站agent里有决,又或者,
已經(jīng)被存入外部數(shù)據(jù)目的地之后空盼,才能把 Event 從 Channel 中 remove 掉书幕。這樣數(shù)據(jù)流里的 event 無論是在一個(gè) agent 里還是多個(gè) agent 之間流轉(zhuǎn),
都能保證可靠揽趾,因?yàn)橐陨系氖聞?wù)保證了 event 會(huì)被成功存儲(chǔ)起來台汇。比如 Flume支持在本地保存一份文件 channel 作為備份,而memory channel 將
event存在內(nèi)存 queue 里篱瞎,速度快苟呐,但丟失的話無法恢復(fù)。
五俐筋、Flume使用場(chǎng)景
Flume在英文中的意思是水道牵素, 但Flume更像可以隨意組裝的消防水管,下面根據(jù)官方文檔澄者,展示幾種Flow笆呆。
5.1、多個(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ù)测蘑。
5.2、多個(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上产雹。
5.3诫惭、多級(jí)流
Flume還支持多級(jí)流,什么多級(jí)流蔓挖?結(jié)合在云開發(fā)中的應(yīng)用來舉個(gè)例子夕土,當(dāng)syslog, java瘟判, nginx怨绣、 tomcat等混合在一起的日志流開始流入一個(gè)agent 后,可以agent中將混雜的日志流分開拷获,然后給每種日志建立一個(gè)自己的傳輸通道篮撑。
5.4、load balance功能
上圖Agent1是一個(gè)路由節(jié)點(diǎn)匆瓜,負(fù)責(zé)將Channel暫存的Event均衡到對(duì)應(yīng)的多個(gè)Sink組件上赢笨,而每個(gè)Sink組件分別連接到一個(gè)獨(dú)立的Agent上 。
六驮吱、Flume核心組件
Flume主要由3個(gè)重要的組件構(gòu)成:
1)Source: 完成對(duì)日志數(shù)據(jù)的收集茧妒,分成transtion 和 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皂岔。
2)Channel: Flume Channel主要提供一個(gè)隊(duì)列的功能,對(duì)source提供中的數(shù)據(jù)進(jìn)行簡(jiǎn)單的緩存展姐。
Flume對(duì)于Channel躁垛, 則提供了Memory Channel剖毯、 JDBC Chanel、 File Channel教馆,etc
3)Sink: Flume Sink取出Channel中的數(shù)據(jù)逊谋,進(jìn)行相應(yīng)的存儲(chǔ)文件系統(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 如何使用窟赏?
在實(shí)際使用的過程中,可以結(jié)合log4j使用箱季,使用log4j的時(shí)候涯穷,將log4j的文件分割機(jī)制設(shè)為1分鐘一次,將文件拷貝到spool的監(jiān)控目錄藏雏。
log4j有一個(gè)TimeRolling的插件拷况,可以把log4j分割的文件到spool目錄【蚺梗基本實(shí)現(xiàn)了實(shí)時(shí)的監(jiān)控赚瘦。 Flume在傳完文件之后,將會(huì)修 改文
件的后綴奏寨,變?yōu)?COMPLETED(后綴也可以在配置文件中靈活指定)
Exec Source 和Spool Source 比較
1) ExecSource可以實(shí)現(xiàn)對(duì)日志的實(shí)時(shí)收集起意,但是存在Flume不運(yùn)行或者指令執(zhí)行出錯(cuò)時(shí),將無法收集到日志數(shù)據(jù)病瞳,無法何證日志數(shù)據(jù)
的完整性揽咕。
2) SpoolSource雖然無法實(shí)現(xiàn)實(shí)時(shí)的收集數(shù)據(jù),但是可以使用以分鐘的方式分割文件套菜,趨近于實(shí)時(shí)亲善。
3)總結(jié):如果應(yīng)用無法實(shí)現(xiàn)以分鐘切割日志文件的話,可以兩種 收集方式結(jié)合使用逗柴。
6.2蛹头、Channel
1)MemoryChannel可以實(shí)現(xiàn)高速的吞吐, 但是無法保證數(shù)據(jù)完整性
2)MemoryRecoverChannel在官方文檔的建議上已經(jīng)建義使用FileChannel來替換。
FileChannel保證數(shù)據(jù)的完整性與一致性渣蜗。在具體配置不現(xiàn)的FileChannel時(shí)屠尊,建議FileChannel設(shè)置的目錄和程序日志文件保存的目錄
設(shè)成不同的磁盤,以便提高效率袍睡。
6.3知染、Sink
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ù)分析。
轉(zhuǎn)自:https://www.cnblogs.com/zhangyinhua/p/7803486.html