本文是大数据系列第 17 篇,介绍分布式日志采集系统 Apache Flume 的架构设计与核心概念。
Flume 是什么
Apache Flume 是一个分布式、高可靠的日志采集系统,专为大数据场景下的实时数据传输而设计。它能够从多种数据源(日志文件、网络端口、消息队列等)采集数据,并汇聚传输到 HDFS、HBase、Kafka 等存储系统。
典型使用场景:服务器日志 → Flume → HDFS,再由 Hive/MapReduce 进行离线分析。
核心组件
Flume 的每个运行实例称为一个 Agent,是一个独立的 JVM 进程。每个 Agent 由三个核心组件构成:
| 组件 | 作用 | 常见类型 |
|---|---|---|
| Source | 从外部接收数据 | netcat、exec、spooldir、taildir、kafka、http |
| Channel | 缓冲 Source 与 Sink 之间的数据 | memory、file |
| Sink | 将数据写出到目标系统 | hdfs、hbase、kafka、logger、avro |
Event(事件) 是 Flume 中最小的数据传输单元,由两部分组成:
headers:键值对形式的元数据body:字节数组形式的实际内容
Channel 对比
| 特性 | Memory Channel | File Channel |
|---|---|---|
| 存储位置 | JVM 堆内存 | 磁盘文件 |
| 性能 | 高 | 较低 |
| 可靠性 | 进程崩溃时数据丢失 | 持久化,可恢复 |
| 适用场景 | 允许少量数据丢失的高吞吐场景 | 要求数据不丢失的生产场景 |
数据处理扩展
除基础三组件外,Flume 还支持:
- Interceptor(拦截器):在 Source 采集后、写入 Channel 前对 Event 进行预处理,如过滤、修改 header、添加时间戳等
- Channel Selector:决定 Event 路由到哪些 Channel(Replicating 复制 / Multiplexing 分流)
- Sink Processor:管理多个 Sink 的负载均衡或故障切换策略
数据流拓扑
串行模式
多个 Flume Agent 级联,上游 Agent 的 Sink 连接下游 Agent 的 Source(通过 Avro 协议),实现数据的逐级传递。
Server A (exec source) → Avro Sink → Avro Source → HDFS Sink
优点:解耦采集与存储;缺点:链路过长时性能下降,存在单点风险。
复制模式(Replicating)
一个 Source 将数据同时写入多个 Channel,每个 Channel 对应不同的 Sink 目标,实现数据的多路分发:
Source → Channel Selector (replicating) → Channel1 → HDFS Sink
→ Channel2 → Kafka Sink
负载均衡模式
多个 Sink 组成一个 SinkGroup,由 Sink Processor 按轮询或随机策略分配数据,提升写出吞吐量。
安装配置
以 Flume 1.9.0 为例,解压后配置环境变量:
export FLUME_HOME=/opt/wzk/flume
export PATH=$PATH:$FLUME_HOME/bin
复制并编辑环境配置文件,必须显式声明 JAVA_HOME,否则启动报错:
cp $FLUME_HOME/conf/flume-env.sh.template $FLUME_HOME/conf/flume-env.sh
# 在 flume-env.sh 中添加:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
验证安装:
flume-ng version