阿里大資料工程師教你怎樣理解Flume

程式設計師OfHome發表於2018-04-14

lume是幹什麼的?

收集日誌的

flume如何蒐集日誌?

我們把flume比作情報人員

(1)蒐集資訊

(2)獲取記憶資訊

(3)傳遞報告間諜資訊

flume是怎麼完成上面三件事情的,三個元件:

source: 蒐集資訊

channel:傳遞資訊

sink:儲存資訊

flume OG(original generation初始版本)和NG(next generation,cdh4以及之後的版本)

Flume OG 程式碼工程臃腫、核心元件設計不合理、核心配置不標準等

Flume OG 有三種角色節點:agent、collector、master節點。

Flume NG 只有一種角色的節點:代理節點(agent),去掉了 collector、master 節點,這是核心元件最核心的變化。

agent 節點的組成也發生了變化,由 source、sink、channel 組成。

NG要求jdk1.6以上,而且只有linux上的啟動指令碼

OG版本已經不更新了

NG的核心元件:

source:完成對日誌資料的收集,分成transition和event打入到channel中。

source有多種實現包括AvroSource(監控埠)、NetCat Source、Syslog Source、Syslog TCP Source、Syslog UDP Source、Http Source、HDFS Source、Spooling Directory Source(對目錄下新增檔案的監控,並讀取檔案資料)、Exec Source(以執行linux命令的方式,持續輸出最新資料,如tail -F)等

flume可以和log4j配合使用

sink:取出channel中的資料,輸出到儲存檔案系統,資料庫,或遠端伺服器

多種實現方式如Avro sink、HDFS Sink、HBase Sink、Logger Sink(測試用,後臺列印)

小資料可以儲存在檔案或資料庫中,海量資料(每天GB、TB級別的資料)儲存到hadoop中

Channel:管道,提供一個佇列的功能,對source提供的資料進行簡單快取

實現由Memory/File/jdbc channel,Memory無法保證資料完成性,官方建議使用File Channel,保證資料完整性和一致性

Flow Pipeline

1、多個Agent順序連線

2、多個Agent的資料匯聚到同一個Agent

3、多路(一個agent上有多個channel)(Multiplexing)Agent

這種模式,有兩種方式,一種是用來複制(Replication),另一種是用來分流(Multiplexing)。Replication方式,可以將最前端的資料來源複製多份,分別傳遞到多個channel中,每個channel接收到的資料都是相同的;Multiplexing方式,selector可以根據header的值來確定資料傳遞到哪一個channel

4、實現load balance功能

5、實現failover功能

flume source

Avro Source:接收外部avro客戶端的事件

Thrift Source:接收外部thrift客戶端的事件

Exec Source:接收來自一個給定的Unix命令的標準輸出上的資料

Jms Source:接收來自訊息佇列的事件

NetCat Source:netcat在一端偵聽,每一行文字變成一個事件源

Spooling Directory Source:以目錄中檔案內容為事件源

SequenceGenerator Source:一個簡單地序列生成器,主要用於測試

Syslog Source:讀取syslog資料

SyslogUDP Source

SyslogTCP Source

Multiport Syslog TCP Source

Http Source:接收http post,get事件,get只用於試驗

Custom Source:自定義source

flume sink

HDFS Sink將事件寫入到hadoop分散式檔案系統HDFS

Logger sink 通常用於除錯、測試

Avro sink 可以批量傳送,可以配置批量大小

Thrift sink

IRC sink 從通道中取得資訊到irc server

File Roll sink儲存檔案到本地檔案系統中

Null sink丟棄從通道接收的所有事件

HBase sink將資料寫入到hbase中

AsyncHbase sink非同步方式將資料寫入到hbase中

Custom sink 自定義sink

flume channel

Memory channel 時間儲存在一個可配置的最大尺寸的記憶體中的佇列;速度快,吞吐量大,但是代理出現故障時資料丟失

JDBC channel 時間儲存在資料庫中

File channel 不同的file channel應該寫到不同的磁碟上,避免單磁碟io過大

Pseudo Thansaction channel 用於測試

Custom channel 自定義channel

