主要內容:
- 了解Flume
- Flume安裝部署
- HDFS Sink
5.1 了解Flume
1) Flume概述
Flume是Cloudera提供的一個高可用,高可靠的,分布式的海量日志采集、聚合和傳輸的軟件。
Flume的核心是把數據從數據源(source)收集過來,再將收集到的數據送到指定的目的地(sink)。為了保證輸送的過程一定成功,在送到目的地(sink)之前,會先緩存數據(channel),待數據真正到達目的地(sink)后,Flume再刪除自己緩存的數據。
Flume支持定制各類數據發送方,用於收集各類型數據,同時,Flume支持定制各種數據接受方,用於最終存儲數據。一般的采集需求,通過對Flume的簡單配置即可實現。針對特殊場景也具備良好的自定義擴展能力。因此,Flume可以適用於大部分的日常數據采集場景。
當前Flume有兩個版本。Flume的初始發行版本統稱Flume OG(original generation),Flume1.X版本的統稱Flume NG(next generation)。版本改動的原因是隨着 Flume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標准等缺點暴露出來,尤其是在 Flume OG 的最后一個發行版本 0.94中,日志傳輸不穩定的現象尤為嚴重。
Flume NG經過核心組件、核心配置以及代碼架構重構,與Flume OG有很大不同,使用時請注意區分。改動的另一個原因是將Flume納入Apache旗下,Cloudera Flume改名為Apache Flume。
2) Flume運行機制
Flume日志采集傳輸系統中核心的角色是agent,agent本身是一個Java進程,一般運行在日志收集節點,當然也可以運行在數據下沉的節點。 Source、Sink、Channel三個組件是Flume運行的核心。
agent組件介紹:
每一個agent相當於一個數據傳遞員,內部三個組件的介紹:
Source:采集源,用於跟數據源對接,以獲取數據;
Sink:下沉地,采集數據的傳送目的地,用於往下一級agent傳遞數據或者往最終存儲系統傳遞數據;
Channel:agent內部的數據傳輸通道,用於從source將數據傳遞到sink;
event介紹:
在整個數據的傳輸的過程中,流動的是event,它是Flume內部數據傳輸的最基本的單元。event將傳輸的數據進行封裝。如果是文本文件,通常是一行記錄,event也是事務的基本單位。event從source,流向channel,再到sink,本身為一個字節數組,並可攜帶headers(頭信息)信息。event代表着一個數據的最小完整單元,從外部數據源來,向外部的目的地去。
一個完整的event包括:event headers、event body、event信息,其中event信息就是Flume收集到的日志記錄。
3) Flume采集系統結構圖
單個agent采集數據:
我們知道Flume一個很重要的功能就是應用於大數據環境中采集日志信息,那么對於分布式系統上面所講的簡單結構滿足不了。所以有了復雜結構,比如在每一台服務器上都部署一個agent進程進行數據采集,再通過一個agent進程對所有采集到的數據進行匯總,並下沉到數據存儲系統。這樣使得Flume系統可以很方便地擴展。
多級agent之間串聯:
4) 官網介紹
http://flume.apache.org/
官網左邊的菜單欄的documentation-> Flume User Guide,在頁面左邊菜單的Configuration下面我們可以看到Flume Sources、Flume Sinks、Flume Channels。這里所列舉的數據源、下沉地和傳輸通道,基本上包含了大數據領域常用的軟件,能滿足大部分的需求(特殊情況下Flume也支持自定義)。
由此我們也可以知道,Flume使用的時候重點在於采集方案的配置。針對采集需求使用的是什么樣的source、sink和channel,把服務配置好並啟動起來,就可以進行數據采集、數據的傳輸和數據的下沉。
5.2 Flume安裝和部署步驟介紹
5.2.1 Flume的安裝
1) 上傳安裝包到數據源所在節點上,實際上不是數據源節點也是可以的,只要運行Flume的這台機器與數據源節點的這台機器能夠通過某種協議進行通信即可。
2) 然后解壓tar -zxvf apache-flume-1.8.0-bin.tar.gz,並修改(mv)文件名為flume
3) 然后進入flume的目錄,修改conf下的flume-env.sh(沒有的話復制(cp)flume-env.sh.template),在里面配置JAVA_HOME為jdk的根目錄。
4) 根據數據采集需求配置采集方案,描述在配置文件中(文件名可任意自定義)
5) 指定采集方案配置文件,在相應的節點上啟動flume agent
先用一個最簡單的例子來測試一下程序環境是否正常。重點是體會一下Flume三個組件之間該怎么配置。
5.2.2 需求
往一個網絡端口上發送數據,Flume監聽該端口,將接收到的數據收集起來,並下沉到終端上以日志的形式打印出來。
5.2.3 配置采集方案
在flume的conf目錄下新建一個文件:vi netcat-logger.conf (命名規則建議:source-sink.conf)
配置文件netcat-logger.conf參考內容:
#從網絡端口接受數據,下沉到logger
#采集配置文件,netcat-logger.conf
#定義這個agent中各組件的名字
a1.sources=r1
a1.sinks=k1
a1.channels=c1
#描述和配置source組件:r1
a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=44444
#描述和配置sink組件:k1
a1.sinks.k1.type=logger
#描述和配置channel組件,此處使用是內存緩存的方式
a1.channels.c1.type=memory
# The maximum number of events stored in the channel
a1.channels.c1.capacity=1000
# The maximum number of events the channel will take from a source or give to a sink per transaction
a1.channels.c1.transactionCapacity=100
#描述和配置source channel sink之間的連接關系
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
5.2.4 啟動agent采集數據
命令格式:
$ bin/flume-ng agent -n $agent_name -c conf -f conf/flume-conf.properties.template
示例:
bin/flume-ng agent --conf conf --conf-file conf/netcat-logger.conf --name a1 -Dflume.root.logger=INFO,console
命令解釋:
-c (或--conf) : flume自身所需的conf文件路徑
-f (--conf-file) : 自定義的flume配置文件,也就是采集方案文件
-n (--name): 自定義的flume配置文件中agent的name
5.2.5 測試
先要往agent采集監聽的端口上發送數據,讓agent有數據可采。
隨便在一個能跟agent節點聯網的機器上,也可以在本機:
telnet agent-hostname port (如:telnet localhost 44444)
注意1:如果telnet還沒有安裝,則需要執行yum install -y telnet進行安裝
telnet安裝過程記錄:
執行之前:
- 設置里面網絡連接更改為vmnet8
1、檢測telnet-server的rpm包是否安裝
# rpm -qa telnet-server
若無輸出內容,則表示沒有安裝。如:
2、若未安裝,則安裝telnet-server,否則忽略此步驟
#yum install telnet-server
3、檢測telnet的rpm包是否安裝
# rpm -qa telnet
telnet-0.17-47.el6_3.1.x86_64
4、若未安裝,則安裝telnet,否則忽略此步驟
# yum install telnet
5、啟動telnet服務
# systemctl start telnet.socket
6、設置開機啟動
#chkconfig telnet on
注意2:如果telnet 127.0.0.1 44444能成功,而telnet localhost 44444不能成功,說明hosts文件內容需要補充。參考樣式如下:
#vi /etc/hosts
5.3 HDFS Sink
This sink writes events into the Hadoop Distributed File System (HDFS). It currently supports creating text and sequence files. It supports compression in both file types. The files can be rolled (close current file and create a new one) periodically based on the elapsed time or size of data or number of events. It also buckets/partitions data by attributes like timestamp or machine where the event originated. The HDFS directory path may contain formatting escape sequences that will replaced by the HDFS sink to generate a directory/file name to store the events. Using this sink requires hadoop to be installed so that Flume can use the Hadoop jars to communicate with the HDFS cluster. Note that a version of Hadoop that supports the sync() call is required.
Example for agent named a1:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
在hdfs中創建文件夾用於采集日志的存放:
hdfs查看文件目錄:
#hdfs dfs -lsr /
創建文件夾:
hdfs dfs -mkdir /user/flume
創建配置文件netcat-hdfs.conf,參考內容如下:
#從網絡端口接受數據,下沉到hdfs
#采集配置文件,netcat- hdfs.conf
#定義這個agent中各組件的名字
a1.sources=r1
a1.sinks=k1
a1.channels=c1
#描述和配置source組件:r1
a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=44444
#描述和配置sink組件:k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /user/flume/events/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = second
a1.sinks.k1.hdfs.useLocalTimeStamp = true
#描述和配置channel組件,此處使用是內存緩存的方式
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#描述和配置source channel sink之間的連接關系
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
flume文件夾下啟動:
bin/flume-ng agent --conf conf --conf-file conf/netcat-hdfs.conf --name a1
另開一個窗口:
#telnet localhost 44444
隨便輸入一些信息
查看對應hdfs文件信息:
#hdfs dfs -lsr /user/flume