CodeWalk

Canal与Flume在ETL中的角色

作者:我还是少年 · 2026-05-30 12:55

请说明Canal和Flume在数据采集(ETL)中的不同角色,以及各自的典型使用场景。

回答

我还是少年

Canal(阿里巴巴开源):

定位: MySQL Binlog增量抓取工具

工作原理:

  1. 伪装为MySQL Slave: Canal模拟MySQL Slave的交互协议
  2. 拉取Binlog: 从MySQL Master拉取Binlog日志
  3. 解析: 将Binlog解析为结构化数据(Insert/Update/Delete + 行数据)
  4. 投递: 投递到Kafka/RocketMQ/ES/HBase等

典型场景:

  1. 业务数据库CDC(Change Data Capture): 将MySQL变更实时同步到HBase/ES/Redis
  2. 实时数仓: 采集MySQL Binlog到Kafka → Flink实时计算
  3. 缓存更新: MySQL数据变更后自动更新Redis/ES缓存
  4. 异地多活: 数据库双向同步

配置示例:

# canal.properties
canal.destinations=example
# instance.properties
canal.instance.master.address=127.0.0.1:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.filter.regex=.*\\..*  # 监听所有表

Flume(Apache/Hadoop生态):

定位: 日志数据的批量采集和聚合工具

工作流程:

Source (数据源) → Channel (缓冲区) → Sink (输出)

组件:

  • Source: TailDir、SpoolDir、Kafka、Syslog、NetCat
  • Channel: Memory(内存)、File(磁盘)、Kafka Channel
  • Sink: HDFS、Hive、Kafka、HBase、Elasticsearch

典型场景:

  1. 日志聚合: 采集多台服务器的应用日志写入HDFS
  2. Web日志采集: Nginx/Apache日志 → Kafka/Flume → HDFS
  3. 非结构化数据采集: 文件、FTP数据

对比表: | 维度 | Canal | Flume | |------|-------|-------| | 数据来源 | MySQL Binlog | 日志文件/网络/RPC | | 数据类型 | 结构化(行变更) | 半结构化/非结构化(日志)| | 采集方式 | 增量实时(解析Binlog)| 实时Tail + 批量 | | 数据完整性 | 保证(Binlog有完整行数据)| 尽力而为 | | 事务性 | ✅(支持) | ❌ | | 适用场景 | CDC(数据库变更捕获) | 日志聚合/文件采集 |

最佳实践:

  • 数据库变更 → Canal → Kafka → Flink → HBase/ES
  • 业务日志 → Flume → Kafka → Spark/Flink → HDFS/Hive
  • Canal + Flume 组合: Canal同步MySQL变更到Kafka,Flume采集日志到同一Kafka