大數據雲計算——Flume組件

Flume 就是實時的讀取文件夾的內容,並將數據存儲在HDFS中。讀取文件,和端口數據。

Flume是一種分佈式,可靠且可用的服務,用於有效地收集,聚合和移動大量日誌數據。Flume構建在日誌流之上一個簡單靈活的架構。它具有可靠的可靠性機制和許多故障轉移和恢復機制,具有強大的容錯性。使用Flume這套架構實現對日誌流數據的實時在線分析。Flume支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。

 

5.1Flume的原理

flume的核心是把數據從數據源(source)收集過來,在將收集到的數據送到指定的目的地(sink)。這了保證數據傳輸過程的成功率,在送到目的地(sink)之前,會先緩存數據(channel),待數據真正到達目的地(sink)後,flume纔會刪除緩存的數據。在整個數據傳輸的過程中,流動的是event,即事務保證是在event級別,event是flume傳輸數據的基本單元,如果是文本文件,通常是一條記錄,event也是事務的基本單位。event從source, 流向channel,再到sink,其本身是一個字節數組,並可攜帶頭信息(headers)。event代表着一個數據的最小完整單元,從外部數據源來,向外部目的地去。

常用的組件:

Source(採集外圍數據)

Avro Source :使用AVRO協議遠程收集數據。

Thrift Source:使用Thrift協議遠程收集數據。

Exec Source:可以講控制檯輸出數據採集到Agent。

Spooling Directory Source:採集指定目錄下的靜態數據。

Taildir Source:動態採集文本日誌文件中新產生的行數據。

Kafka Source:採集來自Kafka消息隊列中的數據。

Sink(寫出數據):

Avro Sink:使用AVRO協議將數據寫出給Avro Source|Avro服務器。

Thrift Sink:使用Thrift協議將數據寫出給Thrift Source|Thrift 服務器。

HDFS Sink:將採集的數據直接寫入HDFS中。

File Roll Sink:將採集的數據直接寫入本地文件中。

Kafka Sink:將採集的數據直接寫入Kafka中。

Channel(緩衝數據):

Memory Channel:使用內存緩存Event

JDBC Channel:使用Derby嵌入式數據庫文件緩存Event

Kafka Channel:使用Kafka緩存Event

File Channel:使用本地文件系統緩存Event

flume的核心就是一個agent,這個agent對外有兩個進行交互的地方,一個是接收數據的輸入(Source),一個是數據的輸出(sink),Sink負責將數據發送到外部指定的目的地。其運行機制如下:source接收到數據後,將數據發送給channel, channel作爲一個數據緩衝區會臨時存放這些數據,隨後sink會將channel中的數據發送到指定的地方。(注:只有在sink將channel中的數據成功發出去以後,channel纔會將臨時數據進行刪除,這種機制保證了數據傳輸的可靠性與安全性。)

5.2Flume事務處理

5.3Flume Agent原理

重要組件:

1) ChannelSelector

ChannelSelector 的作用就是選出 Event 將要被髮往哪個 Channel。其共有兩種類型,分別是 Replicating(複製)和 Multiplexing(多路複用)。

ReplicatingSelector 會將同一個 Event 發往所有的 Channel, Multiplexing 會根據相應的原則,將不同的 Event 發往不同的 Channel。

2) SinkProcessor

SinkProcessor 共 有 三 種 類 型 , 分 別 是 DefaultSinkProcessor 、LoadBalancingSinkProcessor 和 FailoverSinkProcessor、DefaultSinkProcessor 對 應 的 是 單 個 的 Sink , LoadBalancingSinkProcessor 和FailoverSinkProcessor 對應的是 Sink Group, LoadBalancingSinkProcessor 可以實現負載均衡的功能, FailoverSinkProcessor 可以實現故障轉移的功能。

5.4Flume 拓撲結構

Flume存在的單點故障,所以只能用的備份的一種機制。多個Flume讀取一個文件。

如果是跨機器的採集,採用的是多個Flume的聚合。

