1 介紹
Flume NG是Cloudera提供的一個分布式、可靠、可用的系統(tǒng),它能夠?qū)⒉煌瑪?shù)據(jù)源的海量日志數(shù)據(jù)進(jìn)行高效收集、聚合、移動,最后存儲到一個中心化數(shù)據(jù)存儲系統(tǒng)中。由原來的Flume OG到現(xiàn)在的Flume NG,進(jìn)行了架構(gòu)重構(gòu),并且現(xiàn)在NG版本完全不兼容原來的OG版本。經(jīng)過架構(gòu)重構(gòu)后,F(xiàn)lume NG更像是一個輕量的小工具,非常簡單,容易適應(yīng)各種方式日志收集,并支持failover和負(fù)載均衡。
Flume 使用 java 編寫,其需要運(yùn)行在 Java1.6 或更高版本之上。
2 架構(gòu)
Flume的架構(gòu)主要有一下幾個核心概念:
- Event:一個數(shù)據(jù)單元,帶有一個可選的消息頭
- Flow:Event從源點(diǎn)到達(dá)目的點(diǎn)的遷移的抽象
- Client:操作位于源點(diǎn)處的Event,將其發(fā)送到Flume Agent
- Agent:一個獨(dú)立的Flume進(jìn)程,包含組件Source、Channel、Sink
- Source:用來消費(fèi)傳遞到該組件的Event
- Channel:中轉(zhuǎn)Event的一個臨時存儲,保存有Source組件傳遞過來的Event
- Sink:從Channel中讀取并移除Event,將Event傳遞到Flow Pipeline中的下一個Agent(如果有的話)
2.1 數(shù)據(jù)流
Flume 的核心是把數(shù)據(jù)從數(shù)據(jù)源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數(shù)據(jù),待數(shù)據(jù)真正到達(dá)目的地后,刪除自己緩存的數(shù)據(jù)。
Flume 傳輸?shù)臄?shù)據(jù)的基本單位是 Event,如果是文本文件,通常是一行記錄,這也是事務(wù)的基本單位。Event 從 Source,流向 Channel,再到 Sink,本身為一個 byte 數(shù)組,并可攜帶 headers 信息。Event 代表著一個數(shù)據(jù)流的最小完整單元,從外部數(shù)據(jù)源來,向外部的目的地去。
Flume 運(yùn)行的核心是 Agent。它是一個完整的數(shù)據(jù)收集工具,含有三個核心組件,分別是 source、channel、sink。通過這些組件,Event 可以從一個地方流向另一個地方,如下圖所示。

