大數據flume日誌採集系統詳解

一.flume介紹 html

    flume 是一個cloudera提供的 高可用高可靠,分佈式的海量日誌收集聚合傳輸系統。Flume支持日誌系統中定製各種數據發送方,用於收集數據。同時flume提供對數據進行簡單處理,並寫到各類數據接收方(可定製)的能力。
java

二.功能介紹node

  日誌收集web

Flume最先是Cloudera提供的日誌收集系統,目前是Apache下的一個孵化項目,Flume支持在日誌系統中定製各種數據發送方,用於收集數據。shell

流程:恆生數據接收中間件---file.txt  哪一個端口進行監控 --- 數據監控接收數據----內存存儲本地硬盤數據庫

Flume—哪一個ip  哪一個端口進行監控 --- 數據監控接收數據----內存存儲本地硬盤apache

數據處理vim

Flume提供對數據進行簡單處理,並寫到各類數據接受方(可定製)的能力 Flume提供了從Console(控制檯)、RPCThrift-RPC)、Text(文件)、TailUNIX tail)、SyslogSyslog日誌系統,支持TCPUDP2種模式),exec(命令執行)等數據源上收集數據的能力。數組

三.flume原理圖結構緩存

   wKiom1nAhn6SllebAAB14NFPo_U084.png-wh_50


    Flume邏輯上分三層架構:AgentCollectorStorage。

Flume OG採用了多Master的方式。爲了保證配置數據的一致性,Flume引入了ZooKeeper,用於保存配置數據,ZooKeeper自己可保證配置數據的一致性和高可用,另外,在配置數據發生變化時,ZooKeeper能夠通知Flume Master節點。Flume Master間使用gossip協議同步數據。

FLUM OG 的特色是:

 FLUM OG 有三種角色的節點:代理節點(agent)、收集節點(collector)、主節點(master)。

 agent 從各個數據源收集日誌數據,將收集到的數據集中到 Collector,而後由收集節點彙總存入 HDFSmaster 負責管理 agentcollector 的活動。

 agentcollector 都稱爲 nodenode 的角色根據配置的不一樣分爲 logical node(邏輯節點)、physical node(物理節點)。

 agentcollector sourcesink 組成,表明在當前節點數據是從 source 傳送到 sink

                                   Flume-NG架構介紹

wKiom1nAhujCji9rAAIcdmgoCWI839.png-wh_50

Flume NG最明顯的改動就是取消了集中管理配置的 Master Zookeeper,變爲一個純粹的傳輸工具。Flume NG另外一s個主要的不一樣點是讀入數據和寫出數據如今由不一樣的工做線程處理(稱爲Runner)。在 Flume NG 中,讀入線程一樣作寫出工做(除了故障重試)。若是寫出慢的話(不是徹底失敗),它將阻塞 Flume 接收數據的能力。這種異步的設計使讀入線程能夠順暢的工做而無需關注下游的任何問題。

FLUME NG 的特色是:

 NG 只有一種角色的節點:代理節點(agent)。

 沒有 collectormaster 節點這是核心組件最核心的變化。

 去除了 physical nodeslogical nodes 的概念和相關內容。

 agent 節點的組成也發生了變化。Flume NG agent sourcesinkChannel 組成。

四.flume三大組件介紹(agent,channel,sink)

   FlumeAgent爲最小的獨立運行單位。AgentFlume中產生數據流的地方,一個Agent就是一個JVM。單AgentSourceSinkChannel三大組件構成

    wKioL1nAh1qx7XXRAAAcAqazCiw239.png-wh_50

 Source:完成對日誌數據的收集,分紅 transtion event 打入到Channel之中。

 Channel:主要提供一個隊列的功能,對source提供中的數據進行簡單的緩存。 

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

對現有程序改動最小的使用方式是使用是直接讀取程序原來記錄的日誌文件,基本能夠實現無縫接入,不須要對現有程序進行任何改動。

    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,支持UDPTCP兩種協議

HTTP Source

基於HTTP POSTGET方式的數據源,支持JSONBLOB表示形式

Legacy Sources

兼容老的Flume OGSource0.9.x版本)

自定義Source

使用者經過實現Flume提供的接口來定製知足需求的Source

    

對於直接讀取文件Source, 主要有兩種方式: 

ü Exec source

可經過寫Unix command的方式組織數據,最經常使用的就是tail -F [file]

能夠實現實時傳輸,但在flume不運行和腳本錯誤時,會丟數據,也不支持斷點續傳功能。由於沒有記錄上次文件讀到的位置,從而沒辦法知道,下次再讀時,從什麼地方開始讀。特別是在日誌文件一直在增長的時候。flumesource掛了。等flumesource再次開啓的這段時間內,增長的日誌內容,就沒辦法被source讀取到了。不過flume有一個execStream的擴展,能夠本身寫一個監控日誌增長狀況,把增長的日誌,經過本身寫的工具把增長的內容,傳送給flumenode。再傳送給sinknode。要是能在tail類的source中能支持,在node掛掉這段時間的內容,等下次node開啓後在繼續傳送,那就更完美了。

ü Spooling Directory Source

SpoolSource:是監測配置的目錄下新增的文件,並將文件中的數據讀取出來,可實現準實時。須要注意兩點:

一、拷貝到spool目錄下的文件不能夠再打開編輯。

二、spool目錄下不可包含相應的子目錄。在實際使用的過程當中,能夠結合log4j使用,使用log4j的時候,將log4j的文件分割機制設爲1分鐘一次,將文件拷貝到spool的監控目錄。log4j有一個TimeRolling的插件,能夠把log4j分割的文件到spool目錄。基本實現了實時的監控。Flume在傳完文件以後,將會修改文件的後綴,變爲.COMPLETED(後綴也能夠在配置文件中靈活指定)