Flume 支持將事件流向一個或者多個目的地。這種模式可以將相同數據複製到多個,channel 中,或者將不同數據分發到不同的 channel 中, sink 可以選擇傳送到不同的目的地

Flume支持使用將多個sink邏輯上分到一個sink組, sink組配合不同的SinkProcessor

可以實現負載均衡和錯誤恢復的功能。

這種模式是我們最常見的,也非常實用,日常 web 應用通常分佈在上百個服務器,大者,甚至上千個、上萬個服務器。產生的日誌,處理起來也非常麻煩。用 flume 的這種組合方式能很好的解決這一問題, 每臺服務器部署一個 flume 採集日誌,傳送到一個集中收集日誌的flume,再由此 flume 上傳到 hdfs、 hive、 hbase 等,進行日誌分析。

5.5Flume 自定義的攔截器

在實際的開發中,一臺服務器產生的日誌類型可能有很多種,不同類型的日誌可能需要發送到不同的分析系統。此時會用到 Flume 拓撲結構中的 Multiplexing 結構, Multiplexing的原理是,根據 event 中 Header 的某個 key 的值,將不同的 event 發送到不同的 Channel

中,所以我們需要自定義一個 Interceptor,爲不同類型的 event 的 Header 中的 key 賦予不同的值。在該案例中,我們以端口數據模擬日誌,以數字(單個)和字母(單個)模擬不同類型的日誌,我們需要自定義 interceptor 區分數字和字母,將其分別發往不同的分析系統(Channel)。

5.6自定義Source

Source 是負責接收數據到 Flume Agent 的組件。 Source 組件可以處理各種類型、各種

格式的日誌數據,包括 avro、thrift、exec、jms、spooling directory、netcat、sequence、generator、syslog、http、legacy。官方提供的source 類型已經很多,但是有時候並不能滿足實際開發當中的需求,此時我們就需要根據實際需求自定義某些 source。

實現相應方法:

getBackOffSleepIncrement()//暫不用

getMaxBackOffSleepInterval()//暫不用

configure(Context context)//初始化 context(讀取配置文件內容)

process()//獲取數據封裝成 event 並寫入 channel,這個方法將被循環調用。

使用場景:讀取 MySQL 數據或者其他文件系統。

5.7自定義 Sink

Sink 不斷地輪詢 Channel 中的事件且批量地移除它們,並將這些事件批量寫入到存儲或索引系統、或者被髮送到另一個 Flume Agent。

Sink 是完全事務性的。在從 Channel 批量刪除數據之前,每個 Sink 用 Channel 啓動一

個事務。批量事件一旦成功寫出到存儲系統或下一個 Flume Agent, Sink 就利用 Channel 提交事務。事務一旦被提交,該 Channel 從自己的內部緩衝區刪除事件。

Sink 組件目的地包括 hdfs、logger、avro、thrift、ipc、file、null、HBase、solr、自定義。官方提供的 Sink 類型已經很多,但是有時候並不能滿足實際開發當中的需求,此時我們就需要根據實際需求自定義某些 Sink。官方也提供了自定義 sink 的接口:https://flume.apache.org/FlumeDeveloperGuide.html#sink 根據官方說明自定義MySink 需要繼承 AbstractSink 類並實現 Configurable 接口。

實現相應方法:

configure(Context context)//初始化 context(讀取配置文件內容)

process()//從 Channel 讀取獲取數據(event),這個方法將被循環調用。

使用場景:讀取 Channel 數據寫入 MySQL 或者其他文件系統。

5.8Flume 數據流監控

Ganglia 由 gmond、 gmetad 和 gweb 三部分組成。

gmond(Ganglia Monitoring Daemon)是一種輕量級服務,安裝在每臺需要收集指標數據的節點主機上。使用 gmond,你可以很容易收集很多系統指標數據,如 CPU、內存、磁盤、網絡和活躍進程的數據等。

gmetad(Ganglia Meta Daemon)整合所有信息,並將其以 RRD 格式存儲至磁盤的服務。

