【Java】Appache Flume 中文介紹
Flume 是什麼
Apache Flume是一個高可靠、高可用的分散式的海量日誌收集、聚合、傳輸系統。它可以從不同的日誌源採集資料並集中儲存。
Flume也算是Hadoop生態系統的一部分,源於Cloudera,目前是Apache基金會的頂級專案之一。Flume有兩條產品線,0.9.x版本和1.x版本。
官網:http://flume.appache.org/
- 收集、聚合事件流資料的分散式框架
- 通常用於log資料
- 採用ad-hoc方案,明顯優點如下:
- 可靠的、可伸縮、可管理、可定製、高效能
- 宣告式配置,可以動態更新配置
- 提供上下文路由功能
- 支援負載均衡和故障轉移
- 功能豐富
- 完全的可擴充套件
- Event
- Client
- Agent
- Sources、Channels、Sinks
- 其他元件:Interceptors、Channel Selectors、Sink Processor
Event是Flume資料傳輸的基本單元。flume以事件的形式將資料從源頭傳送到最終的目的。Event由可選的hearders和載有資料的一個byte array構成。
- 載有的資料對flume是不透明的
- Headers是容納了key-value字串對的無序集合,key在集合內是唯一的。
- Headers可以在上下文路由中使用擴充套件
- public
- public Map<String, String> getHeaders();
- publicvoid setHeaders(Map<String, String> headers);
- publicbyte[] getBody();
- publicvoid setBody(byte[] body);
- }
public interface Event { public Map<String, String> getHeaders(); public void setHeaders(Map<String, String> headers); public byte[] getBody(); public void setBody(byte[] body); }
核心概念:Client
Clinet是一個將原始log包裝成events並且傳送它們到一個或多個agent的實體。
- 例如
- Flume log4j Appender
- 可以使用Client SDK (org.apache.flume.api)定製特定的Client
- 目的是從資料來源系統中解耦Flume
- 在flume的拓撲結構中不是必須的
核心概念:Agent
一個Agent包含Sources, Channels, Sinks和其他元件,它利用這些元件將events從一個節點傳輸到另一個節點或最終目的。
- agent是flume流的基礎部分。
- flume為這些元件提供了配置、生命週期管理、監控支援。
核心概念:Source
Source負責接收events或通過特殊機制產生events,並將events批量的放到一個或多個Channels。有event驅動和輪詢2種類型的Source
- 不同型別的Source:
- 和眾所周知的系統整合的Sources: Syslog, Netcat
- 自動生成事件的Sources: Exec, SEQ
- 用於Agent和Agent之間通訊的IPC Sources: Avro
- Source必須至少和一個channel關聯
Channel位於Source和Sink之間,用於快取進來的events,當Sink成功的將events傳送到下一跳的channel或最終目的,events從Channel移除。
- 不同的Channels提供的持久化水平也是不一樣的:
- Memory Channel: volatile
- File Channel: 基於WAL(預寫式日誌Write-Ahead Logging)實現
- JDBC Channel: 基於嵌入Database實現
- Channels支援事務
- 提供較弱的順序保證
- 可以和任何數量的Source和Sink工作
核心概念:Sink
Sink負責將events傳輸到下一跳或最終目的,成功完成後將events從channel移除。
- 不同型別的Sinks:
- 儲存events到最終目的的終端Sink. 比如: HDFS, HBase
- 自動消耗的Sinks. 比如: Null Sink
- 用於Agent間通訊的IPC sink: Avro
- 必須作用與一個確切的channel
- 可靠性基於:
- Agent間事務的交換
- Flow中,Channel的持久特性
- 可用性:
- 內建的Load balancing支援
- 內建的Failover支援
核心概念:Interceptor
用於Source的一組Interceptor,按照預設的順序在必要地方裝飾和過濾events。
- 內建的Interceptors允許增加event的headers比如:時間戳、主機名、靜態標記等等
- 定製的interceptors可以通過內省event payload(讀取原始日誌),在必要的地方建立一個特定的headers。
Channel Selector允許Source基於預設的標準,從所有Channel中,選擇一個或多個Channel
- 內建的Channel Selectors:
- 複製Replicating: event被複制到相關的channel
- 複用Multiplexing: 基於hearder,event被路由到特定的channel
多個Sink可以構成一個Sink Group。一個Sink Processor負責從一個指定的Sink Group中啟用一個Sink。Sink Processor可以通過組中所有Sink實現負載均衡;也可以在一個Sink失敗時轉移到另一個。
- Flume通過Sink Processor實現負載均衡(Load Balancing)和故障轉移(failover)
- 內建的Sink Processors:
- Load Balancing Sink Processor – 使用RANDOM, ROUND_ROBIN或定製的選擇演算法
- Failover Sink Processor
- Default Sink Processor(單Sink)
- 所有的Sink都是採取輪詢(polling)的方式從Channel上獲取events。這個動作是通過Sink Runner啟用的
- Sink Processor充當Sink的一個代理