Flume的基本概念
Flume 最早是Cludera提供的日志收集系統,後貢獻給Apache。是以目前是Apache下的項目,Flume支援在日志系統中指定各類資料發送方,用于收集資料。
Flume 是一個高可用的,高可靠的,魯棒性(robust健壯性),分布式的海量日志采集、聚合和傳輸的系統,Flume支援在日志系統中定制各類資料發送方,用于收集資料(source);同時,Flume提供對資料進行簡單處理,并寫到各種資料接受仿的能力(sink)。
flume是分布式的日志收集系統,它将各個伺服器中的資料收集起來并送到指定的地方去,比如說送到圖中的HDFS,簡單來說flume就是收集日志的。
event相關概念:flume的核心是把資料從資料源(source)中收集過來,再将收集到的資料送到指定的目的地(sink)。為了保證傳輸的過程一定成功,在送到目的地之前,會先緩存資料(channel),待資料真正到達目的地(sink)後,flume再删除自己的緩存資料。
在整個資料的傳輸的過程中,流動的是event,即事務保證是在event級别進行的。那麼什麼是event呢?—–event将傳輸的資料進行封裝,是flume傳輸資料的基本機關,如果是文本檔案,通常是一行記錄,event也是事務的基本機關。event從source,流向channel,再到sink,本身為一個位元組數組,并可攜帶headers(頭資訊)資訊。event代表着一個資料的最小完整單元,從外部資料源來,向外部的目的地去。
一個完整的event包括:event headers、event body、event資訊(即文本檔案中的單行記錄),如下是以:
其中event資訊就是flume收集到的日記記錄。
flume運作的核心就是agent,agent本身是一個Java程序。
agent 裡面包含3個核心的元件:source—->channel—–>sink,類似生産者、倉庫、消費者的架構。
source:source元件是專門用來收集資料的,可以處理各種類型、各種格式的日志資料,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定義。
channel:source元件把資料收集來以後,臨時存放在channel中,即channel元件在agent中是專門用來存放臨時資料的——對采集到的資料進行簡單的緩存,可以存放在memory、jdbc、file等等。
sink:sink元件是用于把資料發送到目的地的元件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、hbase、solr、自定義。
一個完整的工作流程:source不斷的接收資料,将資料封裝成一個一個的event,然後将event發送給channel,chanel作為一個緩沖區會臨時存放這些event資料,随後sink會将channel中的event資料發送到指定的地方—-例如HDFS等。
注:隻有在sink将channel中的資料成功發送出去之後,channel才會将臨時event資料進行删除,這種機制保證了資料傳輸的可靠性與安全性。
flume之是以這麼神奇—-其原因也在于flume可以支援多級flume的agent,即flume可以前後相繼形成多級的複雜流動,例如sink可以将資料寫到下一個agent的source中,這樣的話就可以連成串了,可以整體處理了。
此外,flume還支援扇入(fan-in)、扇出(fan-out)。所謂扇入就是source可以接受多個輸入,所謂扇出就是sink可以将資料輸出多個目的地中。
置多個agent的資料流(多級流動)
資料流合并(扇入流)
在做日志收集的時候一個常見的場景就是,大量的生産日志的用戶端發送資料到少量的附屬于存儲子系統的消費者agent。例如,從數百個web伺服器中收集日志,它們發送資料到十幾個負責将資料寫入HDFS叢集的agent。
這個可在Flume中可以實作,需要配置大量第一層的agent,每一個agent都有一個avro sink,讓它們都指向同一個agent的avro source(強調一下,在這樣一個場景下你也可以使用thrift source/sink/client)。在第二層agent上的source将收到的event合并到一個channel中,event被一個sink消費到它的最終的目的地。
資料流複用(扇出流)
Flume支援多路輸出event流到一個或多個目的地。這是靠定義一個多路資料流實作的,它可以實作複制和選擇性路由一個event到一個或者多個channel。
上面的例子展示了agent foo中source扇出資料流到三個不同的channel,這個扇出可以是複制或者多路輸出。在複制資料流的情況下,每一個event被發送所有的三個channel;在多路輸出的情況下,一個event被發送到一部分可用的channel中,它們是根據event的屬性和預先配置的值選擇channel的。 這些映射關系應該被填寫在agent的配置檔案中。
可靠性
事務型的資料傳遞,保證資料的可靠性
一個日志交給flume來處理,不會出現此日志丢失或未被處理的情況。
可恢複性
通道可以以記憶體或檔案的方式實作,記憶體更快,但不可恢複。檔案較慢但提供了可恢複性。