1. 程式人生 > >Flume學習之路 (一)Flume的基礎介紹

Flume學習之路 (一)Flume的基礎介紹

日誌 cbc oot 安裝 image 可擴展 服務器 提交 ffffff

一、背景

Hadoop業務的整體開發流程:
技術分享圖片
從Hadoop的業務開發流程圖中可以看出,在大數據的業務處理過程中,對於數據的采集是十分重要的一步,也是不可避免的一步。

許多公司的平臺每天會產生大量的日誌(一般為流式數據,如,搜索引擎的pv,查詢等),處理這些日誌需要特定的日誌系統,一般而言,這些系統需要具有以下特征:

1) 構建應用系統和分析系統的橋梁,並將它們之間的關聯解耦;
2) 支持近實時的在線分析系統和類似於Hadoop之類的離線分析系統;
3) 具有高可擴展性。即:當數據量增加時,可以通過增加節點進行水平擴展。

開源的日誌系統,包括facebook的scribe,apache的chukwa,linkedin的kafka和cloudera的flume等。

二、Flume的簡介

Flume 作為 cloudera 開發的實時日誌收集系統,受到了業界的認可與廣泛應用。Flume 初始的發行版本目前被統稱為 Flume OG(original generation),屬於 cloudera。

但隨著 FLume 功能的擴展,Flume OG 代碼工程臃腫、核心組件設計不合理、核心配置不標準等缺點暴露出來,尤其是在 Flume OG 的最後一個發行版本 0.9.4. 中,日

誌傳輸不穩定的現象尤為嚴重,為了解決這些問題,2011 年 10 月 22 號,cloudera 完成了 Flume-728,對 Flume 進行了裏程碑式的改動:重構核心組件、核心配置以

及代碼架構,重構後的版本統稱為 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 NG的介紹

3.1 Flume特點

flume是一個分布式、可靠、和高可用的海量日誌采集、聚合和傳輸的系統。支持在日誌系統中定制各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(比如文本、HDFS、Hbase等)的能力 。

flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據(字節數組形式)並且攜帶有頭信息,這些Event由Agent外部的Source生成,當Source捕獲事件後會進行特定的格式化,然後Source會把事件推入(單個或多個)Channel中。你可以把Channel看作是一個緩沖區,它將保存事件直到Sink處理完該事件。Sink負責持久化日誌或者把事件推向另一個Source。

3.1.1 flume的可靠性

當節點出現故障時,日誌能夠被傳送到其他節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別為:end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;如果數據發送失敗,可以重新發送。),Store on failure(這也是scribe采用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送),Besteffort(數據發送到接收方後,不會進行確認)。

3.1.2 flume的可恢復性

還是靠Channel。推薦使用FileChannel,事件持久化在本地文件系統裏(性能較差)。

3.2 Flume的一些核心概念

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收集數據,運行在一個獨立線程。

3.3 Flume NG的體系結構

Flume 運行的核心是 Agent。Flume以agent為最小的獨立運行單位。一個agent就是一個JVM。它是一個完整的數據收集工具,含有三個核心組件,分別是 source、 channel、 sink。通過這些組件, Event 可以從一個地方流向另一個地方,如下圖所示:
技術分享圖片

3.4 Source

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。
技術分享圖片

3.5 Channel

Channel是連接Source和Sink的組件,大家可以將它看做一個數據的緩沖區(數據隊列),它可以將事件暫存到內存中也可以持久化到本地磁盤上, 直到Sink處理完該事件。

Flume對於Channel,則提供了Memory Channel、JDBC Chanel、File Channel,etc。

MemoryChannel可以實現高速的吞吐,但是無法保證數據的完整性。

MemoryRecoverChannel在官方文檔的建議上已經建義使用FileChannel來替換。

FileChannel保證數據的完整性與一致性。在具體配置不現的FileChannel時,建議FileChannel設置的目錄和程序日誌文件保存的目錄設成不同的磁盤,以便提高效率。

3.6 Sink

Flume Sink取出Channel中的數據,進行相應的存儲文件系統,數據庫,或者提交到遠程服務器。

Flume也提供了各種sink的實現,包括HDFS sink、Logger sink、Avro sink、File Roll sink、Null sink、HBase sink,etc。

Flume Sink在設置存儲數據時,可以向文件系統中,數據庫中,hadoop中儲數據,在日誌數據較少時,可以將數據存儲在文件系中,並且設定一定的時間間隔保存數據。在日誌數據較多時,可以將相應的日誌數據存儲到Hadoop中,便於日後進行相應的數據分析。
技術分享圖片

四、Flume的部署類型

4.1 單一流程

技術分享圖片

4.2 多代理流程(多個agent順序連接)

技術分享圖片

可以將多個Agent順序連接起來,將最初的數據源經過收集,存儲到最終的存儲系統中。這是最簡單的情況,一般情況下,應該控制這種順序連接的Agent的數量,因為數據流經的路徑變長了,如果不考慮failover的話,出現故障將影響整個Flow上的Agent收集服務。

4.3 流的合並(多個Agent的數據匯聚到同一個Agent )

技術分享圖片

這種情況應用的場景比較多,比如要收集Web網站的用戶行為日誌, Web網站為了可用性使用的負載集群模式,每個節點都產生用戶行為日誌,可以為每個節點都配置一個Agent來單獨收集日誌數據,然後多個Agent將數據最終匯聚到一個用來存儲數據存儲系統,如HDFS上。

4.4 多路復用流(多級流)

技術分享圖片

4.5 load balance功能

下圖Agent1是一個路由節點,負責將Channel暫存的Event均衡到對應的多個Sink組件上,而每個Sink組件分別連接到一個獨立的Agent上 。
技術分享圖片

五、Flume的安裝

5.1 Flume的下載

下載地址:

http://mirrors.hust.edu.cn/apache/

http://flume.apache.org/download.html

5.2 Flume的安裝

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

Flume學習之路 (一)Flume的基礎介紹