標籤:flume apache
一、什麼是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三大組件構成,如:
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/88/8F/wKiom1f7bNag0ycCAABLidTkpi0724.png" title="kafa.png" alt="wKiom1f7bNag0ycCAABLidTkpi0724.png" />
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之處。如所示:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/88/8F/wKiom1f7bY-Cb3PPAACw3q9ovVU703.png" title="3.png" alt="wKiom1f7bY-Cb3PPAACw3q9ovVU703.png" />
二、安裝,配置
1,官網地址:http://flume.apache.org/
2,flume安裝配置
a,先配置java 環境變數
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
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 ,驗證是否安裝成功
/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設定檔
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設定檔
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
本文出自 “crazy_sir” 部落格,請務必保留此出處http://douya.blog.51cto.com/6173221/1860390
flume詳細介紹,安裝,配置