? Flume 簡介
? Flume 的安裝與配置
? Fumne 部署
Flume 是 Cloudera 提供的一個高可用、 高可靠、 分布式的海量日志采集、 聚合和傳輸的系統。 Flume 支持定制各類數據源如 Avro、 Thrift、 Spooling 等。 同時 Flume提供對數據的簡單處理, 并將數據處理結果寫入各種數據接收方, 如將數據寫入到 HDFS文件系統中。Flume 作為 Cloudera 開發的實時日志收集系統, 受到了業界的認可與廣泛應用。2010 年 11 月 Cloudera 開源了 Flume 的第一個可用版本 0.9.2, 這個系列版本被統稱為 Flume-OG(Original Generation) 。 隨著 Flume 功能的擴展, Flume-OG 代碼開始
臃腫、 核心組件設計不合理、 核心配置不標準等缺點暴露出來, 尤其是在 Flume-OG 的最后一個發行版本 0.94.0 中, 日志傳輸不穩定的現象尤為嚴重。 為了解決這些問題,2011 年 10 月 Cloudera 重構了核心組件、 核心配置和代碼架構, 重構后的版本統稱為Flume-NG( Next Generation) 。 改動的另一原因是將 Flume 納入 Apache 旗下,Cloudera Flume 改名為 Apache Flume。Flume 的數據流由事件(Event)貫穿始終。 事件是 Flume 的基本數據單位, 它攜帶日志數據(字節數組形式)并且攜帶有頭信息, 這些 Event 由 Agent 外部的 Source 生成,當 Source 捕獲事件后會進行特定的格式化, 然后 Source 會把事件推入(單個或多個)Channel 中。 你可以把 Channel 看作是一個緩沖區, 它將保存事件直到 Sink 處理完該事件。 Sink 負責持久化日志或者把事件推向另一個 Source。Flume 以 agent 為最小的獨立運行單位。 一個 agent 就是一個 JVM。
單 agent 由Source、 Sink 和 Channel 三大組件構成, 如圖 11.1 所示。
值得注意的是, Flume 提供了大量內置的 Source、 Channel 和 Sink。 不同類型的Source,Channel 和 Sink 可以自由組合。 組合方式基于用戶的配置文件, 非常靈活。 比如: Channel 可以把事件暫存在內存里, 也可以持久化到本地硬盤上。 Sink 可以把日志寫入 HDFS, HBase, 甚至是另外一個 Source 等。 Flume 支持用戶建立多級流, 也就是說, 多個 agent 可以協同工作, 并且支持 Fan-in(扇入)、 Fan-out(扇出)、 ContextualRouting、 Backup Routes。 如圖 11.2 所示。
Flume 的一些核心概念:
Agent 使用 JVM 運行 Flume。 每臺機器運行一個 agent, 但是可以在一個 agent 中包含多個 Sources 和 Sinks。Source 從 Client 收集數據, 傳遞給 Channel。?Source 從 Client 收集數據, 傳遞給 Channel。?Channel 連接 sources 和 sinks , Channel 緩存從 Source 收集來的數據。Sink 從 Channel 收集數據, 并將數據寫到目標文件系統中。
Flume 的安裝與配置
在安裝 Flume 之前, 請確認已經安裝了 JDK 并正確配置了環境變量。
步 1: 下載并解壓 Flume
下載地址:
http://www.apache.org/dyn/closer.lua/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz。 將 flume 解壓到/weric 目錄下。 /weric 是之前安裝 hadoop 等等其他軟件的目錄。
$ tar -zxvf ~/apache-flume-1.7.0-bin.tar.gz -C /weric
步 2: 配置 flume 的環境變量
我個人比較喜歡創建一個獨立的環境變量配置文件, 所以使用 sudo 創建
$ sudo vim /etc/profile.d/flume.sh
在配置文件中, 添加以下內容
#!/bin/sh
export FLUME_HOME=/weric/apache-flume-1.7.0-bin
export PATH=$PATH:$FLUME_HOME/bin
環境變量生效
$ source /etc/profile
現在可以使用 version 測試 flume 的版本
$ flume-ng version
Flume 1.7.0
步 3: 配置 flume-env.sh 文件
在 flume-env.sh 文件中配置 JAVA_HOME 環境變量。
$ cp flume-env.sh.template flume-env.sh
$ vim flume-env.sh
export JAVA_HOME=/usr/local/java/jdk1.8.0_131
至此為止, flume 安裝與配置已經完成。 是不是非常的簡單。 以下是將部署兩個基本的 flume agent 測試 flume。
部署 Flume agent
部署 flume 就是配置和啟動一個 agent。 flume 允許配置多個 agent, 它們之間可 以沒有關系, 也可以組成一個數據鏈。
1. Avro
Flume 可以通過 Avro 監聽某個端口并捕獲傳輸的數據。 現在我們配置一個 Source用于監聽某個端口的數據, 并將它寫出到 flume 的 log 中。
創建一個配置文件,這個配置文件可以是任意的名稱:
$vim netcat.conf
添加以下內容:
#配置三個組件
a1.sources=r1
a1.sinks=k1
a1.channels=c1
#配置 source
a1.sources.r1.type=netcat
a1.sources.r1.bind=weric22
a1.sources.r1.port=4444
#配置 sink
a1.sinks.k1.type=logger
#配置 channel
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
a1.channels.c1.transactionCapacity=100
#綁定 source,sink 和 channel
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
現在啟動 Flume Agent
$ flume-ng agent -c conf -f netcat.conf -n a1?-Dflume.root.logger=INFO,console?
-c conf 是指使用指定的配置文件。 -f netcat.conf 是使用的配置文件。 -n a1為 agent 的名稱。 -Dflume.root.logger=INFO,console 即為輸出的日志級別和目標。
啟動以后顯示為 :
可見, 已經開始監聽 4444 端口。
現在打開另一個終端, 使用 telnet 登錄 4444 端口, 并發送數據:
然后檢查 flume 端接收到的信息
通過上面的配置可以發現在 telent 端輸出的數據, 都已經被 flume 接收并輸出到控制臺。 即實現了第一個 flume 的部署。
以下配置是將從端口接收到的數據, 保存到 hdfs。
#定義三個組件
a1.sources=r1
a1.channels=c1
a1.sinks=k1
#定義 r1, 即定義數據來源
a1.sources.r1.type=netcat
a1.sources.r1.bind=weric22
a1.sources.r1.port=4444
#配置 sink,即輸出的目標
a1.sinks.k1.type=hdfs
a1.sinks.k1.hdfs.path=hdfs://weric22:8020/flume/avro_to_hdfs
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.fileType=DataStream
#配置中間的緩存
a1.channels.c1.type=memory
a1.channels.c1.capacity=1000
#將這三個組件組成一塊
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
現在啟動 flume agent:
$ flume-ng agent -n a1 -c config -f 03_avro_to_hdfs.conf
-Dflume.root.logger=DEBUG,Console
使用 telent 登錄 weric22 主機的 4444 端口, 然后輸入若干數據, 如下:
$ telnet weric22 4444
Jack <ENTER>
OK
....
現在可以查看 hdfs 上的數據:
$ hdfs dfs -ls /flume/avro_to_hdfs
Found 4 items
-rw-r--r-- /flume/avro_to_hdfs/FlumeData.1501858294240
-rw-r--r-- /flume/avro_to_hdfs/FlumeData.1501858327295
-rw-r--r-- /flume/avro_to_hdfs/FlumeData.1501858480559
-rw-r--r-- /flume/avro_to_hdfs/FlumeData.1501859145948
更可以查看里面保存的數據:
$ hdfs dfs -cat /flume/avro_to_hdfs/*
Mary
Alex
Jerry b
2. Spool
Spool 用于監測配置的目錄下新增的文件, 并將文件中的數據讀取出來。 需要注 意兩點: 拷貝到 spool 目錄下的文件不可以再打開編輯、 spool 目錄下不可包含相應的 子目錄。 現在創建 flume 的一個配置文件 spool.conf:
$ vim spool.conf
并添加以下配置信息:
#聲明三個組件的名稱
a2.sources=r1
a2.channels=c1
a2.sinks=k1
#聲明 r1 即 source
a2.sources.r1.type=spooldir
a2.sources.r1.spoolDir=/weric/log
#聲明 channel 即 c1
a2.channels.c1.type=memory
a2.channels.c1.capacity=1000
#聲明 sinks 之 k1
a2.sinks.k1.type=hdfs
a2.sinks.k1.hdfs.path=hdfs://weric22:8020/flume/%Y%m%d%H
a2.sinks.k1.hdfs.writeFormat=Text
a2.sinks.k1.hdfs.fileType=DataStream
#由于上面使用了時間對象所以必須要設置為 true
a2.sinks.k1.hdfs.useLocalTimeStamp=true
#設置文件的前綴, 默認值為 FlumeData.
a2.sinks.k1.hdfs.filePrefix=weric
#組合起來
a2.sources.r1.channels=c1
a2.sinks.k1.channel=c1
上例中%Y%m%d%H 是指輸出年月日小時的格式的目錄。 fileType 的選項有三個, 分 另是: DataStream( 原始數據流) 、 SequenceFile、 CompressedStream。 默認值為 SequenceFile。 hdfs.filePrefix 默認值為 FlumeData, 可以修改成任意的值。 由于在配置中使用了%Y 等時間表達式, 所以必須要設置 useLocalTimeStamp=true, 否則會出
現異常。 現在啟動這個 agent:
$ flume-ng agent -c apache-flume-1.7.0-bin/conf/ -f?flume_config/spool.conf -n a2 -Dflume.root.logger=DEBUG,console?
現在可以將文件直接拷貝到/weric/log 目錄下了:
$ cp ~/note.txt /weric/log/notes.txt
flume 在完成上傳以后, 會修改文件名, 默認的添加擴展為.COMPLETED:
$ ls
notes.txt.COMPLETED
檢查 hdfs 上的文件:
$ hdfs dfs -ls /flume/2017080122
-rw-r--r-- ... /flume/2017080122/weric.1501579397641
上面略去了部分內容, 其中 weric.1501579397641 即是采集完成放到 hdfs 上的
文件。
?
?
?
?
?
?
?
?