天天看點

Flume詳解

概述

最近翻Flume官網又有了新的收獲,準備對Flume進行一個詳細的描述,Fume到底是什麼,有什麼用,怎麼用,選型問題,各種參數選擇。當然對于參數的選擇作者在以前剛開始學習的時候遇到過不少坑,不同的版本參數是不一樣的,大家一定要對應着自己的版本去官網查找,官網是最權威的。有什麼不對的地方大家互相交流學習。

Flume介紹

老規矩官網位址

Flume是一種分布式,可靠,高可用的服務,用于有效地從許多不同的源端收集,聚合和移動大量日志資料到集中
式資料存儲。 它具有基于流資料流的簡單靈活的架構、它具有可靠性機制和許多故障轉移和恢複機制,具有強大
的容錯能力。 它使用簡單的可擴充資料模型,允許線上分析應用程式。
Apache Flume的使用不僅限于日志資料聚合。 由于資料源是可定制的,是以Flume可用于傳輸大量事件資料,
包括但不限于網絡流量資料,社交媒體生成的資料,電子郵件消息以及幾乎任何可能的資料源。
           

看完上面一段話相信大家可能看的也是雲裡霧裡的,最簡單的大家可以了解Flume為日志收集的工具,後面會對上面的每句話做個詳細的解讀。

Flume曆史

Flume目前有兩種版本代碼行,版本0.9.x和1.x.

0.9x以前叫做Flume OG(original generation),屬于 cloudera。但随着 FLume 功能的擴充,Flume OG 代碼工程臃腫、核心元件設計不合理、核心配置不标準等缺點暴露出來,日志傳輸不穩定的現象尤為嚴重,為了解決這些問題,1.X後對Flume進行了重構重構後的版本統稱為 Flume NG(next generation);改動的另一原因是将 Flume 納入 apache 旗下,cloudera Flume 改名為 Apache Flume。Apache Flume是Apache Software Foundation的頂級項目。

Flume産生背景

我們知道對于關系型資料庫我們可以使用sqoop進行資料的處理,導入hive,hdfs,mysql等。那對于一些日志該怎麼處理呢?(From outside To inside ),怎麼樣定時收集ng産生的日志到HDFS呢?

我們可能想到直接使用shell寫一個腳本,使用crontab進行排程,這樣不就行了嗎。。但是大家有沒有想到一個問題呢,如果日志量太大,涉及到存儲格式、壓縮格式、序列化等等一些大資料中常用的東西怎麼辦呢?要從不同的源端收集是不是要寫多個腳本呢?同樣我要存到不同的地方發該怎麼辦呢?肯定不止這些問題。是以Flume出現了來幫助我們解決這些問題。

Flume基本概念

可以參考以前的部落格部落格位址,

Flume詳解

Event: Event是Flume事件處理的最小單元,Flume在讀取資料源時,會将一行資料(也就是遇到\r\n)包裝成一個Event,它主要有倆個部分,Header和Body, Header主要是以Key,Value的形式用來記錄該資料的一些備援資訊,可用來标記資料唯一資訊,利用Header的資訊,我們可以對資料做出一些額外的操作,如對資料進行一個簡單過濾,Body則是存入真正資料的地方。

Agent: 代表一個獨立的Flume程序,包含元件Source、 Channel、 Sink。(Agent使用JVM 運作Flume。每台機器運作一個agent,但是可以在一個agent中包含多個sources、channel和sinks。)

flume之是以這麼神奇,是源于它自身的一個設計,這個設計就是agent,agent本身是一個java程序,運作在日志收集節點—所謂日志收集節點就是伺服器節點。

1. Source:負責從源端采集資料,輸出到channel中,常用的Source有exec/Spooling Directory/Taildir Source/NetCat

2. Channel:負責緩存Source端來的資料,常用的Channel有Memory/File

3. Sink:處理Channel而來的資料寫到目标端,常用的Sink有HDFS/Logger/Avro/Kafka

總結:Flume處理資料的最小單元是Event,一個Agent代表一個Flume程序,一個Agent=Source+Channel+Sink 組成。Flume牛逼之處也在于他的組成部分,可以進行各種組合選型。

講到這裡相信大家會有個簡單的了解了,下面就要對Flume介紹中說的進行詳細的剖析。

Flume特點

前面進行簡單的講解,現在我們來總結Flume具有的一些特點:

1. 可以從不同的源端收集資料;

2. 輸出結果可以到不同的地方,下一個Agent、HDFS、Kafka等。

3. 架構簡單靈活,可配置化,可插拔

4. 有多種Interceptor可供選擇

5. 具有可靠性和可恢複性

6. 具有容錯機制和負載均衡機制(Flume Sink Processors)

7. 具有複制和多路複用機制(flume channel selectors)

Flume詳細剖析

對于分布式我們這裡就不多說了,大資料場景下必然是的。我們重點講解下高可靠,高可用,怎麼達到可靠,高可用。

可靠性

Flume可靠性:Flume 使用事務性的方式保證傳送Event整個過程的可靠性。 Sink 必須在Event 被存入 Channel 後,或者,已經被傳達到下一站agent裡,又或者已經被存入外部資料目的地之後,才能把 Event 從 Channel 中 remove 掉。這樣資料流裡的 event 無論是在一個 agent 裡還是多個 agent 之間流轉,都能保證可靠,因為以上的事務保證了 event 會被成功存儲起來。這就保證了端到端的可靠性。比如 Flume支援在本地儲存一份檔案 channel 作為備份,而memory channel 将event存在記憶體 queue 裡,速度快,但丢失的話無法恢複,是以channel的選型,維護也很重要。

flume使用這種事物的方式保證events傳輸的可靠性是以這就不得不提Flume的事務機制(類似資料庫的事務機制):Flume使用兩個獨立的事務分别負責從soucrce到channel,以及從channel到sink的事件傳遞。

比如spooling directory source 為檔案的每一行建立一個事件,一旦事務中所有的事件全部傳遞到channel且送出成功,那麼source就将該檔案标記為完成。同理,事務以類似的方式處理從channel到sink的傳遞過程,如果因為某種 原因使得事件無法記錄,那麼事務将會復原。且所有的事件都會保持到channel中,等待重新傳遞。

可恢複性

events被存儲在channel裡面,如果flume挂了可以從channel中恢複,保證資料不會丢失(不是絕對的),你可以選擇不同類型的channel根據業務需求,例如file channel存儲在本地磁盤,可以保證資料不會丢失,

也有memory channel,他簡單将event存儲在記憶體隊列中,速度快,但是agent挂掉可能會使得緩存在記憶體中的資料丢失。

總的來說Flume整體架構的設計和選型(扇入,扇出),使得它具有可靠性和可恢複性。以及後面還會講解的

Flume Sink Processors

flume channel selectors

也是很重要的一點。

講到這裡大家就可以先進行簡單的操作了,官網也有些例子,對于新手來說看起來還是比較吃力的,可以參考我以前寫的部落格Flume基本操作和flume常用場景。大家一定要自己去練習。

架構

未完待續…(最近工作任務稍多,後面會繼續怼)