4. 数据采集与接入:批采集(Sqoop/DataX)、流采集(Canal/Kafka Connect)、实时接入架构设计
数据采集是批流链路的起点,决定了上游数据能否完整、及时、一致地进入金融图谱处理层。本章围绕批采集与流采集两类主流工具,以及实时接入的总体架构展开,帮助读者建立从工具选型到架构设计的完整认知。
4.1 批采集:Sqoop 与 DataX 对比
批采集适用于离线 T+1 或小时级数据同步场景,典型任务包括:从关系型数据库(MySQL/Oracle)抽取客户信息表、交易流水表到 Hive/HDFS,或从 Hive 导出计算结果到业务库。
| 对比维度 | Sqoop | DataX |
|---|---|---|
| 开发方 | Apache / Cloudera | 阿里巴巴 |
| 运行模式 | MapReduce 作业 | 独立进程 + 插件架构 |
| 数据源支持 | RDBMS、HDFS、Hive、HBase | RDBMS、HDFS、Hive、HBase、MongoDB、ES、FTP 等 30+ 插件 |
| 断点续传 | 需借助 --split-by 与检查点 | 内置 Channel 级断点续传 |
| 增量抽取 | 支持 --incremental append/lastmodified | 支持 where 条件 + 时间戳 |
| 金融场景适配 | 需额外处理 Oracle 序列化问题 | 内置 Oracle 时间类型、CLOB 优化 |
| 社区活跃度 | 2018 年后基本停滞 | 持续更新,阿里云 DataWorks 集成 |
选型建议:存量 Hadoop 生态且无复杂转换需求,可继续使用 Sqoop;新项目或需要多数据源、断点续传、金融级稳定性,优先选择 DataX。
4.1.1 DataX 批采集作业示例(MySQL → HDFS)
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"connection": [{
"jdbcUrl": ["jdbc:mysql://10.0.1.10:3306/finance_db"],
"table": ["t_customer_account"]
}],
"username": "datax_user",
"password": "encrypted_pwd",
"column": ["account_id", "customer_name", "balance", "update_time"],
"where": "update_time >= '2025-01-01 00:00:00'"
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://nameservice1",
"path": "/user/finance/ods/t_customer_account",
"fileType": "parquet",
"writeMode": "append",
"compress": "snappy"
}
}
}
],
"setting": {
"speed": {"channel": 4},
"errorLimit": {"record": 100}
}
}
}
金融实践:生产环境建议开启 DataX 的
channel 流控,避免抽取高峰打爆源库连接池;同时使用 where 条件做增量时间窗口,减少全量扫描。
4.2 流采集:Canal 与 Kafka Connect
流采集面向毫秒级实时接入,核心场景包括:监听 MySQL Binlog 获取交易流水、账户变更;采集 Kafka 日志进入实时计算引擎;同步 Elasticsearch 索引变更等。
4.2.1 Canal:MySQL Binlog 实时采集
Canal 模拟 MySQL Slave 节点,解析 Binlog 的 Row 模式变更事件,输出为 JSON 格式的 Insert/Update/Delete 消息。金融场景下常用于交易流水、风控规则变更的实时捕获。
# canal 实例配置示例(conf/example/instance.properties)
canal.instance.master.address=10.0.1.10:3306
canal.instance.dbUsername=canal_user
canal.instance.dbPassword=canal_pwd
canal.instance.connectionCharset=UTF-8
canal.instance.filter.regex=fins_db\\..*
# 只监听 fins_db 下所有表
canal.mq.topic=fin_binlog_topic
canal.mq.partitionsNum=6
注意:金融核心库的 Binlog 必须开启 Row 模式,且 Canal 账号需授予
SELECT, REPLICATION SLAVE, REPLICATION CLIENT 权限;建议 Canal Server 与业务库网络隔离,通过专线或 VPN 连接。
4.2.2 Kafka Connect:多源流采集框架
Kafka Connect 是 Kafka 生态的流数据集成框架,通过 Source Connector 从外部系统拉取数据,通过 Sink Connector 写入目标系统。金融图谱中常用 Debezium(MySQL/MongoDB CDC)作为 Source,Elasticsearch Sink 作为索引同步。
| 特性 | Canal | Kafka Connect (Debezium) |
|---|---|---|
| 数据源范围 | MySQL Binlog | MySQL、PostgreSQL、MongoDB、Oracle、SQL Server |
| 输出格式 | JSON(自定义) | Avro / JSON Schema / Protobuf |
| Schema 管理 | 无内置 Schema Registry | 集成 Confluent Schema Registry |
| 容错机制 | 基于 ZK 记录位点 | 基于 Kafka Offset + 内部 Topic |
| 金融适用性 | 轻量、低延迟,适合纯 MySQL 场景 | 多源异构、Schema 演进,适合复杂图谱 |
4.3 实时接入架构设计
金融图谱的实时接入层需要同时处理高吞吐、低延迟、数据一致性三个核心挑战。下图展示了一套经过生产验证的批流一体接入架构。
4.3.1 架构设计要点
- CDC 优先,轮询兜底:核心交易库使用 Canal/Debezium 监听 Binlog,实现毫秒级变更捕获;对无 Binlog 能力的系统(如部分文件接口),使用 DataX 定时轮询作为补充。
- 消息队列解耦:所有采集数据先入 Kafka/Pulsar,避免采集端与处理端直接耦合;利用 Topic 分区机制实现并行消费,单 Topic 吞吐可达 10 万条/秒。
- Schema 统一管理:引入 Schema Registry,确保 CDC 消息的字段变更(新增列、类型修改)能被下游 Flink 任务自动识别,避免反序列化失败。
- 链路监控与位点回溯:在采集端记录 Binlog 位点(GTID/File+Pos),在 Kafka 端记录 Offset,支持 7 天内任意时间点的数据回溯重放。
金融级要求:实时接入链路必须支持 Exactly-Once 语义(通过 Kafka 事务 + Flink 两阶段提交),且端到端延迟控制在 3 秒以内(P99)。建议对每张核心表配置独立的 Canal 实例,避免表间相互影响。
4.4 批流采集选型决策矩阵
| 场景 | 推荐工具 | 延迟要求 | 一致性级别 | 备注 |
|---|---|---|---|---|
| MySQL 交易流水实时采集 | Canal / Debezium | < 1s | At-Least-Once | 配合 Kafka 幂等写入 |
| Oracle 历史数据批量迁移 | DataX | T+1 | Exactly-Once | 使用 Channel 流控 |
| MongoDB 变更捕获 | Debezium MongoDB Connector | < 2s | At-Least-Once | 需开启 Oplog |
| 日志文件采集 | FileBeat + Kafka Connect | < 5s | At-Least-Once | 支持多行合并 |
| Hive → 业务库导出 | DataX HdfsReader + RdbmsWriter | T+1 | Exactly-Once | 预分区 + 事务写入 |
实战建议:在金融图谱项目中,建议将批采集与流采集统一纳入同一个调度平台(如 Apache DolphinScheduler 或自研调度),通过 DAG 编排实现批流任务的血缘追踪和依赖管理。