1. 程式人生 > >Hadoop學習筆記—19.Flume框架學習

Hadoop學習筆記—19.Flume框架學習

暫存 ssh lin hadoop 兩個 move hdf 裝包 ons

START:Flume是Cloudera提供的一個高可用的、高可靠的開源分布式海量日誌收集系統,日誌數據可以經過Flume流向需要存儲終端目的地。這裏的日誌是一個統稱,泛指文件、操作記錄等許多數據。

一、Flume基礎理論

1.1 常見的分布式日誌收集系統

技術分享

  Scribe是facebook開源的日誌收集系統,在facebook內部已經得到大量的應用。 Chukwa 是一個開源的用於監控大型分布式系統的數據收集系統。這是構建在 hadoop 的 hdfs 和 map/reduce 框架之上的,繼承了 hadoop 的可伸縮性和魯棒性。而 Flume 是一個分布式、可靠、和高可用的海量日誌采集、聚合和傳輸的系統。支持在日誌系統中定制各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(比如文本、HDFS、Hbase等)的能力 。

1.2 Flume的數據流模型

  Flume的核心把數據從數據源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地後,刪除自己緩存的數據。

  Flume傳輸的數據的基本單位Event,如果是文本文件,通常是一行記錄,這也是事務的基本單位。Event 從 Source 流向 Channel,再到 Sink,本身為一個byte數組,並可攜帶headers信息。Event代表著一個數據流的最小完整單元,從外部數據源來,向外部的目的地去。

1.3 Flume的三大核心組件

  Flume運行的核心是Agent。它是一個完整的數據收集工具,含有三個核心組件,分別是source

channelsink。通過這些組件,Event可以從一個地方流向另一個地方,如圖1所示。

技術分享

圖1 Flume數據流模型

  一個flume系統可以由一個或多個agent組成,多個agent只要做一些簡單的配置就可以串在一起,比如將兩個agent(foo、bar)串在一起工作,只要將bar的source(入口)接在foo的sink(出口)上就可以了。如圖2所示。

技術分享

圖2 多級Agent連接模型

  圖3則展示了將4個agent串在一起,agent1、agent2和agent3都是獲取web服務器的數據,然後將各自獲得到的數據統一地發送給agent4,最後由agent4將收集到的數據存儲在hdfs裏面。

技術分享

圖3 多對一的合並模型

  (1)什麽是Agent?

  Flume的核心是agent。agent是一個java進程,運行在日誌收集端,通過agent接收日誌,然後暫存起來,再發送到目的地。

  (2)三大核心組件

  ①Source:專用於收集日誌,可以處理各種類型各種格式的日誌數據,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義等。

  ②Channel:專用於臨時存儲數據,可以存放在memory、jdbc、file、數據庫、自定義等。其存儲的數據只有在sink發送成功之後才會被刪除。

  ③Sink:專用於把數據發送到目的地點,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義等。

理解Source、Channel與Sink:

source為水源,是aent獲取數據的入口;

channel為管道,是數據(由resource獲得)流動的通道,主要作用是用來傳輸和存儲數據;

sink為水槽,用來接收channel傳入的數據並將數據輸出到指定地方。 

大家可以把agent看作一個水管,source就是水管的入口,sink就是水管的出口,把數據當作水來看,數據流也就意味著水流。數據由source獲得流經channel,最後傳給sink。如圖1就演示了一個完整的agent流程,由webserver獲取數據,數據經channel流向sink,最後由sink將數據存儲在hdfs裏面。 

1.3 Flume的可靠性保證

  Flume的核心是把數據從數據源收集過來,再送到目的地。為了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地後,刪除自己緩存的數據
  Flume使用事務性的方式保證傳送Event整個過程的可靠性。Sink必須在Event被存入Channel後,或者,已經被傳達到下一站agent裏,又或者,已經被存入外部數據目的地之後,才能把Event從Channel中remove掉。這樣數據流裏的event無論是在一個agent裏還是多個agent之間流轉,都能保證可靠,因為以上的事務保證了event會被成功存儲起來。而Channel的多種實現在可恢復性上有不同的保證。也保證了event不同程度的可靠性。比如Flume支持在本地保存一份文件channel作為備份,而memory channel將event存在內存queue裏,速度快,但丟失的話無法恢復。

