Flume環境部署和配置詳解及案例大全
- 2019 年 10 月 29 日
- 筆記
flume是一個分散式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支援在日誌系統中訂製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(比如文本、HDFS、Hbase等)的能力 。
一、什麼是Flume? flume 作為 cloudera 開發的實時日誌收集系統,受到了業界的認可與廣泛應用。Flume 初始的發行版本目前被統稱為 Flume OG(original generation),屬於 cloudera。但隨著 FLume 功能的擴展,Flume OG 程式碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤其是在 Flume OG 的最後一個發行版本 0.94.0 中,日誌傳輸不穩定的現象尤為嚴重,為了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以及程式碼架構,重構後的版本統稱為 Flume NG(next generation);改動的另一原因是將 Flume 納入 apache 旗下,cloudera Flume 改名為 Apache Flume。 flume的特點: flume是一個分散式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支援在日誌系統中訂製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(比如文本、HDFS、Hbase,kafka等)的能力 。 flume的數據流由事件(Event)貫穿始終。Event是Flume的基本數據單位,它攜帶日誌數據(位元組數組形式)並且攜帶有header頭資訊,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩衝區,它將保存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另一個Source。 flume的可靠性 當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別為:end-to-end(收到數據agent首先將event寫到磁碟上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。
flume可擴展性
Flume採用了三層架構,分別為agent,collector和storage,每一層均可以水平擴展。其中,所有agent和collector由master統一管理,這使得系統容易監控和維護,且master允許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。
flume可管理性
所有agent和colletor由master統一管理,這使得系統便於維護。多master情況,Flume利用ZooKeeper和gossip,保證動態配置數據的一致性。用戶可以在master上查看各個數據源或者數據流執行情況,且可以對各個數據源配置和動態載入。Flume提供了web 和shell script command兩種形式對數據流進行管理。
flume可擴展性
用戶可以根據需要添加自己的agent,collector或者storage。此外,Flume自帶了很多組件,包括各種agent(file, syslog等),collector和storage(file,HDFS等)。
Flume的可恢復性: 還是靠Channel。推薦使用FileChannel,事件持久化在本地文件系統里(性能較差)。 flume的一些核心概念:
- Agent 使用JVM 運行Flume。每台機器運行一個agent,但是可以在一個agent中包含多個sources和sinks。
- Client 生產數據,運行在一個獨立的執行緒。
- Source 從Client收集數據,傳遞給Channel。
- Sink 從Channel收集數據,運行在一個獨立執行緒。
- Channel 連接 sources 和 sinks ,這個有點像一個隊列。
- Events 可以是日誌記錄、 avro 對象等。
Flume以agent為最小的獨立運行單位。一個agent就是一個JVM。單agent由Source、Sink和Channel三大組件構成,如下圖:

flume的詳細三大組件介紹
flume的核心是agent。agent是一個Java進程,運行在日誌收集端,通過agent接收日誌,然後暫存起來,再發送到目的地。
agent裡面包含3個核心組件:source、channel、sink。
source組件:是專用於收集日誌的,可以處理各種類型各種格式的日誌數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、等自定義。source組件把數據收集來以後,臨時存放在channel中。
channel組件:是在agent中專用於臨時存儲數據的,可以存放在memory、jdbc、file、等自定義。
channel中的數據只有在sink發送成功之後才會被刪除。
sink組件:是用於把數據發送到目的地的組件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、kfka,等自定義。
值得注意的是,Flume提供了大量內置的Source、Channel和Sink類型。不同類型的Source,Channel和Sink可以自由組合。組合方式基於用戶設置的配置文件,非常靈活。比如:Channel可以把事件暫存在記憶體里,也可以持久化到本地硬碟上。Sink可以把日誌寫入HDFS, HBase,甚至是另外一個Source等等。Flume支援用戶建立多級流,也就是說,多個agent可以協同工作,並且支援Fan-in、Fan-out、Contextual Routing、Backup Routes,這也正是NB之處。如下圖所示:

二、安裝,配置
1,官網地址:http://flume.apache.org/
2,flume安裝配置
a,先配置java 環境變數
12345678 |
tar xvf /soft/jdk-7u79-linux-x64.tar.gz -C /soft vim /etc/profile#java export JAVA_HOME=/soft/jdk1.7.0_79/export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:/$JAVA_HOME/bin:$HADOOP_HOME/binsource /etc/profile |
---|
b,配置flume
1234567 |
tar xvf apache-flume-1.6.0-bin.tar.gz -C /usr/local/ELK/mv apache-flume-1.6.0 usr/local/ELK/apache-flume cd /usr/local/ELK/apache-flume/confcp flume-env.sh.template flume-env.sh vi conf/flume-env.shJAVA_HOME=/soft/jdk1.8.0_101 |
---|
c ,驗證是否安裝成功
123456 |
/usr/local/ELK/apache-flume/bin/flume-ng versionFlume 1.6.0Source code repository: https://git-wip-us.apache.org/repos/asf/flume.gitRevision: 8633220df808c4cd0c13d1cf0320454a94f1ea97Compiled by hshreedharan on Wed May 7 14:49:18 PDT 2014From source with checksum a01fe726e4380ba0c9f7a7d222db961f |
---|
說明安裝成功
三 、flume的案例
1)案例1:Avro
這裡所指的案例都是以source的格式來定義
Avro可以發送一個給定的文件給Flume,Avro 源使用AVRO RPC機制。
a)創建agent配置文件
1234567891011121314151617181920212223 |
cd /usr/local/ELK/apache-flume/conf vim avro.confa1.sources = r1a1.sinks = k1a1.channels = c1 # Describe/configure the sourcea1.sources.r1.type = avroa1.sources.r1.channels = c1a1.sources.r1.bind = 0.0.0.0a1.sources.r1.port = 4141 # Describe the sinka1.sinks.k1.type = logger 將收集到的日誌輸出到控制台 # Use a channel which buffers events in memorya1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100# Bind the source and sink to the channela1.sources.r1.channels = c1a1.sinks.k1.channel = c1 |
---|
2)案例1:exec
這裡所指的案例都是以source的格式來定義
ecex可以實時監控一個文件,使用tail -F /opt/logs/usece.log。
a)創建agent配置文件
1234567891011121314151617181920212223 |
vim exec.conf a2.sources = r2a2.sinks = k2a2.channels = c2 #Describe/configure the sourcea2.sources.r2.type = execa2.sources.r2.channels = c2a2.sources.r2.command=tail -F /opt/logs/usercenter.log # Describe the sinka2.sinks.k2.type = file_rolla2.sinks.k2.channel = c2a2.sinks.k2.sink.directory = /opt/flume 將收集到的日誌寫入此目錄下 # Use a channel which buffers events in memorya2.channels.c2.type = memorya2.channels.c2.capacity = 1000a2.channels.c2.transactionCapacity = 100# Bind the source and sink to the channela2.sources.r2.channels = c2a2.sinks.k2.channel = c2 |
---|
更多案例參考:
http://www.aboutyun.com/thread-8917-1-1.html