注:ExecSourceSpoolSource對比

ExecSource能夠實現對日誌的實時收集,可是存在Flume不運行或者指令執行出錯時,將沒法收集到日誌數據,沒法何證日誌數據的完整性。SpoolSource雖然沒法實現實時的收集數據,可是可使用以分鐘的方式分割文件,趨近於實時。若是應用沒法實現以分鐘切割日誌文件的話,能夠兩種收集方式結合使用。

Channel

當前有幾個 Channel 可供選擇,分別是 Memory Channel, JDBC Channel , File ChannelPsuedo Transaction Channel。比較常見的是前三種 Channel

Memory Channel 能夠實現高速的吞吐,可是沒法保證數據的完整性。

Memory Recover Channel 在官方文檔的建議上已經建義使用File Channel來替換。

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實現  

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提供了大量內置的SourceChannelSink類型。不一樣類型的Source,ChannelSink能夠自由組合。組合方式基於用戶設置的配置文件,很是靈活。好比:Channel能夠把事件暫存在內存裏,也能夠持久化到本地硬盤上。Sink能夠把日誌寫入HDFS, HBase,甚至是另一個Source等等。Flume支持用戶創建多級流,也就是說,多個Agent能夠協同工做,而且支持Fan-inFan-outContextual RoutingBackup Routes

       wKiom1nAiHqh08ZBAAAjIieCQZc355.png-wh_50

Collector

Flume NG中已經沒有Collector的概念了,Collector的做用是將多個Agent的數據彙總後,加載到Storage中。

2.2.3 Storage

Storage是存儲系統,能夠是一個普通File,也能夠是HDFSHIVEHBase等。

2.2.4 Master

針對於OG版本。

Master是管理協調AgentCollector的配置等信息,是Flume集羣的控制器。

Flume中,最重要的抽象是data flow(數據流),data flow描述了數據從產生,傳輸、處理並最終寫入目標的一條路徑

    wKiom1nAiMOTLDWNAAAVhWi4gHg938.png-wh_50

對於Agent數據流配置就是從哪獲得數據,把數據發送到哪一個Collector

對於Collector是接收Agent發過來的數據,把數據發送到指定的目標機器上。

五.flume特性介紹

   

(1) 可靠性

當節點出現故障時,日誌可以被傳送到其餘節點上而不會丟失。Flume提供了三種級別的可靠性保障,從強到弱依次分別爲:

 end-to-end(收到數據agent首先將event寫到磁盤上,當數據傳送成功後,再刪除;若是數據發送失敗,能夠從新發送。)

 Store on failure(這也是scribe採用的策略,當數據接收方crash時,將數據寫到本地,待恢復後,繼續發送)

 Best effort(數據發送到接收方後,不會進行確認)。

(2) 可擴展性

Flume採用了三層架構,分別爲agentcollectorstorage,每一層都可以水平擴展。其中,全部agentcollectormaster統一管理,這使得系統容易監控和維護,且master容許有多個(使用ZooKeeper進行管理和負載均衡),這就避免了單點故障問題。

(3) 可管理性

全部agentcolletormaster統一管理,這使得系統便於維護。多master狀況,Flume利用ZooKeepergossip,保證動態配置數據的一致性。用戶能夠在master上查看各個數據源或者數據流執行狀況,且能夠對各個數據源配置和動態加載。Flume提供了web shell script command兩種形式對數據流進行管理。

(4) 功能可擴展性

用戶能夠根據須要添加本身的agentcollector或者storage。此外,Flume自帶了不少組件,包括各類agentfilesyslog等),collectorstoragefileHDFS等)。

   學習總結:

 

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

Flume的數據流由事件(Event)貫穿始終。事件是Flume的基本數據單位,它攜帶日誌數據字節數組形式而且攜帶有頭信息,這些EventAgent外部的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

   wKioL1nAjPiwsRAIAABMrmXwi_A083.png-wh_50

出現以上提示說明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能夠發送一個給定的文件給FlumeAvro 源使用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命名Agentsourcesr1

a1.sinks = k1命名Agentsinksk1

a1.channels = c1命名Agentchannels c1

 

# Describe configure the source

a1.sources.r1.type = avro指定r1的類型爲AVRO

a1.sources.r1.bind = 0.0.0.0 SourceIP地址綁定(這裏指本機)

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%80000020%),即event的最大字節量爲800000*120%

 

# Bind the source and sink to the channel

a1.sources.r1.channels = c1

a1.sinks.k1.channel = c1

sourcesink分別與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

-fflume定義組件的配置文件 

-n:啓動Agent的名稱,該名稱在組件配置文件中定義 

-Dflume.root.loggerflume自身運行狀態的日誌,按需配置,詳細信息,控制檯打印

    在節點2啓動flume 進程

   flume-ng agent -c . -f /opt/modules/flume/conf/avro.conf -n a1 -Dflume.root.logger=INFO,console       //啓動命令

  wKioL1nAoGzhHC8ZAADTKKk6ccQ711.png-wh_50

  建立文件發送過去

  echo "china 51cto">>/home/avro_log

  flume-ng avro-client -c . -H master -p 4141 -F /home/avro_log 

   wKiom1nAoL2jyLD7AADMvHXnNAI236.png-wh_50

 

注:Flume框架對Hadoopzookeeper的依賴只是在jar包上,並不要求flume啓動時必須將Hadoopzookeeper服務也啓動。

    就先講解一個模式吧。其餘的數據採集方式後續分享。

相關文章
相關標籤/搜索