知识卡片
批处理流处理的统一趋势与维护衍生状态的函数式原则
内容
数据集成的目标是确保数据最终在所有正确的地方以正确形式出现,批处理和流处理正是实现这一目标的两种工具,两者产出的都是衍生数据集(搜索索引、物化视图、推荐、聚合指标)。[[流处理与批处理的本质区别无界输入决定的连锁反应]]的根本区别在于输入是否有界,但具体实现细节间的差异已经开始模糊——Spark在批处理引擎上把流拆成微批次来执行流处理,Flink反过来在流处理引擎上执行批处理,原则上一种类型可以模拟另一种,只是性能特征会不同(比如跳动/滑动窗口在微批次下表现不佳)。批处理有很强的函数式风格:鼓励确定性纯函数,输出只依赖输入,除显式输出外无副作用,输入不可变、输出仅追加;流处理与之类似,只是扩展了算子以支持受管理的、容错的状态。具有良好定义输入输出的确定性函数,不仅有利于[[流处理的恰好一次语义微批存档点原子提交与幂等性]]所需要的容错,也简化了组织内数据流的推理——把搜索索引、统计模型、缓存都当作”从一个东西衍生出另一个东西的数据管道”来理解,是本章后续讨论的一条主线。原则上衍生数据也可以同步维护(就像关系数据库在同一事务里更新表和辅助索引),但异步正是让基于事件日志的系统稳健的原因:它能把某部分系统的故障局限在局部,而分布式事务一旦任何参与者失败就会中止,反而倾向于把故障扩散到系统其余部分。
参考来源
- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"批处理与流处理""维护衍生状态"(源文件:_epub-src/ch12_split_000.html)
- 结论依据:原文说明批处理与流处理的根本区别在于输入是否有界、但实现细节正在趋同(Spark微批次/Flink流式批处理),并指出批处理和流处理共享确定性纯函数的风格,异步维护衍生数据比同步的分布式事务更能局部化故障,直接支撑本卡片结论。
- 原始内容:批处理和流处理有许多共同的原则,主要的根本区别在于流处理器在无限数据集上运行,而批处理输入是已知的有限大小……异步是使基于事件日志的系统稳健的原因:它允许系统的一部分故障被抑制在本地。