Apache Flume是一個分布式、可靠和高可用的系統,可以從大量不同的數據源有效地收集、聚合和移動日志數據,從而集中式的存儲數據。

使用場景

Flume使用最多的場景是日志收集,也可以通過定制Source來傳輸其他不同類型的數據。

Flume最終會將數據落地到實時計算平臺(例如Flink、Spark Streaming和Storm)、離線計算平臺上(例如MR、Hive和Presto),也可僅落地到數據存儲系統中(例如HDFS、OSS、Kafka和Elasticsearch),為后續分析數據和清洗數據做準備。flume2

架構

Flume Agent是一個Flume的實例,本質是一個JVM進程,控制Event數據流從生產者傳輸到消費者。一個Flume Agent由Source、Channel、Sink組成。其中,Source和Channel可以是一對多的關系,Channel和Sink也可以是一對多的關系。flume

基本概念

名稱 描述
Event 是數據流通過Flume Agent的基本單位。Event由一個可選的Header字典和一個裝載數據的字節數組組成。
示例如下。
--------------------------------
| Header (Map) | Body (byte[]) |
--------------------------------
               Flume Event
Source 是數據源收集器,從外部數據源收集數據,并批量發送到一個或多個Channel中。
常見Source如下:
  • Avro Source:通過監聽Avro端口獲取Avro Client發送的事件。Avro是Hadoop提供的一種協議,用于數據序列化。
  • Exec Source:通過監聽命令行輸出獲取數據,例如tail -f /var/log/messages
  • NetCat TCP Source:監聽指定TCP端口獲取數據,與Netcat UDP Source類似。
  • Taildir Source:監控目錄下的多個文件,記錄偏移量,并且不會丟失數據,較為常用。
Channel 是Source和Sink之間的緩沖隊列。
常見Channel如下:
  • Memory Channel:緩存到內存中,性能高,較為常用。
  • File Channel:緩存到文件中,會記錄Checkpoint和DATA文件,可靠性高,但性能較差。
  • JDBC Channel:緩存到關系型數據庫中。
  • Kafka Channel:通過Kafka來緩存數據。
Sink 從Channel中獲取Event,并將以事務的形式Commit到外部存儲中。一旦事務Commit成功,該Event會從Channel中移除。
常見Sink如下:
  • Logger Sink:用于測試。
  • Avro Sink:轉換成Avro Event,主要用于連接多個Flume Agent。
  • HDFS Sink:寫入HDFS,較為常用。
  • Hive Sink:寫入Hive表或分區,使用Hive事務寫Events。
  • Kafka Sink:寫入Kafka。