Apache Flume 入門教程

概要

Apache Flume 是一個分布式痴腌,可靠且可用的系統(tǒng)搬味,用于有效地從許多不同的源收集期奔、聚合和移動大量日志數(shù)據(jù)到一個集中式的數(shù)據(jù)存儲區(qū)臼膏。

Flume 的使用不只限于日志數(shù)據(jù)。因為數(shù)據(jù)源可以定制张症,flume 可以被用來傳輸大量事件數(shù)據(jù)仓技,這些數(shù)據(jù)不僅僅包括網(wǎng)絡通訊數(shù)據(jù)、社交媒體產(chǎn)生的數(shù)據(jù)俗他、電子郵件信息等等脖捻。

Apache Flume 是 Apache 基金會的頂級項目,在加入 Apache 之前由 cloudera 公司開發(fā)以及維護兆衅。
Apache Flume 目前有兩種主版本: 0.9.x 和 1.x地沮。 其中 0.9.x 是歷史版本,我們稱之為 Flume OG(original generation)羡亩。2011 年 10 月 22 號摩疑,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件畏铆、核心配置以及代碼架構雷袋,重構后的版本統(tǒng)稱為 Flume NG(next generation),也就是這里說的 1.x 版本辞居。

本文主要對 Flume 的作用以及核心概念進行介紹楷怒,通過本文讀者可以大致了解 flume 的使用場景、核心組件以及各組件的運行機制瓦灶。關于如何配置 flume 以適應不同場景鸠删,我們會在另一篇文章中詳細解讀。

架構

數(shù)據(jù)流模型

一個 Flume 事件被定義為一個數(shù)據(jù)流單元贼陶。Flume agent 其實是一個 JVM 進程刃泡,該進程中包含完成任務所需要的各個組件,其中最核心的三個組件是 Source碉怔、Chanel 以及 Slink烘贴。


Source 消費由外部源(如Web服務器)傳遞給它的事件。外部源以一定的格式發(fā)送數(shù)據(jù)給 Flume撮胧,這個格式的定義由目標 Flume Source 來確定桨踪。例如,一個 Avro Flume source 可以從 Avro(Avro是一個基于二進制數(shù)據(jù)傳輸?shù)母咝阅苤虚g件趴樱,是 hadoop 的一個子項目) 客戶端接收 Avro 事件馒闷,也可以從其他 Flume agents (該 Flume agents 有 Avro sink)接收 Avro 事件。 同樣叁征,我們可以定義一個 Thrift Flume Source 接收來自 Thrift Sink纳账、Flume Thrift RPC 客戶端或者其他任意客戶端(該客戶端可以使用任何語言編寫,只要滿足 Flume thrift 協(xié)議)的事件捺疼。

channel 可以理解為緩存區(qū)疏虫,用來保存從 Source 那拿到的數(shù)據(jù),直到 Flume slink 將數(shù)據(jù)消費啤呼。file chanel 是一個例子卧秘,它將數(shù)據(jù)保存在文件系統(tǒng)中(當然你可以將數(shù)據(jù)放在內(nèi)存中)。

slink 從 channel 消費完數(shù)據(jù)就會將數(shù)據(jù)從 channel 中清除官扣,隨后將數(shù)據(jù)放到外部存儲系統(tǒng)例如 HDFS (使用 Flume HDFS sink)或發(fā)送到其他 Flume agent 的 source 中翅敌。不管是 Source 還是 Slink 都是異步發(fā)送和消費數(shù)據(jù)。

復雜的流

Flume 允許用戶構建一個復雜的數(shù)據(jù)流惕蹄,比如數(shù)據(jù)流經(jīng)多個 agent 最終落地蚯涮。It also allows fan-in and fan-out flows, contextual routing and backup routes (fail-over) for failed hops.

可靠性

事件被存儲在每個 agent 的 channel 中。隨后這些事件會發(fā)送到流中的下一個 agent 或者設備存儲中(例如 HDFS)卖陵。只有事件已經(jīng)被存儲在下一個 agent 的 channel 中 或設備存儲中時遭顶,當前 channel 才會清除該事件。這種機制保證了流在端到端的傳輸中具有可靠性泪蔫。

Flume使用事務方法(transactional approach)來保證事件的可靠傳輸棒旗。在 source 和 slink 中,事件的存儲以及恢復作為事務進行封裝撩荣,存放事件到 channel 中以及從 channel 中拉取事件均是事務性的铣揉。這保證了流中的事件在節(jié)點之間傳輸是可靠的。