source 可以接收外部源發(fā)送過來的數(shù)據(jù)。不同的 source,可以接受不同的數(shù)據(jù)格式。比如有目錄池(spooling directory)數(shù)據(jù)源,可以監(jiān)控指定文件夾中的新文件變化,如果目錄中有文件產(chǎn)生,就會立刻讀取其內(nèi)容。
channel 是一個存儲地,接收 source 的輸出,直到有 sink 消費(fèi)掉 channel 中的數(shù)據(jù)。channel 中的數(shù)據(jù)直到進(jìn)入到下一個channel中或者進(jìn)入終端才會被刪除。當(dāng) sink 寫入失敗后,可以自動重啟,不會造成數(shù)據(jù)丟失,因此很可靠。
sink 會消費(fèi) channel 中的數(shù)據(jù),然后送給外部源或者其他 source。如數(shù)據(jù)可以寫入到 HDFS 或者 HBase 中。
2.2 核心組件
2.2.1 source
Client端操作消費(fèi)數(shù)據(jù)的來源,F(xiàn)lume 支持 Avro,log4j,syslog 和 http post(body為json格式)??梢宰寫?yīng)用程序同已有的Source直接打交道,如AvroSource,SyslogTcpSource。也可以 寫一個 Source,以 IPC 或 RPC 的方式接入自己的應(yīng)用,Avro和 Thrift 都可以(分別有 NettyAvroRpcClient 和 ThriftRpcClient 實(shí)現(xiàn)了 RpcClient接口),其中 Avro 是默認(rèn)的 RPC 協(xié)議。具體代碼級別的 Client 端數(shù)據(jù)接入,可以參考官方手冊。
對現(xiàn)有程序改動最小的使用方式是使用是直接讀取程序原來記錄的日志文件,基本可以實(shí)現(xiàn)無縫接入,不需要對現(xiàn)有程序進(jìn)行任何改動。 對于直接讀取文件 Source,有兩種方式:
ExecSource: 以運(yùn)行 Linux 命令的方式,持續(xù)的輸出最新的數(shù)據(jù),如 tail -F 文件名 指令,在這種方式下,取的文件名必須是指定的。 ExecSource 可以實(shí)現(xiàn)對日志的實(shí)時收集,但是存在Flume不運(yùn)行或者指令執(zhí)行出錯時,將無法收集到日志數(shù)據(jù),無法保證日志數(shù)據(jù)的完整性。
SpoolSource: 監(jiān)測配置的目錄下新增的文件,并將文件中的數(shù)據(jù)讀取出來。需要注意兩點(diǎn):拷貝到 spool 目錄下的文件不可以再打開編輯;spool 目錄下不可包含相應(yīng)的子目錄。
SpoolSource 雖然無法實(shí)現(xiàn)實(shí)時的收集數(shù)據(jù),但是可以使用以分鐘的方式分割文件,趨近于實(shí)時。
如果應(yīng)用無法實(shí)現(xiàn)以分鐘切割日志文件的話, 可以兩種收集方式結(jié)合使用。 在實(shí)際使用的過程中,可以結(jié)合 log4j 使用,使用 log4j的時候,將 log4j 的文件分割機(jī)制設(shè)為1分鐘一次,將文件拷貝到spool的監(jiān)控目錄。
log4j 有一個 TimeRolling 的插件,可以把 log4j 分割文件到 spool 目錄?;緦?shí)現(xiàn)了實(shí)時的監(jiān)控。Flume 在傳完文件之后,將會修改文件的后綴,變?yōu)?.COMPLETED(后綴也可以在配置文件中靈活指定)。
Flume Source 支持的類型:
| Source類型 | 說明 |
|---|---|
| Avro Source | 支持Avro協(xié)議(實(shí)際上是Avro RPC),內(nèi)置支持 |
| Thrift Source | 支持Thrift協(xié)議,內(nèi)置支持 |
| Exec Source | 基于Unix的command在標(biāo)準(zhǔn)輸出上生產(chǎn)數(shù)據(jù) |
| JMS Source | 從JMS系統(tǒng)(消息、主題)中讀取數(shù)據(jù),ActiveMQ已經(jīng)測試過 |
| Spooling Directory Source | 監(jiān)控指定目錄內(nèi)數(shù)據(jù)變更 |
| Twitter 1% firehose Source | 通過API持續(xù)下載Twitter數(shù)據(jù),試驗(yàn)性質(zhì) |
| Netcat Source | 監(jiān)控某個端口,將流經(jīng)端口的每一個文本行數(shù)據(jù)作為Event輸入 |
| Sequence Generator Source | 序列生成器數(shù)據(jù)源,生產(chǎn)序列數(shù)據(jù) |
| Syslog Sources | 讀取syslog數(shù)據(jù),產(chǎn)生Event,支持UDP和TCP兩種協(xié)議 |
| HTTP Source | 基于HTTP POST或GET方式的數(shù)據(jù)源,支持JSON、BLOB表示形式 |
| Legacy Sources | 兼容老的Flume OG中Source(0.9.x版本) |
2.2.2 Channel
當(dāng)前有幾個 channel 可供選擇,分別是 Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比較常見的是前三種 channel。
MemoryChannel 可以實(shí)現(xiàn)高速的吞吐,但是無法保證數(shù)據(jù)的完整性。
MemoryRecoverChannel 在官方文檔的建議上已經(jīng)建義使用FileChannel來替換。
FileChannel保證數(shù)據(jù)的完整性與一致性。在具體配置FileChannel時,建議FileChannel設(shè)置的目錄和程序日志文件保存的目錄設(shè)成不同的磁盤,以便提高效率。
File Channel 是一個持久化的隧道(channel),它持久化所有的事件,并將其存儲到磁盤中。因此,即使 Java 虛擬機(jī)當(dāng)?shù)簦蛘卟僮飨到y(tǒng)崩潰或重啟,再或者事件沒有在管道中成功地傳遞到下一個代理(agent),這一切都不會造成數(shù)據(jù)丟失。Memory Channel 是一個不穩(wěn)定的隧道,其原因是由于它在內(nèi)存中存儲所有事件。如果 java 進(jìn)程死掉,任何存儲在內(nèi)存的事件將會丟失。另外,內(nèi)存的空間收到 RAM大小的限制,而 File Channel 這方面是它的優(yōu)勢,只要磁盤空間足夠,它就可以將所有事件數(shù)據(jù)存儲到磁盤上。
Flume Channel 支持的類型:
| Channel類型 | 說明 |
|---|---|
| Memory Channel | Event數(shù)據(jù)存儲在內(nèi)存中 |
| JDBC Channel | Event數(shù)據(jù)存儲在持久化存儲中,當(dāng)前Flume Channel內(nèi)置支持Derby |
| File Channel | Event數(shù)據(jù)存儲在磁盤文件中 |
| Spillable Memory Channel | Event數(shù)據(jù)存儲在內(nèi)存中和磁盤上,當(dāng)內(nèi)存隊(duì)列滿了,會持久化到磁盤文件(當(dāng)前試驗(yàn)性的,不建議生產(chǎn)環(huán)境使用) |
| Pseudo Transaction Channel | 測試用途 |
| Custom Channel | 自定義Channel實(shí)現(xiàn) |
2.2.3 sink
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ù)分析。
Flume Sink支持的類型
| Sink類型 | 說明 |
|---|---|
| HDFS Sink | 數(shù)據(jù)寫入HDFS |
| Logger Sink | 數(shù)據(jù)寫入日志文件 |
| Avro Sink | 數(shù)據(jù)被轉(zhuǎn)換成Avro Event,然后發(fā)送到配置的RPC端口上 |
| Thrift Sink | 數(shù)據(jù)被轉(zhuǎn)換成Thrift Event,然后發(fā)送到配置的RPC端口上 |
| IRC Sink | 數(shù)據(jù)在IRC上進(jìn)行回放 |
| File Roll Sink | 存儲數(shù)據(jù)到本地文件系統(tǒng) |
| Null Sink | 丟棄到所有數(shù)據(jù) |
| HBase Sink | 數(shù)據(jù)寫入HBase數(shù)據(jù)庫 |
| Morphline Solr Sink | 數(shù)據(jù)發(fā)送到Solr搜索服務(wù)器(集群) |
| ElasticSearch Sink | 數(shù)據(jù)發(fā)送到Elastic Search搜索服務(wù)器(集群) |
| Kite Dataset Sink | 寫數(shù)據(jù)到Kite Dataset,試驗(yàn)性質(zhì)的 |
| Custom Sink | 自定義Sink實(shí)現(xiàn) |
2.3 可靠性
Flume 的核心是把數(shù)據(jù)從數(shù)據(jù)源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數(shù)據(jù),待數(shù)據(jù)真正到達(dá)目的地后,刪除自己緩存的數(shù)據(jù)。
Flume 使用事務(wù)性的方式保證傳送Event整個過程的可靠性。Sink 必須在 Event 被存入 Channel 后,或者,已經(jīng)被傳達(dá)到下一站agent里,又或者,已經(jīng)被存入外部數(shù)據(jù)目的地之后,才能把 Event 從 Channel 中 remove 掉。這樣數(shù)據(jù)流里的 event 無論是在一個 agent 里還是多個 agent 之間流轉(zhuǎn),都能保證可靠,因?yàn)橐陨系氖聞?wù)保證了 event 會被成功存儲起來。而 Channel 的多種實(shí)現(xiàn)在可恢復(fù)性上有不同的保證。也保證了 event 不同程度的可靠性。比如 Flume 支持在本地保存一份文件 channel 作為備份,而memory channel 將 event 存在內(nèi)存 queue 里,速度快,但丟失的話無法恢復(fù)。
2.4 可恢復(fù)性
主要就是通過channal這一組件來進(jìn)行恢復(fù)的。
The events are staged in the channel, which manages recovery from failure. Flume supports a durable file channel which is backed by the local file system. There’s also a memory channel which simply stores the events in an in-memory queue, which is faster but any events still left in the memory channel when an agent process dies can’t be recovered.
3 Flume OG和Flume NG的區(qū)別
3.1 FLUM OG 的特點(diǎn)
FLUM OG 有三種角色的節(jié)點(diǎn),代理節(jié)點(diǎn)(agent)、收集節(jié)點(diǎn)(collector)、主節(jié)點(diǎn)(master)。
agent 從各個數(shù)據(jù)源收集日志數(shù)據(jù),將收集到的數(shù)據(jù)集中到 collector,然后由收集節(jié)點(diǎn)匯總存入 hdfs。master 負(fù)責(zé)管理 agent,collector 的活動。
agent、collector 都稱為 node,node 的角色根據(jù)配置的不同分為 logical node(邏輯節(jié)點(diǎn))、physical node(物理節(jié)點(diǎn))。對 logical nodes 和 physical nodes 的區(qū)分、配置、使用一直以來都是使用者最頭疼的地方。
agent、collector 由 source、sink 組成,代表在當(dāng)前節(jié)點(diǎn)數(shù)據(jù)是從 source 傳送到 sink。