二、Flume基礎實踐

2.1 Flume基本安裝

  (1)下載flume的安裝包,這裏選擇的是1.4.0版本的,我已經將其上傳到了網盤中(http://pan.baidu.com/s/1kTEFUfX)

  (2)解壓縮bin與src包,並重命名

Step1.解壓縮兩個包

tar -zvxf libs/apache-flume-1.4.0-bin.tar.gz

tar -zvxf libs/apache-flume-1.4.0-src.tar.gz

Step2.將源碼包拷貝到bin目錄中

cp -ri apache-flume-1.4.0-src/* apache-flume-1.4.0-bin/

Step3.【可選】重命名為flume

mv apache-flume-1.4.0-bin flume

2.2 Flume基本配置

  本次實踐示例Source來自Spooling Directory,Sink流向HDFS。監控/root/edisonchou文件目錄下的文件,一旦有新文件,就立刻將文件內容通過agent流向HDFS的hdfs://hadoop-master:9000/testdir/edisonchou文件中。在這之前,我們需要對flume進行基本的配置。

  首先,進入flume的conf目錄下,新建一個example.conf,其對三大核心組件的配置如下:

  (1)配置source

agent1.sources.source1.type=spooldir
agent1.sources.source1.spoolDir=/root/edisonchou
agent1.sources.source1.channels=channel1
agent1.sources.source1.fileHeader = false
agent1.sources.source1.interceptors = i1
agent1.sources.source1.interceptors.i1.type = timestamp

  (2)配置channel

agent1.channels.channel1.type=file
agent1.channels.channel1.checkpointDir=/root/edisonchou_tmp/123
agent1.channels.channel1.dataDirs=/root/edisonchou_tmp/

  (3)配置sink

技術分享
agent1.sinks.sink1.type=hdfs
agent1.sinks.sink1.hdfs.path=hdfs://hadoop-master:9000/testdir/edisonchou
agent1.sinks.sink1.hdfs.fileType=DataStream
agent1.sinks.sink1.hdfs.writeFormat=TEXT
agent1.sinks.sink1.hdfs.rollInterval=1
agent1.sinks.sink1.channel=channel1
agent1.sinks.sink1.hdfs.filePrefix=%Y-%m-%d
技術分享

2.3 監控指定目錄測試

  (1)啟動hadoop,老命令:start-all.sh

  (2)新建文件夾/root/edisonchou,並在HDFS中新建目錄/testdir/edisonchou

  (3)在flume目錄中執行以下命令啟動示例agent

bin/flume-ng agent -n agent1 -c conf -f conf/example.conf -Dflume.root.logger=DEBUG,console

技術分享

  出現上圖所示時,說明agent啟動成功了。

  (4)新開一個SSH連接,在該連接中新建一個文件test,隨便寫點內容,然後將其移動到/root/edisonchou目錄中,這時再查看上一個連接中的控制臺信息如下,可以發現以下幾點信息:

技術分享

  可以發現,當我們向監控目錄/root/edisonchou中新增一個文件時,agent立即向HDFS寫入了這個文件,其中經歷了大概三步:創建、關閉、重命名。在重命名步驟中,主要是將.tmp後綴移除。下圖展示了我們向監控目錄加入的文件test已經通過agent加入了HDFS中:

  技術分享

參考資料

(1)hanlong,《Flume—開源分布式日誌收集系統》:http://www.cnblogs.com/hanganglin/articles/4224928.html

(2)windcarp,《Flume采集處理日誌文件》:http://www.cnblogs.com/windcarp/p/3872578.html

(3)我的小人生,《Flume 1.4的介紹及使用》:http://www.cnblogs.com/fuhaots2009/p/3473122.html

(4)殘夜,《Flume日誌收集》:http://www.cnblogs.com/oubo/archive/2012/05/25/2517751.html

(5)sandyfog,《Flume的概述和簡單實例》:http://www.cnblogs.com/sandyfog/p/3795967.html

(6)apache,《flume文檔》:http://flume.apache.org/documentation.html

原文鏈接:http://www.cnblogs.com/edisonchou/

Hadoop學習筆記—19.Flume框架學習