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。