Apache Flume 入門(mén)教程

概要

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

Flume 的使用不只限于日志數(shù)據(jù)。因?yàn)閿?shù)據(jù)源可以定制,flume 可以被用來(lái)傳輸大量事件數(shù)據(jù),這些數(shù)據(jù)不僅僅包括網(wǎng)絡(luò)通訊數(shù)據(jù)、社交媒體產(chǎn)生的數(shù)據(jù)、電子郵件信息等等。

Apache Flume 是 Apache 基金會(huì)的頂級(jí)項(xiàng)目,在加入 Apache 之前由 cloudera 公司開(kāi)發(fā)以及維護(hù)。
Apache Flume 目前有兩種主版本: 0.9.x 和 1.x。 其中 0.9.x 是歷史版本,我們稱之為 Flume OG(original generation)。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),也就是這里說(shuō)的 1.x 版本。

本文主要對(duì) Flume 的作用以及核心概念進(jìn)行介紹,通過(guò)本文讀者可以大致了解 flume 的使用場(chǎng)景、核心組件以及各組件的運(yùn)行機(jī)制。關(guān)于如何配置 flume 以適應(yīng)不同場(chǎng)景,我們會(huì)在另一篇文章中詳細(xì)解讀。

架構(gòu)

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

一個(gè) Flume 事件被定義為一個(gè)數(shù)據(jù)流單元。Flume agent 其實(shí)是一個(gè) JVM 進(jìn)程,該進(jìn)程中包含完成任務(wù)所需要的各個(gè)組件,其中最核心的三個(gè)組件是 Source、Chanel 以及 Slink。


Source 消費(fèi)由外部源(如Web服務(wù)器)傳遞給它的事件。外部源以一定的格式發(fā)送數(shù)據(jù)給 Flume,這個(gè)格式的定義由目標(biāo) Flume Source 來(lái)確定。例如,一個(gè) Avro Flume source 可以從 Avro(Avro是一個(gè)基于二進(jìn)制數(shù)據(jù)傳輸?shù)母咝阅苤虚g件,是 hadoop 的一個(gè)子項(xiàng)目) 客戶端接收 Avro 事件,也可以從其他 Flume agents (該 Flume agents 有 Avro sink)接收 Avro 事件。 同樣,我們可以定義一個(gè) Thrift Flume Source 接收來(lái)自 Thrift Sink、Flume Thrift RPC 客戶端或者其他任意客戶端(該客戶端可以使用任何語(yǔ)言編寫(xiě),只要滿足 Flume thrift 協(xié)議)的事件。

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

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

復(fù)雜的流

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

可靠性

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

Flume使用事務(wù)方法(transactional approach)來(lái)保證事件的可靠傳輸。在 source 和 slink 中,事件的存儲(chǔ)以及恢復(fù)作為事務(wù)進(jìn)行封裝,存放事件到 channel 中以及從 channel 中拉取事件均是事務(wù)性的。這保證了流中的事件在節(jié)點(diǎn)之間傳輸是可靠的。

可恢復(fù)

事件在 channel 中進(jìn)行,該 channel 負(fù)責(zé)保障事件從故障中恢復(fù)。Flume 支持一個(gè)由本地文件系統(tǒng)支持的持久化文件(文件模式:channel.type = "file") channel。同樣也支持內(nèi)存模式(channel.type = "memmory"),即將事件保存在內(nèi)存隊(duì)列中。顯然,內(nèi)存模式相對(duì)與文件模型性能會(huì)更好,但是當(dāng) agent 進(jìn)程不幸掛掉時(shí),內(nèi)存模式下存儲(chǔ)在 channel 中的事件將丟失,無(wú)法進(jìn)行恢復(fù)。

構(gòu)建

構(gòu)建一個(gè) agent

Flume agent 的配置保存在一個(gè)本地配置文件中。它是一個(gè) text 文本,java 程序可以直接方便地讀取其屬性。可以在同一配置文件中指定一個(gè)或多個(gè) agent 的配置。配置文件指定了 agnet 中每個(gè) source、channel、slink 的屬性,以及三者如何組合形成數(shù)據(jù)流。

配置單個(gè)組件

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

將各個(gè)部分組合起來(lái)

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

開(kāi)始一個(gè) agent

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

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

運(yùn)行以上命令,agent 將會(huì)按照配置文件里描述的方式來(lái)運(yùn)行組件。

一個(gè)簡(jiǎn)單的示例

這里,我們給出一個(gè)配置文件的示例,該示例為 flume 單節(jié)點(diǎn)部署的配置方式。

# 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

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

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

注意,在實(shí)際部署中,我們通常會(huì)包含一個(gè)選項(xiàng): --conf-file = <conf-dir>。 <conf-dir> 目錄將包含一個(gè) shell 腳本 flume-env.sh 以及一個(gè) log4j 屬性文件。 在這個(gè)例子中,我們傳遞一個(gè) Java 選項(xiàng)來(lái)強(qiáng)制 Flume 將日志輸出到控制臺(tái)。

下面的例子中,我們可以遠(yuǎn)程 telnet 訪問(wèn) 44444 端口來(lái)向 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 進(jìn)程的控制臺(tái)將會(huì)打印通過(guò) 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)成功地配置以及部署一個(gè) flume agent。

數(shù)據(jù)獲取(Data ingestion)

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

RPC

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

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

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

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

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

  • Avro
  • Thrift
  • Syslog
  • Netcat

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


Flume 支持將多個(gè) agent 串聯(lián)起來(lái),完成這項(xiàng)操作。

合并(Consolidation)

當(dāng)需要從眾多主機(jī)上收集日志信息時(shí),我們可以在每臺(tái)主機(jī)上部署 agent,這些主機(jī)的 slink 均連接到最終日志落地主機(jī)的 source 上。落地主機(jī)將所有數(shù)據(jù)進(jìn)行組合,落地到 HDFS 上。


掃碼關(guān)注微信公眾號(hào)"Kooola大數(shù)據(jù)",聊人生|聊技術(shù)
掃碼關(guān)注微信公眾號(hào)"Kooola大數(shù)據(jù)",聊人生|聊技術(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,069評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,873評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,635評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,128評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,365評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,733評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,935評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,172評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,582評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,821評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,595評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,908評(píng)論 2 372

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

  • 博客原文 翻譯作品,水平有限,如有錯(cuò)誤,煩請(qǐng)留言指正。原文請(qǐng)見(jiàn) 官網(wǎng)英文文檔 引言 概述 Apache Flume...
    rabbitGYK閱讀 11,512評(píng)論 13 34
  • 介紹 概述 Apache Flume是為有效收集聚合和移動(dòng)大量來(lái)自不同源到中心數(shù)據(jù)存儲(chǔ)而設(shè)計(jì)的可分布,可靠的,可用...
    ximengchj閱讀 3,535評(píng)論 0 13
  • 閱讀目錄(Content) 一、Flume簡(jiǎn)介 二、Flume特點(diǎn) 三、Flume的一些核心概念 3.1、Agen...
    達(dá)微閱讀 4,747評(píng)論 0 9
  • 一、Flume簡(jiǎn)介 flume 作為 cloudera 開(kāi)發(fā)的實(shí)時(shí)日志收集系統(tǒng),受到了業(yè)界的認(rèn)可與廣泛應(yīng)用。Flu...
    superxcp閱讀 958評(píng)論 0 2
  • 介紹 概述 Apache Flume是一個(gè)分布式的,可靠的,高可用的系統(tǒng),用于高效地從多個(gè)不同的數(shù)據(jù)源收集,匯總及...
    steanxy閱讀 1,080評(píng)論 0 1