数据采集与接入:实时与批量方案对比

大家好,我是老张。今天咱们聊聊数据采集这块。

做交易审计,第一步就是数据采集。说白了,你得先把数据弄进来,才能谈后续的分析。我见过不少团队,审计模型建得挺漂亮,结果数据采集环节就翻车了——不是延迟太高,就是数据丢了,甚至精度对不上。嗯,这章咱们就把这块讲透。

一、实时采集 vs 批量采集:核心差异

先问个问题:交易数据什么时候需要实时采集?

我个人习惯这样判断——如果业务要求秒级响应,比如风控拦截、实时对账,那必须上实时方案。如果只是T+1的报表分析、历史审计,批量采集完全够用。

对比维度 实时采集(Canal/Kafka) 批量采集(Sqoop/DataX)
延迟 毫秒~秒级 分钟~小时级
资源消耗 较高(常驻进程) 较低(定时任务)
数据一致性 最终一致性 强一致性(快照)
适用场景 实时风控、在线对账 离线报表、历史审计
典型工具 Canal + Kafka Sqoop、DataX

你想想看,实时采集就像水龙头一直开着,数据源源不断流进来。批量采集呢,更像定时去水库打水,一次打一桶。各有各的用处。

二、实时采集方案:Canal + Kafka

先说说Canal。这玩意儿是阿里巴巴开源的,专门监听MySQL的binlog。我在项目中遇到过一个问题——业务库的binlog格式没设置成ROW模式,结果Canal解析出来的数据全是错的。后来我养成了习惯,部署前先检查一下数据库配置。

Kafka在这里扮演的角色,说白了就是个缓冲层。Canal把数据推到Kafka,下游的审计系统再从Kafka消费。这样做的好处是解耦——万一审计系统挂了,数据不会丢,Kafka会帮你存着。

核心流程:

MySQL binlog → Canal解析 → Kafka Topic → 审计消费端

这里有个避坑指南:我曾经遇到Kafka消息积压导致审计延迟飙升。排查下来发现,是消费者处理能力跟不上。后来加了分区数,又调整了消费线程池大小,才算稳住。嗯,实时系统最怕的就是背压。

三、批量采集方案:Sqoop vs DataX

批量采集这块,Sqoop和DataX是主流。我个人的经验是:如果团队技术栈偏Hadoop,Sqoop更顺手;如果数据源五花八门,DataX的插件生态更丰富。

拿Sqoop举个例子,从MySQL导数据到Hive:

sqoop import \
  --connect jdbc:mysql://host:3306/trade_db \
  --username audit_user \
  --password ****** \
  --table trade_log \
  --hive-import \
  --hive-table ods.trade_log \
  --split-by id \
  --num-mappers 8

注意那个--split-by id参数。我见过有人没指定这个,结果Sqoop只启动了一个map任务,几千万的数据跑了两个小时。指定了主键或索引字段后,并行度就上来了。

DataX的配置方式类似,但更灵活:

{
  "job": {
    "content": [{
      "reader": {
        "name": "mysqlreader",
        "parameter": {
          "connection": [{"jdbcUrl": ["jdbc:mysql://host:3306/trade_db"], "table": ["trade_log"]}],
          "column": ["id", "trade_no", "amount", "create_time"],
          "splitPk": "id"
        }
      },
      "writer": {
        "name": "hdfswriter",
        "parameter": {
          "path": "/user/audit/ods/trade_log",
          "fileName": "trade_log",
          "writeMode": "append"
        }
      }
    }]
  }
}

DataX的好处是,它自带数据转换功能。比如金额字段,源库存的是分,目标库要存元,直接在配置里写个转换器就行,不用额外写代码。

四、数据质量校验规则

数据采进来了,但质量怎么样?我见过最离谱的情况——某次批量导入后,审计报表里出现了金额为负数的交易记录。查了半天,原来是源库有个字段允许负数,但业务上根本不应该出现。所以,数据质量校验必须前置。

我个人习惯在采集层做三层校验:

  1. 非空校验:关键字段不能为空。比如交易流水号、交易金额、交易时间。如果为空,直接告警或丢弃。
  2. 唯一性校验:交易流水号必须全局唯一。重复数据会导致后续对账、统计全部出错。
  3. 金额精度校验:这个最容易被忽略。金额字段必须保留两位小数,且不能出现精度丢失。我建议用Decimal类型,别用Float。

实战技巧:

金额精度校验可以这样写:ABS(amount - ROUND(amount, 2)) < 0.001。如果差值超过阈值,说明精度有问题。

注意:

唯一性校验不要只依赖数据库的唯一索引。批量采集时,如果数据量太大,唯一索引插入失败会导致整个任务回滚。我建议先做一次预校验,把重复数据单独拎出来处理。

五、知识体系总览

下面这张图,是我自己总结的数据采集全流程。你把它存下来,以后做方案设计时对照着看,基本不会漏掉关键点。

数据采集与接入知识体系 数据源 MySQL / Oracle / 日志 采集方式 实时 / 批量 采集工具 Canal / Kafka / Sqoop / DataX 数据质量校验 非空校验 → 唯一性校验 → 金额精度校验 数据输出 Kafka Topic / HDFS / Hive 表 核心原则:先校验,再入库;宁可丢数据,不要脏数据 实时 vs 批量 实时:毫秒级延迟 批量:分钟级延迟 按场景选择

这张图把整个流程串起来了。从数据源开始,经过采集方式的选择,再到工具落地,最后是质量校验和输出。每一步都有坑,但每一步也都有解法。

好了,这章就到这里。数据采集是审计分析的地基,地基不稳,上面建什么都白搭。下一章咱们聊聊数据清洗和标准化,那又是另一番天地了。


公众号:蓝海资料掘金营,微信deep3321