1. 批处理基础概念

什么是批处理

批处理,说白了就是「攒一批,一起干」。

你想想看,如果快递员每收到一个包裹就立刻送一趟,一天得跑几十趟。但要是等包裹攒够一车,再集中送一趟,效率就高多了。批处理就是这个道理——把多个任务攒起来,一次性处理完。

在计算机世界里,批处理是指将一组数据或任务收集起来,在某个时间点统一执行。数据不要求实时到达,处理结果也不要求立刻返回。系统只管埋头干活,把这一批全部搞定。

我刚开始接触批处理时,觉得这玩意儿太简单了。不就是循环遍历嘛。后来在项目中踩过坑才明白,批处理的难点不在于「批」,而在于「怎么批」——批次大小怎么定?失败任务怎么重试?数据倾斜怎么处理?这些才是真正考验人的地方。

核心特征:
  • 数据是静态的、有界的——处理前数据已经全部到位
  • 延迟较高——从提交到出结果,可能需要几秒、几分钟甚至几小时
  • 吞吐量高——批量操作能充分利用系统资源
  • 适合离线场景——不要求实时响应

批处理 vs 流处理

很多人搞不清批处理和流处理的区别。我简单画个对比,你就明白了。

批处理 vs 流处理 核心对比 批处理 数据已全部到位 → 统一处理 延迟高(秒/分钟/小时级) 吞吐量高,资源利用率好 典型:Hive、Spark Batch、MapReduce 流处理 数据持续到达 → 逐条或微批处理 延迟低(毫秒/秒级) 吞吐量受限于实时性要求 典型:Flink、Kafka Streams、Storm 选择批处理还是流处理,取决于你对延迟的容忍度

我整理了一个表格,把关键差异列出来,方便你对照。

对比维度 批处理 流处理
数据特征 有界、静态 无界、持续
处理时机 数据到齐后触发 数据到达即处理
延迟 高(分钟~小时) 低(毫秒~秒)
吞吐量 高 中等
资源消耗 集中爆发 持续平稳
容错方式 重跑整个批次 状态回溯+重放
典型场景 离线报表、ETL、数据清洗 实时监控、风控、推荐
我的经验: 别把批处理和流处理看成非此即彼的选择。现在很多系统采用「Lambda 架构」——批处理层保证全量数据的准确性,流处理层保证实时性。两条路径各自跑,最终合并结果。我在做电商数据平台时就这么干的,白天跑流处理做实时大屏,凌晨跑批处理做财务对账。

批处理的应用场景

批处理不是过时的技术。恰恰相反,在大数据时代,批处理依然是数据工程的核心支柱。我列几个最常见的场景。

1. 离线数据 ETL

这是批处理最经典的应用。每天凌晨,把业务数据库的数据抽取出来,清洗、转换、加载到数据仓库。为什么选在凌晨?因为业务系统负载低,数据也完整了——当天的交易都结束了。

-- 一个典型的批处理 ETL 任务(伪代码)
-- 每天凌晨 2:00 执行
CREATE TABLE dwd_order_daily AS
SELECT 
    order_id,
    user_id,
    product_id,
    amount,
    status,
    create_time
FROM ods_order
WHERE dt = '${yesterday}'
  AND status IN ('paid', 'completed');

2. 大规模数据计算

有些计算量太大,实时搞不定。比如全量用户画像、商品推荐模型的离线训练、历史数据的聚合分析。这些任务跑一次可能要几十分钟甚至几小时,但结果可以复用很久。

我记得有个项目,需要计算过去三年所有用户的购买行为特征。数据量几百 TB,如果用流处理逐条算,光状态维护就能把集群撑爆。最后还是老老实实跑批处理,MapReduce 分而治之,跑了两个多小时,但结果一次到位。

3. 报表与对账

财务系统对数据准确性要求极高。一分钱都不能差。流处理虽然快,但万一丢了一条消息,对账就对不上了。批处理可以保证「要么全做,要么全不做」,出错了整个批次重跑,数据一致性有保障。

避坑提醒: 我曾经在一个对账系统里,把批处理批次设成了 5 分钟一次。结果每次跑的数据量太小,资源开销反而比吞吐量还大。后来把批次间隔调到 30 分钟,吞吐量直接翻了 4 倍。批次大小不是越小越好,要找到那个「甜点」。

4. 数据迁移与备份

把数据从一个存储系统搬到另一个,或者做全量备份。这种场景天然适合批处理——数据是完整的、有界的,不需要实时性。用批处理工具(比如 Sqoop、DataX)一把梭,又快又稳。

5. 定时任务与调度

很多业务逻辑不需要实时触发。比如每天给用户发推送、每周生成运营周报、每月结算佣金。这些任务用批处理调度框架(比如 Azkaban、Airflow)来编排,依赖清晰,重试方便。

批处理的核心流程

不管什么场景,批处理都遵循一个基本流程。我画了张图,帮你建立整体认知。

批处理核心流程 数据采集 收集原始数据 数据清洗 去重、过滤、转换 业务计算 聚合、关联、统计 结果输出 写入目标存储 关键设计要点 • 批次大小:影响吞吐量和延迟的平衡 • 容错策略:失败后是重试还是整个批次重跑 • 资源分配:批处理任务通常需要独立资源池

这个流程看着简单,但每个环节都有坑。数据采集阶段要考虑数据源的稳定性,清洗阶段要处理脏数据,计算阶段要防止数据倾斜,输出阶段要保证幂等性。后面几章我会逐个展开讲。

一句话总结: 批处理的核心思想是「以空间换时间,以延迟换吞吐」。它不适合需要秒级响应的场景,但在离线计算、大规模数据处理、定时任务这些领域,依然是不可替代的方案。