flume簡介及netcat樣例


一、簡介

Flume是一種分布式,可靠且可用的服務,用於有效地收集,聚合和移動大量日志數據。它具有基於流數據的簡單靈活的架構、可靠的可靠性機制和許多故障轉移和恢復機制,以及強大的容錯性。它使用簡單的可擴展數據模型,允許在線分析數據。很多大數據分析系統都通過flume來獲取數據的輸入。

Flume最早是Cloudera提供的日志收集系統,后來成為Apache下的項目,目前已經是Apache下的頂級項目。

Flume有兩個版本,一個是老的Flume 0.9X版本,統稱為Flume-og;另一個是經過重大重構后的版本Flume1.X,統稱為Flume-ng。在本文中,我們使用的是最新的Flume-ng版本,版本號是Apache Flume 1.9.0。

Flume的官方下載網站是http://www.apache.org/dyn/closer.lua/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz

Flume是用java開發的,其運行依賴java環境。Flume可以在windows和linux下運行,本文示例所用的是linux環境。

二、核心概念

Event:消息的基本單位,由header和body組成。

Agent:一個獨立JVM進程,負責將一端外部來源產生的消息轉 發到另一端外部的目的地。在分布式部署中,每個節點部署一個Agent。多個Agent就組成了Flume的分布式系統。

(一)Agent(代理)

Flume 運行的核心是 Agent。Flume以agent為最小的獨立運行單位。一個agent就是一個JVM。它是一個完整的數據收集工具,含有三個核心組件,分別是source、 channel、 sink。通過這些組件, Event 可以從一個地方流向另一個地方,如下圖示例:

上圖是Agent的一個最基本的結構,一個Agent中的source、channel、sink數量可以有多個,它們可相互組合使用,比如一個source可以對應多個channel,一個channel也可對應多個sink。它們的關系在配置文件中配置。后面會舉例介紹。

下面接着介紹Agent的這三個核心組件的含義.

(二)Source(源)

Source是數據的收集端,負責將數據捕獲后進行特殊的格式化,將數據封裝到事件(event) 里,然后將事件推入Channel中。 Flume提供了很多內置的Source, 支持 Avro, log4j, syslog 和 http post(body為json格式),可以讓應用程序同已有的Source直接打交道,如AvroSource,  SyslogTcpSource。 如果內置的Source無法滿足需要, Flume還支持自定義Source。

(三)Channel(通道)

Channel是連接Source和Sink的組件,大家可以將它看做一個數據的緩沖區(數據隊列),它可以將事件暫存到內存中也可以持久化到本地磁盤上, 直 到Sink處理完該事件。

Flume提供了多種內置的Channel類型,如MemoryChannel和FileChannel,也支持用戶自定義Channel。

(四)Sink(接收器)

Sink從Channel中取出事件,然后將數據發到別處,可以向文件系統、數據庫、 hadoop存數據, 也可以是其他flume agent的Source。Flume也提供了多種內置的Sink。

三、使用場景

Flume在英文中的意思是水道, 但Flume更像可以隨意組裝的消防水管,下面根據官方文檔,展示幾種Flow。

(一)多個agent順序連接

可以將多個Agent順序連接起來,將最初的數據源經過收集,存儲到最終的存儲系統中。這是最簡單的情況,一般情況下,應該控制這種順序連接的Agent 的數量,因為數據流經的路徑變長了,出現故障將影響整個Flow上的Agent收集服務。

(二)多個Agent的數據匯聚到同一個Agent

這種情況應用的場景比較多,比如要收集Web網站的用戶行為日志, Web網站為了可用性使用的負載集群模式,每個節點都產生用戶行為日志,可以為每個節點都配置一個Agent來單獨收集日志數據,然后多個Agent將數據最終匯聚到一個用來存儲數據存儲系統,如HDFS上。

(三)多級流

Flume還支持多級流,什么多級流?結合在雲開發中的應用來舉個例子,當syslog, java, nginx、 tomcat等混合在一起的日志流開始流入一個agent后,可以agent中將混雜的日志流分開,然后給每種日志建立一個自己的傳輸通道。

(四)load balance功能

上圖Agent1是一個路由節點,負責將Channel暫存的Event均衡到對應的多個Sink組件上,而每個Sink組件分別連接到一個獨立的Agent上 ,這樣起到負荷分擔的效果。

四、快速起步

下面我們通過一個簡單的實例來演示如何使用Flume,從而加深對Flume基本概念的理解。

(一)版本安裝

從flume官網下載二進制的安裝文件apache-flume-1.9.0-bin.tar.gz,解壓后得到的目錄結構如下:

 

 flume的可執行程序(實際是個shell腳本)位於bin目錄下,文件名是flume-ng。我們可以運行flume-ng version測試下當前環境是否正常,如:

 

 如果能正常執行,顯示上面的類似信息,說明當前環境是正常的(比如java環境)。上面測試並不需要修改flume的任何配置文件。

(二)配置文件

