Hadoop業務的總體開發流程:
從Hadoop的業務開發流程圖中能夠看出,在大數據的業務處理過程當中,對於數據的採集是十分重要的一步,也是不可避免的一步。html
許多公司的平臺天天會產生大量的日誌(通常爲流式數據,如,搜索引擎的pv,查詢等),處理這些日誌須要特定的日誌系統,通常而言,這些系統須要具備如下特徵:git
1) 構建應用系統和分析系統的橋樑,並將它們之間的關聯解耦;
2) 支持近實時的在線分析系統和相似於Hadoop之類的離線分析系統;
3) 具備高可擴展性。即:當數據量增長時,能夠經過增長節點進行水平擴展。數據庫
開源的日誌系統,包括facebook的scribe,apache的chukwa,linkedin的kafka和cloudera的flume等。apache
Flume 做爲 cloudera 開發的實時日誌收集系統,受到了業界的承認與普遍應用。Flume 初始的發行版本目前被統稱爲 Flume OG(original generation),屬於 cloudera。vim
但隨着 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤爲是在 Flume OG 的最後一個發行版本 0.9.4. 中,日數組
志傳輸不穩定的現象尤其嚴重,爲了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了里程碑式的改動:重構核心組件、核心配置以bash
及代碼架構,重構後的版本統稱爲 Flume NG(next generation);改動的另外一緣由是將 Flume 歸入 apache 旗下,cloudera Flume 更名爲 Apache Flume。服務器
Flume是Apache的頂級項目,官方網站:http://flume.apache.org/架構
Flume是一個分佈式、可靠、高可用的海量日誌聚合系統,支持在系統中定製各種數據發送方,用於收集數據;同時,Flume提供對數據的簡單處理,並寫到各類數據接收方的能力。框架
Flume 在0.9.x and 1.x之間有較大的架構調整,1.x版本以後的改稱Flume NG,0.9.x的稱爲Flume OG。
Flume目前只有Linux系統的啓動腳本,沒有Windows環境的啓動腳本。
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時,將數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。
仍是靠Channel。推薦使用FileChannel,事件持久化在本地文件系統裏(性能較差)。
Client:Client生產數據,運行在一個獨立的線程。
Event: 一個數據單元,消息頭和消息體組成。(Events能夠是日誌記錄、 avro 對象等。)
Flow: Event從源點到達目的點的遷移的抽象。
Agent: 一個獨立的Flume進程,包含組件Source、 Channel、 Sink。(Agent使用JVM 運行Flume。每臺機器運行一個agent,可是能夠在一個agent中包含多個sources和sinks。)
Source: 數據收集組件。(source從Client收集數據,傳遞給Channel)
Channel: 中轉Event的一個臨時存儲,保存由Source組件傳遞過來的Event。(Channel鏈接 sources 和 sinks ,這個有點像一個隊列。)
Sink: 從Channel中讀取並移除Event, 將Event傳遞到FlowPipeline中的下一個Agent(若是有的話)(Sink從Channel收集數據,運行在一個獨立線程。
Flume 運行的核心是 Agent。Flume以agent爲最小的獨立運行單位。一個agent就是一個JVM。它是一個完整的數據收集工具,含有三個核心組件,分別是 source、 channel、 sink。經過這些組件, Event 能夠從一個地方流向另外一個地方,以下圖所示:
Source是數據的收集端,負責將數據捕獲後進行特殊的格式化,將數據封裝到事件(event) 裏,而後將事件推入Channel中。
Flume提供了各類source的實現,包括Avro Source、Exce Source、Spooling Directory Source、NetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、HTTP Source、HDFS Source,etc。若是內置的Source沒法知足須要, Flume還支持自定義Source。
Channel是鏈接Source和Sink的組件,你們能夠將它看作一個數據的緩衝區(數據隊列),它能夠將事件暫存到內存中也能夠持久化到本地磁盤上, 直到Sink處理完該事件。
Flume對於Channel,則提供了Memory Channel、JDBC Chanel、File Channel,etc。
MemoryChannel能夠實現高速的吞吐,可是沒法保證數據的完整性。
MemoryRecoverChannel在官方文檔的建議上已經建義使用FileChannel來替換。
FileChannel保證數據的完整性與一致性。在具體配置不現的FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄設成不一樣的磁盤,以便提升效率。
Flume Sink取出Channel中的數據,進行相應的存儲文件系統,數據庫,或者提交到遠程服務器。
Flume也提供了各類sink的實現,包括HDFS sink、Logger sink、Avro sink、File Roll sink、Null sink、HBase sink,etc。
Flume Sink在設置存儲數據時,能夠向文件系統中,數據庫中,hadoop中儲數據,在日誌數據較少時,能夠將數據存儲在文件系中,而且設定必定的時間間隔保存數據。在日誌數據較多時,能夠將相應的日誌數據存儲到Hadoop中,便於往後進行相應的數據分析。
能夠將多個Agent順序鏈接起來,將最初的數據源通過收集,存儲到最終的存儲系統中。這是最簡單的狀況,通常狀況下,應該控制這種順序鏈接的Agent的數量,由於數據流經的路徑變長了,若是不考慮failover的話,出現故障將影響整個Flow上的Agent收集服務。
這種狀況應用的場景比較多,好比要收集Web網站的用戶行爲日誌, Web網站爲了可用性使用的負載集羣模式,每一個節點都產生用戶行爲日誌,能夠爲每一個節點都配置一個Agent來單獨收集日誌數據,而後多個Agent將數據最終匯聚到一個用來存儲數據存儲系統,如HDFS上。
下圖Agent1是一個路由節點,負責將Channel暫存的Event均衡到對應的多個Sink組件上,而每一個Sink組件分別鏈接到一個獨立的Agent上 。
下載地址:
http://mirrors.hust.edu.cn/apache/
http://flume.apache.org/download.html
Flume框架對hadoop和zookeeper的依賴只是在jar包上,並不要求flume啓動時必須將hadoop和zookeeper服務也啓動。
(1)將安裝包下載到服務器並解壓
[root@flume ~]# wget http://mirror.bit.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz [root@flume ~]# tar xf apache-flume-1.8.0-bin.tar.gz -C /opt/ [root@flume ~]# cd /opt/
(2)建立軟鏈接
[root@flume opt]# ln -s apache-flume-1.8.0-bin apache-flume
(3)修改配置文件
[root@flume opt]# ls /opt/apache-flume/conf [root@flume opt]# cp flume-env.sh.template flume-env.sh [root@flume opt]# vim flume-env.sh export JAVA_HOME=/usr/local/jdk1.8.0_60
(4)配置環境變量
[root@flume ~]# vim 〜/.bashrc [root@flume ~]#xport JAVA_HOME =/usr/local/jdk-1.8.0_60 export PATH=$PATH:$JAVA_HOME/bin # 保存使其當即生效 [root@flume ~]# source ~/.bashrc
(5)查看版本
[root@flume flume]# ./bin/flume-ng version Flume 1.8.0 Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git Revision: 99f591994468633fc6f8701c5fc53e0214b6da4f Compiled by denes on Fri Sep 15 14:58:00 CEST 2017 From source with checksum fbb44c8c8fb63a49be0a59e27316833d