3.2 FLUM NG 的特點(diǎn)
NG 只有一種角色的節(jié)點(diǎn):代理節(jié)點(diǎn)(agent)。
沒有 collector、master 節(jié)點(diǎn)。這是核心組件最核心的變化。
去除了 physical nodes、logical nodes 的概念和相關(guān)內(nèi)容。
agent 節(jié)點(diǎn)的組成也發(fā)生了變化。如圖 4,NG agent 由 source、sink、channel 組成。

3.3 改進(jìn)
大規(guī)模的調(diào)整,核心組件的數(shù)目由 7 刪減到 4。由于 Flume 的使用涉及到眾多因素,如 avro、thrift、hdfs、jdbc、zookeeper 等,而這些組件和 Flume 的整合都需要關(guān)聯(lián)到所有組件。所以核心組件的改革對整個 Flume 的使用影響深遠(yuǎn):
大大降低了對用戶的要求,如核心組件的變化使得 Flume 的穩(wěn)定使用不再依賴 zookeeper,用戶無需去搭建 zookeeper 集群;另外用戶也不再糾結(jié)于 OG 中的模糊概念(尤其是 physical nodes、logical nodes,agent、collector)。
有利于 Flume 和其他技術(shù)、hadoop 周邊組件的整合,比如在 NG 版本中,F(xiàn)lume 輕松實(shí)現(xiàn)了和 jdbc、hbase 的集成。
將 OG 版本中復(fù)雜、大規(guī)模、不穩(wěn)定的標(biāo)簽移除,F(xiàn)lume 實(shí)現(xiàn)了向靈活、輕便的轉(zhuǎn)變,而且在功能上更加強(qiáng)大、可擴(kuò)展性更高,這一點(diǎn)主要表現(xiàn)在用戶使用 Flume 搭建日志收集集群的過程中。
總結(jié)
這篇整理的文章,基本上是從各個地方拼接而來的,按照我自己的思路略微整理了一下~
參考
- http://flume.apache.org/
- http://flume.apache.org/FlumeUserGuide.html
- http://flume.apache.org/FlumeDeveloperGuide.html
- http://blog.javachen.com/2014/07/22/flume-ng.html
- https://flume.apache.org/FlumeUserGuide.html
- http://tech.meituan.com/mt-log-system-arch.html
- http://www.ibm.com/developerworks/cn/data/library/bd-1404flumerevolution/index.html
轉(zhuǎn)自:https://blog.csdn.net/zhaodedong/article/details/52541688