啟動一個flume agent需要指定一個配置文件,該配置文件用於配置該agent的相關參數信息,如source,channel,sink等設置信息。配置文件是普通的鍵值對格式的文本文件。在安裝目錄下的conf目錄下有樣例文件可參考。

下面我們通過一個簡單的例子來說明如何設置agent的配置文件。

每個flume agent都需要指定一個名稱,配置文件的前三個參數都是以如下內容開始,如:

a1.sources=<list of sources>
a1.channels=<list of channel>
a1.sinks=<list of sinks>
上面的配置信息中,a1就是要啟動的flume agent的名稱,a1.sources的值指定該agent的source組件,一個agent可以配置多個source,所以a1.sources的值是個列表;同樣a1.channels用於指定該agent的channel信息;a1.sinks用於指定該agent的sink信息。舉例:

a1.sources=s1
a1.channels=c1
a1.sinks=k1

上面信息定義了一個名為a1的flume agent,它有一個名為s1的source(源)、一個名為c1的channel(通道),以及一個名為k1的sink(接收器)。

配置了agent的三個核心組件source,channel,sink后(實際只是指定了一個名稱),下面就要接着配置這三個組件的具體信息,如類型等。

下面我們先配置source信息,例子如下:

a1.sources.s1.type=netcat
a1.sources.s1.bind=0.0.0.0
a1.sources.s1.port=12345
a1.sources.s1.channels=c1

上面的信息設置源s1的類型(type參數)為netcat,這是flume內置的一種源類型,它的作用是監聽來自socket中的數據,需要指定監聽的ip地址和端口號,bind參數設置Ip地址,0.0.0.0表示監聽任何地址,port參數設置端口號,這里設置的端口號是12345。對每個源,還需要配置其對應的channel,一個源可以對應多個channel,所以屬性名是復數channels,我們這里只對應一個channel,即上面配置的通道c1。

我們再配置channel的信息,例子如下:

a1.channels.c1.type = memory

上面配置c1通道為內存通道,通道數據既可以保存在內存中,也可以在文件中,其它采用默認值。

最后配置sink信息,例子如下:

a1.sinks.k1.type = logger
a1.sinks.k1.channel= c1
上面的配置中type指定sink的類型,這里的logger是flume內置的一種sink類型,主要用於調試,它會使用log4j將所有info級別的日志記錄下來,這些日志來自於配置好的通道。channel 參數用於指定sink從哪個channel獲取數據。一個sink只能從一個channel獲取數據。

(三)啟動Agent

配置好要啟動的flume agent所需要的配置文件后,就可以啟動agent了,即啟動一個java進程。

假設我們上面的配置文件名稱為hello.conf,保存到flume解壓目錄的conf目錄下,該配置文件中完整的內容如下:

a1.sources=s1
a1.channels=c1
a1.sinks=k1
a1.sources.s1.type=netcat
a1.sources.s1.bind=0.0.0.0
a1.sources.s1.port=12345
a1.sources.s1.channels=c1
a1.channels.c1.type = memory
a1.sinks.k1.type = logger
a1.sinks.k1.channel= c1

下面我們執行flume-ng腳本來啟動agent。命令格式如下:

[root@diagbot01 bin]# ./flume-ng agent -n a1 -c conf -f ../conf/testNG/netcatNG.conf -Dflume.root.logger=INFO,console

上面的命令,各選項的含義如下:

1)flume-ng是可執行腳本,位於bin目錄下

2)agent參數表示這是啟動一個agent。

3)-n 參數用於指定本agent的名稱,這里是a1,這樣flume就會根據這個名稱到配置文件中獲取相關的配置信息。

4)-c 參數用於指定log4j的配置文件所在的目錄,這里是conf目錄

5)-f參數用於指定flume agent配置文件的名稱

6)-Dflume.root.logger參數的作用是覆蓋conf/log4j.properties中的信息,讓采集的信息在控制台上輸出。

執行上面命令后,會打印很多信息,該flume agent會等待socket客戶端的連接和數據輸入,這時我們利用操作系統的nc命令來往該agent發送信息。我們打開另外一個控制台界面,輸入如下信息:

[root@diagbot01 ~]# nc localhost 12345
hello kwz
OK
you are cool
OK

上面我們運行nc命令連接flume,然后輸入兩行信息。

這時我們切換到運行flume agent的控制台界面,發現控制台上輸出了如下信息,這正是nc程序發出的信息,如下:

20/04/24 13:46:23 INFO sink.LoggerSink: Event: { headers:{} body: 68 65 6C 6C 6F 20 6B 77 7A hello kwz }
20/04/24 13:47:42 INFO sink.LoggerSink: Event: { headers:{} body: 79 6F 75 20 61 72 65 20 63 6F 6F 6C you are cool }

上面只是一個簡單的例子,從這個例子中可以看出,使用flume並不是很復雜,在規划好啟動多少agent之后。后面的主要工作是設置每個agent的配置信息,最基本的就是source,channel和sink信息。

五、小結

本文是對flume組件的一個簡單入門學習,主要是對flume的核心概念進行了介紹,並通過一個簡單的例子演示了如何使用flume。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM