flume日志采集系統(tǒng)介紹

在具體介紹本文內(nèi)容之前,先給大家看一下Hadoop業(yè)務的整體開發(fā)流程:


從Hadoop的業(yè)務開發(fā)流程圖中可以看出,在大數(shù)據(jù)的業(yè)務處理過程中,對于數(shù)據(jù)的采集是十分重要的一步,也是不可避免的一步,從而引出我們本文的主角—Flume。本文將圍繞Flume的架構(gòu)、Flume的應用(日志采集)進行詳細的介紹。

1Flume的概念?
flume是分布式的日志收集系統(tǒng),它將各個服務器中的數(shù)據(jù)收集起來并送到指定的地方去,比如說送到圖中的HDFS,簡單來說flume就是收集日志的。?

Flume源消耗由外部源(如Web服務器)傳遞給它的事件。外部源以目標Flume源識別的格式向Flume發(fā)送事件。例如,Avro Flume源可用于從Avro客戶端或從Avro接收器發(fā)送事件的流中的其他Flume代理接收Avro事件。可以使用Thrift Flume Source定義類似的流程,以接收來自Thrift Sink或Flume Thrift Rpc客戶端或Thrift客戶端的事件,這些客戶端使用Flume thrift協(xié)議生成的任何語言編寫。當Flume源接收事件時,它將其存儲到一個或多個頻道。該通道是一個被動存儲器,可以保持事件直到它被Flume接收器消耗。文件通道就是一個例子 - 它由本地文件系統(tǒng)支持。接收器從通道中移除事件并將其放入外部存儲庫(如HDFS(通過Flume HDFS接收器))或?qū)⑵滢D(zhuǎn)發(fā)到流中下一個Flume代理(下一跳)的Flume源。給定代理中的源和接收器與通道中暫存的事件異步運行。


2,Event的概念?

在這里有必要先介紹一下flume中event的相關(guān)概念:flume的核心是把數(shù)據(jù)從數(shù)據(jù)源(source)收集過來,在將收集到的數(shù)據(jù)送到指定的目的地(sink)。為了保證輸送的過程一定成功,在送到目的地(sink)之前,會先緩存數(shù)據(jù)(channel),待數(shù)據(jù)真正到達目的地(sink)后,flume在刪除自己緩存的數(shù)據(jù)。?

在整個數(shù)據(jù)的傳輸?shù)倪^程中,流動的是event,即事務保證是在event級別進行的。那么什么是event呢?—–event將傳輸?shù)臄?shù)據(jù)進行封裝,是flume傳輸數(shù)據(jù)的基本單位,如果是文本文件,通常是一行記錄,event也是事務的基本單位。event從source,流向channel,再到sink,本身為一個字節(jié)數(shù)組,并可攜帶headers(頭信息)信息。event代表著一個數(shù)據(jù)的最小完整單元,從外部數(shù)據(jù)源來,向外部的目的地去。?

為了方便大家理解,給出一張event的數(shù)據(jù)流向圖:?

其中event信息就是flume收集到的日記記錄。?

3、flume架構(gòu)介紹?

flume之所以這么神奇,是源于它自身的一個設(shè)計,這個設(shè)計就是agent,agent本身是一個Java進程,運行在日志收集節(jié)點—所謂日志收集節(jié)點就是服務器節(jié)點。 agent里面包含3個核心的組件:source—->channel—–>sink,類似生產(chǎn)者、倉庫、消費者的架構(gòu)。 source:source組件是專門用來收集數(shù)據(jù)的,可以處理各種類型、各種格式的日志數(shù)據(jù),包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義。 channel:source組件把數(shù)據(jù)收集來以后,臨時存放在channel中,即channel組件在agent中是專門用來存放臨時數(shù)據(jù)的——對采集到的數(shù)據(jù)進行簡單的緩存,可以存放在memory、jdbc、file等等。

4、flume的運行機制?