gweb(Ganglia Web) Ganglia 可視化工具, gweb 是一種利用瀏覽器顯示 gmetad 所存儲數據的 PHP 前端。在 Web 界面中以圖表方式展現集羣的運行狀態下收集的多種不同指標數據

5.9Flume的面試題目:

Flume 的 Source, Sink, Channel 的作用?你們 Source 是什麼類型?

1、Source 組件是專門用來收集數據的,可以處理各種類型、各種格式的日誌數據,包括 avro、 thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、 legacy

2、Channel 組件對採集到的數據進行緩存,可以存放在 Memory 或 File 中。

3、Sink 組件是用於把數據發送到目的地的組件,目的地包括 HDFS、 Logger、 avro、thrift、 ipc、file、Hbase、solr自定義。

2、我公司採用的 Source 類型爲:

(1)監控後臺日誌: exec

(2)監控後臺產生日誌的端口: netcat Exec spooldir

Flume 的 Channel Selectors

Channel Selectors, 可以讓不同的項目日誌通過不同的Channel到不同的Sink中去。

官方文檔上Channel Selectors 有兩種類型:Replicating Channel Selector (default)和

Multiplexing Channel Selector

這兩種Selector的區別是:Replicating 會將source過來的events發往所有channel,而

Multiplexing可以選擇該發往哪些Channel。

Flume 參數調優

1. Source

增加 Source個(使用TairDir Source 時可增加 FileGroups個數)可以增大 Source 的讀

取數據的能力。例如:當某一個目錄產生的文件過多時需要將這個文件目錄拆分成多個文件

目錄,同時配置好多個 Source 以保證 Source 有足夠的能力獲取到新產生的數據。batchSize 參數決定 Source 一次批量運輸到 Channel 的 event 條數,適當調大這個參數可以提高 Source 搬運 Event 到 Channel 時的性能。

2. Channel

type 選擇 memory 時 Channel 的性能最好,但是如果 Flume 進程意外掛掉可能會丟失數據。type 選擇 file 時 Channel 的容錯性更好,但是性能上會比 memory channel 差。使用 file Channel 時 dataDirs 配置多個不同盤下的目錄可以提高性能。Capacity 參數決定 Channel 可容納最大的 event 條數。 transactionCapacity 參數決定每次 Source 往 channel 裏面寫的最大 event 條數和每次 Sink 從 channel 裏面讀的最大 event條數。 transactionCapacity 需要大於 Source 和 Sink 的 batchSize 參數。

3. Sink

增加 Sink 的個數可以增加 Sink 消費 event 的能力。 Sink 也不是越多越好夠用就行,過

多的 Sink 會佔用系統資源,造成系統資源不必要的浪費。

batchSize 參數決定 Sink 一次批量從 Channel 讀取的 event 條數,適當調大這個參數可

以提高 Sink 從 Channel 搬出 event 的性能。

Flume 的事務機制

Flume的事務機制(類似數據庫的事務機制):Flume 使用兩個獨立的事務分別負責從Soucrce 到 Channel,以及從 Channel 到 Sink 的事件傳遞。比如 spooling directory source

爲文件的每一行創建一個事件,一旦事務中所有的事件全部傳遞到 Channel 且提交成功,那

麼 Soucrce 就將該文件標記爲完成。同理,事務以類似的方式處理從 Channel 到 Sink 的傳遞過程,如果因爲某種原因使得事件無法記錄,那麼事務將會回滾。且所有的事件都會保持

到 Channel 中,等待重新傳遞。

Flume 採集數據會丟失嗎?

根據 Flume 的架構原理,Flume 是不可能丟失數據的,其內部有完善的事務機制,Source 到 Channel 是事務性的, Channel 到 Sink 是事務性的,因此這兩個環節不會出現數據的丟失,唯一可能丟失數據的情況是 Channel 採用 memoryChannel, agent 宕機導致數據丟失,或者 Channel 存儲數據已滿,導致 Source 不再寫入,未寫入的數據丟失。Flume 不會丟失數據,但是有可能造成數據的重複,例如數據已經成功由 Sink 發出,但是沒有接收到響應, Sink 會再次發送數據,此時可能會導致數據的重複。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章