Flume

Flume 是 Apache 开源的分布式日志采集系统,专为将海量日志数据从各类数据源可靠地传输到 HDFS、Kafka、HBase 等存储系统而设计。核心模型是 Source → Channel → Sink 的流水线。


核心组件

数据源(Web Server / App)
      │
      ▼
   Source(采集数据)
      │
      ▼
   Channel(缓冲,保证可靠性)
      │
      ▼
    Sink(写出到目标存储)
      │
      ▼
  HDFS / Kafka / HBase
组件作用常见实现
Source接收外部数据Taildir(监听文件)、Avro、Kafka、HTTP
Channel数据缓冲,解耦 Source 和 SinkMemory Channel(高吞吐)、File Channel(可靠)
Sink将数据写出到目标HDFS Sink、Kafka Sink、Logger Sink

配置示例

监听日志文件变化,写入 HDFS:

agent.sources  = tailSource
agent.channels = memChannel
agent.sinks    = hdfsSink
 
# Source:监听日志目录(断点续传)
agent.sources.tailSource.type           = TAILDIR
agent.sources.tailSource.filegroups     = f1
agent.sources.tailSource.filegroups.f1  = /var/log/app/.*\\.log
agent.sources.tailSource.positionFile   = /tmp/flume_position.json
agent.sources.tailSource.channels       = memChannel
 
# Channel:内存缓冲
agent.channels.memChannel.type                 = memory
agent.channels.memChannel.capacity            = 10000
agent.channels.memChannel.transactionCapacity = 1000
 
# Sink:写入 HDFS,按小时分目录
agent.sinks.hdfsSink.type              = hdfs
agent.sinks.hdfsSink.hdfs.path         = hdfs://namenode:9000/logs/%Y-%m-%d/%H
agent.sinks.hdfsSink.hdfs.fileType     = DataStream
agent.sinks.hdfsSink.hdfs.rollInterval = 3600
agent.sinks.hdfsSink.hdfs.rollSize     = 134217728
agent.sinks.hdfsSink.hdfs.rollCount    = 0
agent.sinks.hdfsSink.channel           = memChannel

启动 Agent:

flume-ng agent \
  --conf /etc/flume/conf \
  --conf-file /etc/flume/conf/app-to-hdfs.conf \
  --name agent \
  -Dflume.root.logger=INFO,console

多 Agent 级联

大规模场景下将多个 Flume Agent 串联,汇聚后统一写出:

App Server 1 → Agent1 (Avro Sink) ─┐
App Server 2 → Agent2 (Avro Sink) ─┼→ 汇聚 Agent → HDFS
App Server 3 → Agent3 (Avro Sink) ─┘

Channel 选型

Channel优点缺点适用场景
Memory高吞吐,低延迟Agent 崩溃数据丢失允许少量丢失
File持久化,可靠磁盘 I/O,吞吐较低不允许丢失
Kafka分布式,高吞吐,可回溯依赖 Kafka 集群与 Kafka 集成

相关链接

  • HDFS — Flume 最常见的写出目标
  • Hadoop — HDFS 所在的大数据生态
  • Hive — Flume 采集的数据经 HDFS 后可用 Hive 分析
  • Flink — 实时场景下可用 Flink 替代 Flume 做流式采集处理