flume的核心就是一個agent,這個agent對外有兩個進行交互的地方,一個是接受數(shù)據(jù)的輸入——source,一個是數(shù)據(jù)的輸出sink,sink負責將數(shù)據(jù)發(fā)送到外部指定的目的地。source接收到數(shù)據(jù)之后,將數(shù)據(jù)發(fā)送給channel,chanel作為一個數(shù)據(jù)緩沖區(qū)會臨時存放這些數(shù)據(jù),隨后sink會將channel中的數(shù)據(jù)發(fā)送到指定的地方—-例如HDFS等,注意:只有在sink將channel中的數(shù)據(jù)成功發(fā)送出去之后,channel才會將臨時數(shù)據(jù)進行刪除,這種機制保證了數(shù)據(jù)傳輸?shù)目煽啃耘c安全性。?

5、flume的廣義用法?

flume之所以這么神奇—-其原因也在于flume可以支持多級flume的agent,即flume可以前后相繼,例如sink可以將數(shù)據(jù)寫到下一個agent的source中,這樣的話就可以連成串了,可以整體處理了。flume還支持扇入(fan-in)、扇出(fan-out)。所謂扇入就是source可以接受多個輸入,所謂扇出就是sink可以將數(shù)據(jù)輸出多個目的地destination中。?

(二)flume應用—日志采集?

對于flume的原理其實很容易理解,我們更應該掌握flume的具體使用方法,flume提供了大量內(nèi)置的Source、Channel和Sink類型。而且不同類型的Source、Channel和Sink可以自由組合—–組合方式基于用戶設(shè)置的配置文件,非常靈活。比如:Channel可以把事件暫存在內(nèi)存里,也可以持久化到本地硬盤上。Sink可以把日志寫入HDFS, HBase,甚至是另外一個Source等等。下面我將用具體的案例詳述flume的具體用法。?

其實flume的用法很簡單—-書寫一個配置文件,在配置文件當中描述source、channel與sink的具體實現(xiàn),而后運行一個agent實例,在運行agent實例的過程中會讀取配置文件的內(nèi)容,這樣flume就會采集到數(shù)據(jù)。?

配置文件的編寫原則:?

1>從整體上描述代理agent中sources、sinks、channels所涉及到的組件

# Name the components onthis agent

? ? a1.sources = r1

? ? a1.sinks = k1

? ? a1.channels = c1


2>詳細描述agent中每一個source、sink與channel的具體實現(xiàn):即在描述source的時候,需要

指定source到底是什么類型的,即這個source是接受文件的、還是接受http的、還是接受thrift

的;對于sink也是同理,需要指定結(jié)果是輸出到HDFS中,還是Hbase中啊等等;對于channel

需要指定是內(nèi)存啊,還是數(shù)據(jù)庫啊,還是文件啊等等。

# 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

3>通過channel將source與sink連接起來

? ? # Bind the source and sink to the channel

? ? a1.sources.r1.channels = c1

? ? a1.sinks.k1.channel = c1


啟動agent的shell操作:


flume-ng? agent -n a1? -c? ../conf? -f? ../conf/example.file?

? ? -Dflume.root.logger=DEBUG,console


參數(shù)說明: -n 指定agent名稱(與配置文件中代理的名字相同)?

-c 指定flume中配置文件的目錄?

-f 指定配置文件?

-Dflume.root.logger=DEBUG,console 設(shè)置日志等級

具體案例:?

案例: NetCat Source:監(jiān)聽一個指定的網(wǎng)絡端口,即只要應用程序向這個端口里面寫數(shù)據(jù),這個source組件就可以獲取到信息。 其中 Sink:logger Channel:memory?

flume官網(wǎng)中NetCat Source描述:
Property Name Default Description

channels? ? ? –? ?
type? ? ? ? ? –? ? The component type name, needs to be netcat
bind? ? ? ? ? –? 日志需要發(fā)送到的主機名或者Ip地址,該主機運行著netcat類型的source在監(jiān)聽??
port? ? ? ? ? –? 日志需要發(fā)送到的端口號,該端口號要有netcat類型的source在監(jiān)聽??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容