知识卡片
流处理与批处理的本质区别:无界输入决定的连锁反应
内容
[[三种系统架构在线服务批处理流处理的划分与衡量标准]]里提到批处理的核心假设是输入有界——已知且固定大小,作业知道自己何时读完全部输入;而流处理面对的是无界数据,数据随时间持续到达,除非停业否则永不”完成”,所以只能把无界流当成”输入永无止境的批处理”来对待。这个看似简单的差异会连锁触发一系列技术后果:批处理里的排序合并连接依赖”能读完全部输入才能开始输出”(最后一条记录可能持有最小的键),这个前提在无界流上根本不成立,所以流处理不能直接照搬排序合并连接;批处理的容错可以简单地”从头重启失败任务”,因为作业总归会在有限时间内跑完,但对一个已经运行数年、永不停止的流作业而言,从头重放全部历史是不现实的,容错机制必须变成能从某个中间点恢复而非从零开始。发散:流处理领域的很多设计选择(窗口、恰好一次语义的实现方式),归根结底都是在为”我们永远不知道输入什么时候能读完”这一个前提找配套的解法。
参考来源
- 位置:《数据密集型应用系统设计》第十一章《流处理》引言"流处理"(源文件:_epub-src/ch11_split_003.html)
- 结论依据:原文指出批处理假设输入有界、而流不会结束,并明确说明这一差异导致排序合并连接无法使用、容错机制必须区别于"从头重启"的批处理做法,直接支撑本卡片结论。
- 原始内容:与批量作业相比的一个关键区别是,流不会结束……排序对无界数据集没有意义,因此无法使用排序合并连接……对于已经运行数年的流作业,重启后从头开始跑可能并不是一个可行的选项。