Flume.apache.org 官方文件學習筆記 part one
Apache Flume
是一個分散式,可靠且可用的系統,用於有效地從許多不同的源收集,聚合和移動大量日誌資料到集中式資料儲存。
Apache Flume的使用不僅限於日誌資料聚合。由於資料來源是可定製的,因此Flume可用於傳輸大量事件資料,包括但不限於網路流量資料,社交媒體生成的資料,電子郵件訊息以及幾乎任何可能的資料來源。
Apache Flume是Apache Software Foundation的頂級專案。
目前有兩種版本程式碼行,版本0.9.x和1.x.
有關0.9.x軌道的文件,請參閱 Flume 0.9.x使用者指南。
本文件適用於1.4.x軌道。
鼓勵新使用者和現有使用者使用1.x版本,以便利用最新架構中提供的效能改進和配置靈活性。
系統要求: java執行時環境 - Java 1.8或更高版本 記憶體 - 源,通道或接收器使用的配置的足夠記憶體 磁碟空間 - 通道或接收器使用的配置的足夠磁碟空間 目錄許可權 - 代理使用的目錄的讀/寫許可權
架構: 資料流模型:
Flume事件被定義為具有位元組有效負載和可選字串屬性集的資料流單元。Flume代理是一個(JVM)程序,它承載事件從外部源流向下一個目標(躍點)的元件。
Flume源消耗由外部源(如Web伺服器)傳遞給它的事件。外部源以目標Flume源識別的格式向Flume傳送事件。例如,Avro Flume源可用於從Avro客戶端或從Avro接收器傳送事件的流中的其他Flume代理接收Avro事件。可以使用Thrift Flume Source定義類似的流程,以接收來自Thrift Sink或Flume Thrift Rpc客戶端或Thrift客戶端的事件,這些客戶端使用Flume thrift協議生成的任何語言編寫。當Flume源接收事件時,它將其儲存到一個或多個頻道。該通道是一個被動儲存器,可以保持事件直到它被Flume接收器消耗。檔案通道就是一個例子 - 它由本地檔案系統支援。接收器從通道中移除事件並將其放入外部儲存庫(如HDFS(通過Flume HDFS接收器))或將其轉發到流中下一個Flume代理(下一跳)的Flume源。給定代理程式中的源和接收器與通道中暫存的事件非同步執行。
複雜的流程:
Flume允許使用者構建多跳流,其中事件在到達最終目的地之前經過多個代理。它還允許扇入 和扇出流, 上下文路由和故障跳轉的備份路由(故障轉移)。
可靠性 事件在每個代理的通道中進行。然後將事件傳遞到流中的下一個代理或終端儲存庫(如HDFS)。 只有將事件儲存在下一個代理的通道或終端儲存庫中後,才會從通道中刪除這些事件。 這就是Flume中的單跳訊息傳遞語義如何提供流的端到端可靠性。
Flume使用事務方法來保證事件的可靠傳遞。源和接收器分別在事務中封裝由通道提供的事務中放置或 提供的事件的儲存/檢索。這可確保事件集在流中從一個點到另一個點可靠地傳遞。在多跳流的 情況下,來自前一跳的接收器和來自下一跳的源都執行其事務以確保資料安全地儲存在下一跳的通道中。
可恢復性¶: 事件在通道中進行,該通道管理從故障中恢復。Flume支援一個由本地檔案系統支援的持久檔案通道。 還有一個記憶體通道,它只是將事件儲存在記憶體中的佇列中,這更快,但是當代理程序死亡時仍然留在 記憶體通道中的任何事件都無法恢復。
第三方外掛目錄: $FLUME_HOME/plugins.d 在啟動的時候, flume-ng 啟動指令碼會在該目錄下查詢那些符合下述格式的外掛,並且在啟動的時候,把他們放到適當的路徑。
資料攝取:
flume支援大量的機制去讀取外部資源的資料。
RPC : flume發行版本中包含的Avro客戶端可以使用avro RPC機制 將給定檔案傳送到flume Avro源。 $ bin/flume-ng avro-client -H localhost -p 41414 -F /usr/logs/log.10
執行命令: 有一個exec源執行給定的嗎,命令並消耗輸出,輸出的單個“線”,文字後跟回車符(‘\r’),或者換行符('\n')或兩者在一起。
網路資料流: flume支援以下的這些機制去從流行的日誌流中讀取資料。例如: 1.Avro 2.Thrift 3.Syslog 4.Netcat
設定多代理流:
為了使資料能在多個代理或者多跳之間流動,以前每個代理的接收器和現在每一跳的資源都需要是Avro型別,接收器指向源的主機名和埠。
合併:
在日誌收集的一個很常見的場景是許多生產日誌的客戶端傳送資料到很少部分的連線著儲存子系統的消費代理,例如,上百個web伺服器收集的日誌被髮送到一打代理,然後寫入他們的hdfs叢集。
這在flume中是可以達到的,只要配置一些第一層代理,使用avro 接收器。所有這些都指向單個代理的avro源,(同時,你也可以使用thrift資源 接收器資源,客戶端資源)。這些被第二層代理合並的資源將接受的事件合併到單個通道中,該通道由其接收器消耗到最終的目的地。
多路複用流:
flume支援將事件流多路複用到一個或多個目的地。 這可以通過定義多路複用流實現複製或者路由一個事件到一個或者多個通道。
上面的例子展示了資源從代理foo,被扇出去,去到了三個不同的通道。這個扇出可以複製或者多路複用。在複製流的情況下,每個事件被髮送到所有三個通道。對於多路複用情況當一個事件的屬性和預配置值相匹配,這個事件被遞交給可用通道的子集。 例如,如果一個事件的屬性“txnType“被設定成”customer“,接下來,他就會去到通道1和通道3,。這個對映可以在代理的配置檔案中設定。
正如前面所提到的,Flume代理配置是從一個類似於等級屬性設定的java性質格式檔案中讀取的。
為了定義一個單個代理的flow, 你需要通過一個通道去連線資源和接收器,你需要為給出的代理列出這些資源,接收器還有通道,然後將通道和資源指向這個通道。一個實際的資源可以被指定為多路複用通道,但是一個街搜奇只能指定一個通道,格式如下:
# list the sources, sinks and channels for the agent <Agent>.sources = <Source> <Agent>.sinks = <Sink> <Agent>.channels = <Channel1> <Channel2> # set channel for source <Agent>.sources.<Source>.channels = <Channel1> <Channel2> ... # set channel for sink <Agent>.sinks.<Sink>.channel = <Channel1>
例如:一個叫做agent_foo的代理,是通過額外的avro客戶端讀取資源然後通過一個記憶體通道送到HDFS。配置檔案 weblog.config 可以這樣:
# list the sources, sinks and channels for the agent agent_foo.sources = avro-appserver-src-1 agent_foo.sinks = hdfs-sink-1 agent_foo.channels = mem-channel-1 # set channel for source agent_foo.sources.avro-appserver-src-1.channels = mem-channel-1 # set channel for sink agent_foo.sinks.hdfs-sink-1.channel = mem-channel-1