可恢復

事件在 channel 中進行婿滓,該 channel 負責保障事件從故障中恢復老速。Flume 支持一個由本地文件系統(tǒng)支持的持久化文件(文件模式:channel.type = "file") channel。同樣也支持內(nèi)存模式(channel.type = "memmory"),即將事件保存在內(nèi)存隊列中凸主。顯然橘券,內(nèi)存模式相對與文件模型性能會更好,但是當 agent 進程不幸掛掉時卿吐,內(nèi)存模式下存儲在 channel 中的事件將丟失旁舰,無法進行恢復。

構建

構建一個 agent

Flume agent 的配置保存在一個本地配置文件中嗡官。它是一個 text 文本箭窜,java 程序可以直接方便地讀取其屬性⊙苄龋可以在同一配置文件中指定一個或多個 agent 的配置磺樱。配置文件指定了 agnet 中每個 source纳猫、channel、slink 的屬性竹捉,以及三者如何組合形成數(shù)據(jù)流芜辕。

配置單個組件

流中的每一個組件(source、channel块差、slink)都有自己的名稱侵续、類型以及一系列配置屬性。例如憨闰,一個 Avro source 需要配置 hostname (或者 IP 地址)以及端口號來接收數(shù)據(jù)状蜗。一個內(nèi)存模式 channel 可以有最大隊列長度的屬性("capacity": channel 中最大容納多少事件)。一個 HDFS slink 則需要知道文件系統(tǒng)的 URL(hdfs://****)鹉动、文件落地的路徑轧坎、文件回滾的評率("hdfs.rollInterval": 每隔多少秒將零時文件回滾成最終文件保存到 HDFS 中)。所有這些關于各個組件的屬性需要在配置文件中進行指定训裆。

將各個部分組合起來

Agent 需要知道加載哪些組件以及如何將這些組件組合起來形成數(shù)據(jù)流眶根。Flume 指定每個組件的名稱(source、channel边琉、slink)属百,同時明確地告訴我們 channel 與 哪些 source 和 slink 連接,這樣各個組件就能組合起來变姨。例如族扰,一個叫 "avroWeb" 的 source 通過一個叫 "file-channel" 的channel 將事件傳遞到 HDFS sink 中。配置文件需包含這些組件的名稱以及組合關系定欧。

開始一個 agent

我們可以通過 Flume bin 目錄下的腳本文件(flume-ng)來啟動 agent渔呵。在命令后面,你需要指定 agent 的名稱砍鸠、配置文件:

$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template

運行以上命令扩氢,agent 將會按照配置文件里描述的方式來運行組件。

一個簡單的示例

這里爷辱,我們給出一個配置文件的示例录豺,該示例為 flume 單節(jié)點部署的配置方式。

# example.conf: A single-node Flume configuration

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444

# Describe the sink
a1.sinks.k1.type = logger

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

看看這個配置文件饭弓,我們可以發(fā)現(xiàn)這個 agent 的名稱是 a1双饥。其中該 agent 的 source 監(jiān)聽 44444 端口。channel 采用內(nèi)存模式弟断,而 slink 直接輸出數(shù)據(jù)到 控制臺上(logger)咏花。配置文件指定了各個組件的名稱,并描述了它們的類型以及其他屬性阀趴。當然昏翰,一個配置文件可以配置多個 agent 屬性苍匆,當希望運行指定 agent 進程時,我們需要在命令行中顯示的給出該 agent 的名稱:

$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console

注意棚菊,在實際部署中锉桑,我們通常會包含一個選項: --conf-file = <conf-dir>。 <conf-dir> 目錄將包含一個 shell 腳本 flume-env.sh 以及一個 log4j 屬性文件窍株。 在這個例子中,我們傳遞一個 Java 選項來強制 Flume 將日志輸出到控制臺攻柠。

下面的例子中球订,我們可以遠程 telnet 訪問 44444 端口來向 agent 發(fā)送數(shù)據(jù):

$ telnet localhost 44444
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
Hello world! <ENTER>
OK

agent 進程的控制臺將會打印通過 telnet 發(fā)送的數(shù)據(jù):

12/06/19 15:32:19 INFO source.NetcatSource: Source starting
12/06/19 15:32:19 INFO source.NetcatSource: Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444]
12/06/19 15:32:34 INFO sink.LoggerSink: Event: { headers:{} body: 48 65 6C 6C 6F 20 77 6F 72 6C 64 21 0D          Hello world!. }

