一.flume介紹 html
flume 是一個cloudera提供的 高可用高可靠,分佈式的海量日誌收集聚合傳輸系統。Flume支持日誌系統中定製各種數據發送方,用於收集數據。同時flume提供對數據進行簡單處理,並寫到各類數據接收方(可定製)的能力。
java
二.功能介紹node
日誌收集web
Flume最先是Cloudera提供的日誌收集系統,目前是Apache下的一個孵化項目,Flume支持在日誌系統中定製各種數據發送方,用於收集數據。shell
流程:恆生數據接收中間件---file.txt 哪一個端口進行監控 --- 數據監控—接收數據----內存—存儲本地硬盤數據庫
Flume—對哪一個ip 哪一個端口進行監控 --- 數據監控—接收數據----內存—存儲本地硬盤apache
數據處理vim
Flume提供對數據進行簡單處理,並寫到各類數據接受方(可定製)的能力。 Flume提供了從Console(控制檯)、RPC(Thrift-RPC)、Text(文件)、Tail(UNIX tail)、Syslog(Syslog日誌系統,支持TCP和UDP等2種模式),exec(命令執行)等數據源上收集數據的能力。數組
三.flume原理圖結構緩存
Flume邏輯上分三層架構:Agent,Collector,Storage。
Flume OG採用了多Master的方式。爲了保證配置數據的一致性,Flume引入了ZooKeeper,用於保存配置數據,ZooKeeper自己可保證配置數據的一致性和高可用,另外,在配置數據發生變化時,ZooKeeper能夠通知Flume Master節點。Flume Master間使用gossip協議同步數據。
FLUM OG 的特色是:
FLUM OG 有三種角色的節點:代理節點(agent)、收集節點(collector)、主節點(master)。
agent 從各個數據源收集日誌數據,將收集到的數據集中到 Collector,而後由收集節點彙總存入 HDFS。master 負責管理 agent,collector 的活動。
agent、collector 都稱爲 node,node 的角色根據配置的不一樣分爲 logical node(邏輯節點)、physical node(物理節點)。
agent、collector 由 source、sink 組成,表明在當前節點數據是從 source 傳送到 sink。
Flume-NG架構介紹
Flume NG最明顯的改動就是取消了集中管理配置的 Master 和 Zookeeper,變爲一個純粹的傳輸工具。Flume NG另外一s個主要的不一樣點是讀入數據和寫出數據如今由不一樣的工做線程處理(稱爲Runner)。在 Flume NG 中,讀入線程一樣作寫出工做(除了故障重試)。若是寫出慢的話(不是徹底失敗),它將阻塞 Flume 接收數據的能力。這種異步的設計使讀入線程能夠順暢的工做而無需關注下游的任何問題。
FLUME NG 的特色是:
NG 只有一種角色的節點:代理節點(agent)。
沒有 collector、master 節點,這是核心組件最核心的變化。
去除了 physical nodes、logical nodes 的概念和相關內容。
agent 節點的組成也發生了變化。Flume NG的 agent 由 source、sink、Channel 組成。
四.flume三大組件介紹(agent,channel,sink)
Flume以Agent爲最小的獨立運行單位。Agent是Flume中產生數據流的地方,一個Agent就是一個JVM。單Agent由Source、Sink和Channel三大組件構成
Source:完成對日誌數據的收集,分紅 transtion 和 event 打入到Channel之中。
Channel:主要提供一個隊列的功能,對source提供中的數據進行簡單的緩存。
Sink:取出Channel中的數據,進行相應的存儲文件系統,數據庫,或者提交到遠程服務器。
對現有程序改動最小的使用方式是使用是直接讀取程序原來記錄的日誌文件,基本能夠實現無縫接入,不須要對現有程序進行任何改動。
2 Source
flume有許多類型的Source,見官網用戶手冊:
http://flume.apache.org/FlumeUserGuide.html#flume-sources
概括整理一下flume的 agent source列表以下
Source類型 |
說明 |
Avro Source |
支持Avro協議(其實是Avro RPC),提供一個Avro的接口,須要往設置的地址和端口發送Avro消息,Source就能接收到,如:Log4j Appender經過Avro Source將消息發送到Agent |
Thrift Source |
支持Thrift協議,提供一個Thrift接口,相似Avro |
Exec Source |
Source啓動的時候會運行一個設置的UNIX命令(好比 cat file),該命令會不斷地往標準輸出(stdout)輸出數據,這些數據就會被打包成Event,進行處理 |
JMS Source |
從JMS系統(消息、主題)中讀取數據,相似ActiveMQ |
Spooling Directory Source |
監聽某個目錄,該目錄有新文件出現時,把文件的內容打包成Event,進行處理 |
Netcat Source |
監控某個端口,將流經端口的每個文本行數據做爲Event輸入 |
Sequence Generator Source |
序列生成器數據源,生產序列數據 |
Syslog Sources |
讀取syslog數據,產生Event,支持UDP和TCP兩種協議 |
HTTP Source |
基於HTTP POST或GET方式的數據源,支持JSON、BLOB表示形式 |
Legacy Sources |
兼容老的Flume OG中Source(0.9.x版本) |
自定義Source |
使用者經過實現Flume提供的接口來定製知足需求的Source。 |
對於直接讀取文件Source, 主要有兩種方式:
ü Exec source
可經過寫Unix command的方式組織數據,最經常使用的就是tail -F [file]。
能夠實現實時傳輸,但在flume不運行和腳本錯誤時,會丟數據,也不支持斷點續傳功能。由於沒有記錄上次文件讀到的位置,從而沒辦法知道,下次再讀時,從什麼地方開始讀。特別是在日誌文件一直在增長的時候。flume的source掛了。等flume的source再次開啓的這段時間內,增長的日誌內容,就沒辦法被source讀取到了。不過flume有一個execStream的擴展,能夠本身寫一個監控日誌增長狀況,把增長的日誌,經過本身寫的工具把增長的內容,傳送給flume的node。再傳送給sink的node。要是能在tail類的source中能支持,在node掛掉這段時間的內容,等下次node開啓後在繼續傳送,那就更完美了。
ü Spooling Directory Source
SpoolSource:是監測配置的目錄下新增的文件,並將文件中的數據讀取出來,可實現準實時。須要注意兩點:
一、拷貝到spool目錄下的文件不能夠再打開編輯。
二、spool目錄下不可包含相應的子目錄。在實際使用的過程當中,能夠結合log4j使用,使用log4j的時候,將log4j的文件分割機制設爲1分鐘一次,將文件拷貝到spool的監控目錄。log4j有一個TimeRolling的插件,能夠把log4j分割的文件到spool目錄。基本實現了實時的監控。Flume在傳完文件以後,將會修改文件的後綴,變爲.COMPLETED(後綴也能夠在配置文件中靈活指定)
注:ExecSource,SpoolSource對比
ExecSource能夠實現對日誌的實時收集,可是存在Flume不運行或者指令執行出錯時,將沒法收集到日誌數據,沒法何證日誌數據的完整性。SpoolSource雖然沒法實現實時的收集數據,可是可使用以分鐘的方式分割文件,趨近於實時。若是應用沒法實現以分鐘切割日誌文件的話,能夠兩種收集方式結合使用。
2 Channel
當前有幾個 Channel 可供選擇,分別是 Memory Channel, JDBC Channel , File Channel,Psuedo Transaction Channel。比較常見的是前三種 Channel。
v Memory Channel 能夠實現高速的吞吐,可是沒法保證數據的完整性。
v Memory Recover Channel 在官方文檔的建議上已經建義使用File Channel來替換。
v File Channel保證數據的完整性與一致性。在具體配置File Channel時,建議File Channel設置的目錄和程序日誌文件保存的目錄設成不一樣的磁盤,以便提升效率。
File Channel 是一個持久化的隧道(Channel),它持久化全部的事件,並將其存儲到磁盤中。所以,即便 Java 虛擬機當掉,或者操做系統崩潰或重啓,再或者事件沒有在管道中成功地傳遞到下一個代理(agent),這一切都不會形成數據丟失。Memory Channel 是一個不穩定的隧道,其緣由是因爲它在內存中存儲全部事件。若是 Java 進程死掉,任何存儲在內存的事件將會丟失。另外,內存的空間收到 RAM大小的限制,而 File Channel 這方面是它的優點,只要磁盤空間足夠,它就能夠將全部事件數據存儲到磁盤上。
Flume Channel 支持的類型:
Channel類型 |
說明 |
Memory Channel |
Event數據存儲在內存中 |
JDBC Channel |
Event數據存儲在持久化存儲中,當前Flume Channel內置支持Derby |
File Channel |
Event數據存儲在磁盤文件中 |
Spillable Memory Channel |
Event數據存儲在內存中和磁盤上,當內存隊列滿了,會持久化到磁盤文件(當前試驗性的,不建議生產環境使用) |
Pseudo Transaction Channel |
測試用途 |
Custom Channel |
自定義Channel實現 |
2 Sink
Sink在設置存儲數據時,能夠向文件系統中,數據庫中,Hadoop中儲數據,在日誌數據較少時,能夠將數據存儲在文件系統中,而且設定必定的時間間隔保存數據。在日誌數據較多時,能夠將相應的日誌數據存儲到Hadoop中,便於往後進行相應的數據分析。
Flume Sink支持的類型
Sink類型 |
說明 |
HDFS Sink |
數據寫入HDFS |
Logger Sink |
數據寫入日誌文件 |
Avro Sink |
數據被轉換成Avro Event,而後發送到配置的RPC端口上 |
Thrift Sink |
數據被轉換成Thrift Event,而後發送到配置的RPC端口上 |
IRC Sink |
數據在IRC上進行回放 |
File Roll Sink |
存儲數據到本地文件系統 |
Null Sink |
丟棄到全部數據 |
HBase Sink |
數據寫入HBase數據庫 |
Morphline Solr Sink |
數據發送到Solr搜索服務器(集羣) |
ElasticSearch Sink |
數據發送到Elastic Search搜索服務器(集羣) |
Kite Dataset Sink |
寫數據到Kite Dataset,試驗性質的 |
Custom Sink |
自定義Sink實現 |
Flume提供了大量內置的Source、Channel和Sink類型。不一樣類型的Source,Channel和Sink能夠自由組合。組合方式基於用戶設置的配置文件,很是靈活。好比:Channel能夠把事件暫存在內存裏,也能夠持久化到本地硬盤上。Sink能夠把日誌寫入HDFS, HBase,甚至是另一個Source等等。Flume支持用戶創建多級流,也就是說,多個Agent能夠協同工做,而且支持Fan-in、Fan-out、Contextual Routing、Backup Routes
Flume NG中已經沒有Collector的概念了,Collector的做用是將多個Agent的數據彙總後,加載到Storage中。
Storage是存儲系統,能夠是一個普通File,也能夠是HDFS,HIVE,HBase等。
針對於OG版本。
Master是管理協調Agent和Collector的配置等信息,是Flume集羣的控制器。
在Flume中,最重要的抽象是data flow(數據流),data flow描述了數據從產生,傳輸、處理並最終寫入目標的一條路徑
對於Agent數據流配置就是從哪獲得數據,把數據發送到哪一個Collector。
對於Collector是接收Agent發過來的數據,把數據發送到指定的目標機器上。
五.flume特性介紹
(1) 可靠性
當節點出現故障時,日誌可以被傳送到其餘節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:
end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;若是數據發送失敗,能夠從新發送。)
Store on failure(這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送)
Best effort(數據發送到接收方後,不會進行確認)。
(2) 可擴展性
Flume採用了三層架構,分別爲agent,collector和storage,每一層都可以水平擴展。其中,全部agent和collector由master統一管理,這使得系統容易監控和維護,且master容許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。
(3) 可管理性
全部agent和colletor由master統一管理,這使得系統便於維護。多master狀況,Flume利用ZooKeeper和gossip,保證動態配置數據的一致性。用戶能夠在master上查看各個數據源或者數據流執行狀況,且能夠對各個數據源配置和動態加載。Flume提供了web 和shell script command兩種形式對數據流進行管理。
(4) 功能可擴展性
用戶能夠根據須要添加本身的agent,collector或者storage。此外,Flume自帶了不少組件,包括各類agent(file, syslog等),collector和storage(file,HDFS等)。
學習總結:
Flume是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的系統。支持在日誌系統中定製各種數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各類數據接受方(好比文本、HDFS、Hbase等)的能力。
Flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)而且攜帶有頭信息,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,而後Source會把事件推入(單個或多個)Channel中。你能夠把Channel看做是一個緩衝區,它將保存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另外一個Source。
當節點出現故障時,日誌可以被傳送到其餘節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:
end-to-end:收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;若是數據發送失敗,能夠從新發送
Store on failure:這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送
Best effort:數據發送到接收方後,不會進行確認。
-------------------------------------++++++++++++++++-------------------------------
一. flume環境搭建安裝部分介紹
flume官網: http://flume.apache.org/download.html
建議你們使用1.6版本的,1.7版本目前存在一些小問題須要解決。後續官方可能會修復。
集羣中設置3個節點,每臺都安裝flume.
下載後解壓: tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /opt/modules/flume
本次默認已經安裝hadoop和jdk。因此忽略安裝步驟。
修改配置文件: cp flume-env.sh.template flume-env.sh
vim flume-env.sh
export JAVA_HOME=/usr/local/java_1.7.0_25
設置系統環境變量:
export FLUME_HOME=/opt/modules/flume
export PATH=$PATH:$FLUME_HOME/bin:
保存退出後。source /etc/profile 當即生效。
測試: 在終端輸入 flume-ng version
出現以上提示說明flume搭建成功。
能夠把flume分發到其餘節點。
scp -r /opt/modules/flume/* root@slave1:/opt/modlues/flume
scp -r /opt/modules/flume/* root@slave2:/opt/modlues/flume
二. 採集數據測試。
1) Avro
Avro能夠發送一個給定的文件給Flume,Avro 源使用AVRO RPC機制。
建立agent配置文件
# > vi /opt/modules/flume/conf/avro.conf
添加如下內容:
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe configure the source
a1.sources.r1.type = avro
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4141
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
對以上內容解釋:
指定名稱:a1是咱們要啓動的Agent名字
a1.sources = r1命名Agent的sources爲r1
a1.sinks = k1命名Agent的sinks爲k1
a1.channels = c1命名Agent的channels 爲c1
# Describe configure the source
a1.sources.r1.type = avro指定r1的類型爲AVRO
a1.sources.r1.bind = 0.0.0.0 將Source與IP地址綁定(這裏指本機)
a1.sources.r1.port = 4141指定通信端口爲4141
# Describe the sink
a1.sinks.k1.type = logger指定k1的類型爲Logger(不產生實體文件,只在控制檯顯示)
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
配置說明
指定Channel的類型爲Memory
設置Channel的最大存儲event數量爲1000
每次最大能夠source中拿到或者送到sink中的event數量也是100
這裏還能夠設置Channel的其餘屬性:
a1.channels.c1.keep-alive=1000event添加到通道中或者移出的容許時間(秒)
a1.channels.c1.byteCapacity = 800000event的字節量的限制,只包括eventbody
a1.channels.c1.byteCapacityBufferPercentage = 20
event的緩存比例爲20%(800000的20%),即event的最大字節量爲800000*120%
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
將source、sink分別與Channel c1綁定
啓動flume agent a1
# > flume-ng agent -c . -f /home/bigdata/flume/conf/avro.conf -n a1 -Dflume.root.logger=INFO,console
-c:使用配置文件所在目錄(這裏指默認路徑,即$FLUME_HOME/conf)
-f:flume定義組件的配置文件
-n:啓動Agent的名稱,該名稱在組件配置文件中定義
-Dflume.root.logger:flume自身運行狀態的日誌,按需配置,詳細信息,控制檯打印
在節點2啓動flume 進程
flume-ng agent -c . -f /opt/modules/flume/conf/avro.conf -n a1 -Dflume.root.logger=INFO,console //啓動命令
建立文件發送過去
echo "china 51cto">>/home/avro_log
flume-ng avro-client -c . -H master -p 4141 -F /home/avro_log
注:Flume框架對Hadoop和zookeeper的依賴只是在jar包上,並不要求flume啓動時必須將Hadoop和zookeeper服務也啓動。
就先講解一個模式吧。其餘的數據採集方式後續分享。