flume channel selector

Replicating channel selector (default) 複製,相同的資料傳送到多個channel

Multiplexing channel selector 複用,以header區分一個event傳送到哪個channel

Custom channel selector 自定義channel selector

資料通訊系統或計算機網路系統中,傳輸媒體的頻寬或容量往往會大於傳輸單一訊號的需求,為了有效地利用通訊線路,希望一個通道同時傳輸多路訊號,這就是所謂的多路複用技術(Multiplexing)。採用多路複用技術能把多個訊號組合起來在一條物理通道上進行傳輸,在遠距離傳輸時可大大節省電纜的安裝和維護費用。

Flume sink processor

Default sink processor

Failover sink processor 故障轉移(主備)

Load balancing sink processor 負載均衡:輪詢round_robin或隨機random

flume interceptor

攔截器主要是對事件的header資訊資訊操作,要麼直接忽略他,要麼修改他的資料

一、Event Serializers

file_roll sink 和hdfs sink 都支援EventSerializer介面

Body TextSerializer,別名:text。這個攔截器將把事件的body部分寫入到輸出流中而不需要任何轉換或者修改。事件的header將直接被忽略。

Avro Event Serializer別名:avro_event。這個攔截器將把事件序列化到一個Avro容器檔案中。使用的模式和RPC Avro機制使用到的處理flume事件的機制一樣。這個序列化器繼承自AbstractAvroEventSerializer類。

二、Timestamp Interceptor

Flume 可以在事件傳輸過程中對它進行修改與刪除,而這個都是通過Interceptor進行實現的,實際都是往事件的header裡插資料。而Timestamp Interceptor攔截器就是可以往event的header中插入關鍵詞為timestamp的時間戳。

三、Host Interceptor

該攔截器可以往event的header中插入關鍵詞預設為host主機名或者ip地址(注意是agent執行的機器的主機名或者ip地址)

四、Static Interceptor

Static Interceptor攔截器允許使用者增加一個static的header併為所有的事件賦值。範圍是所有事件。

五、Regex FilteringInterceptor

Regex Filtering Interceptor攔截器用於過濾事件,篩選出與配置的正規表示式相匹配的事件。可以用於包含事件和排除事件(include 或者是exclude)。常用於資料清洗,通過正規表示式把資料過濾出來。

flume開發

1、RPC

flume雖然包含一些內部機制來採集資料,但是有時候使用者希望能將應用程式和flume直接相通。flume client是一個庫,允許應用程式連結flume和通過rpc往flume傳送資料。

avro是flume預設的rpc協議

2、Transaction

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

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

3、Source

4、Sink

最佳實踐

參考基於Flume的美團日誌收集系統(一)架構和設計,列出一些最佳實踐:

模組命名規則:所有的 Source 以 src 開頭,所有的 Channel 以 ch 開頭,所有的 Sink 以 sink 開頭;

模組之間內部通訊統一使用 Avro 介面;

將日誌採集系統系統分為三層:Agent 層,Collector 層和 Store 層,其中 Agent 層每個機器部署一個程式,負責對單機的日誌收集工作;Collector 層部署在中心伺服器上,負責接收Agent層傳送的日誌,並且將日誌根據路由規則寫到相應的 Store 層中;Store 層負責提供永久或者臨時的日誌儲存服務,或者將日誌流導向其它伺服器。

擴充套件 MemoryChannel 和 FileChannel ,提供 DualChannel 的實現,以提供高吞吐和大快取

監控 collector HdfsSink寫資料到 hdfs 的速度、FileChannel 中擁堵的 events 數量,以及寫 hdfs 狀態(檢視是否有 .tmp 檔案生成)

PS:

關注微信公眾號“程式設計師OfHome”,傳送“領取資料”可以免費領取視訊資料。

對大資料感興趣的朋友可以加入到我們的程式設計師OfHomeQQ群:610535338 群裡有都是從事或者在學習大資料的朋友,在此我也邀請你進群一起學習,群內沒有廣告,也是禁止打廣告的,大家也可以關注一下我的微信公共號“程式設計師OfHome”下方掃掃可關注。




相關文章