完成這一步,恭喜你已經(jīng)成功地配置以及部署一個 flume agent瑰钮。

數(shù)據(jù)獲让疤病(Data ingestion)

Flume 支持許多從外部源獲取數(shù)據(jù)的機制。

RPC

一個 Avro client 可以使用 rpc 機制發(fā)送指定的文件到 source 中:

$ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10

上面的命令會將 /usr/logs/log.10 發(fā)送到監(jiān)聽 41414 端口的 source 上浪谴。

網(wǎng)絡流(Network streams)

Flume 支持從一些流行的日志流中讀取數(shù)據(jù)开睡,例如:

  • Avro
  • Thrift
  • Syslog
  • Netcat

設置多 agent 流(Setting multi-agent flow)


Flume 支持將多個 agent 串聯(lián)起來,完成這項操作苟耻。

合并(Consolidation)

當需要從眾多主機上收集日志信息時篇恒,我們可以在每臺主機上部署 agent,這些主機的 slink 均連接到最終日志落地主機的 source 上。落地主機將所有數(shù)據(jù)進行組合凶杖,落地到 HDFS 上胁艰。


掃碼關注微信公眾號"Kooola大數(shù)據(jù)",聊人生|聊技術
掃碼關注微信公眾號"Kooola大數(shù)據(jù)"智蝠,聊人生|聊技術
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腾么,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杈湾,更是在濱河造成了極大的恐慌解虱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漆撞,死亡現(xiàn)場離奇詭異殴泰,居然都是意外死亡,警方通過查閱死者的電腦和手機叫挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門艰匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抹恳,你說我怎么就攤上這事员凝。” “怎么了奋献?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵健霹,是天一觀的道長旺上。 經(jīng)常有香客問我,道長糖埋,這世上最難降的妖魔是什么宣吱? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮瞳别,結果婚禮上征候,老公的妹妹穿的比我還像新娘。我一直安慰自己祟敛,他們只是感情好疤坝,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馆铁,像睡著了一般跑揉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埠巨,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天历谍,我揣著相機與錄音,去河邊找鬼辣垒。 笑死望侈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的勋桶。 我是一名探鬼主播甜无,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哥遮!你這毒婦竟也來了岂丘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眠饮,失蹤者是張志新(化名)和其女友劉穎奥帘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪召,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡寨蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扔茅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已旧。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖召娜,靈堂內(nèi)的尸體忽然破棺而出运褪,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布秸讹,位于F島的核電站檀咙,受9級特大地震影響,放射性物質發(fā)生泄漏璃诀。R本人自食惡果不足惜弧可,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劣欢。 院中可真熱鬧棕诵,春花似錦、人聲如沸凿将。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丸相。三九已至,卻和暖如春彼棍,著一層夾襖步出監(jiān)牢的瞬間灭忠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工座硕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弛作,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓华匾,卻偏偏與公主長得像映琳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜘拉,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

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

  • 博客原文 翻譯作品萨西,水平有限,如有錯誤旭旭,煩請留言指正谎脯。原文請見 官網(wǎng)英文文檔 引言 概述 Apache Flume...
    rabbitGYK閱讀 11,481評論 13 34
  • 介紹 概述 Apache Flume是為有效收集聚合和移動大量來自不同源到中心數(shù)據(jù)存儲而設計的可分布,可靠的持寄,可用...
    ximengchj閱讀 3,525評論 0 13
  • 閱讀目錄(Content) 一源梭、Flume簡介 二、Flume特點 三稍味、Flume的一些核心概念 3.1废麻、Agen...
    達微閱讀 4,732評論 0 9
  • 一、Flume簡介 flume 作為 cloudera 開發(fā)的實時日志收集系統(tǒng)模庐,受到了業(yè)界的認可與廣泛應用烛愧。Flu...
    superxcp閱讀 946評論 0 2
  • 介紹 概述 Apache Flume是一個分布式的,可靠的,高可用的系統(tǒng)屑彻,用于高效地從多個不同的數(shù)據(jù)源收集验庙,匯總及...
    steanxy閱讀 1,070評論 0 1