知识卡片

批处理输出的三种目的与不可变输出带来的人类容错

普通读书笔记卡

内容

批处理作业的产出通常落在三类场景:构建全文搜索索引(Mapper按需对文档分区,每个Reducer构建该分区的索引文件,索引本身一旦创建就只读不可变,全量更新时批量替换即可)、作为机器学习系统(分类器、推荐系统)查询用的键值存储、以及给下游作业消费的普通数据集。这些场景有一个共同的最佳实践:不要在Mapper/Reducer内部直接一条条写外部生产数据库(会因高并发写压垮数据库、且部分成功部分失败会破坏MapReduce”全有或全无”的输出保证),而应该在批处理作业内部把结果写成分布式文件系统上的一批不可变文件(不少键值存储如Voldemort/Terrapin/ElephantDB支持直接批量加载这类文件),服务端悄悄从旧文件切到新文件、出问题还能轻易回滚。这套”输入不可变、输出被完全替换、没有其他副作用”的哲学带来一种独特的容错能力:如果代码有bug导致输出错误,只需回滚代码重跑作业即可修复,而不像有读写事务的在线数据库那样,回滚代码也无法挽回已经写坏的数据——这种从错误代码中恢复的能力被称为”人类容错”,是”最小化不可逆性”这一敏捷开发原则在批处理系统里的具体体现。

参考来源

- 位置:《数据密集型应用系统设计》第十章《批处理》"建立搜索索引""键值存储作为批处理输出""批处理输出的哲学"(源文件:_epub-src/ch10_split_002.html) - 结论依据:原文说明批处理输出常见的三类去向、直接写外部数据库的问题、改为写不可变文件批量加载的做法,并明确提出"人类容错"概念说明输出可回滚是其区别于在线数据库的关键优势,直接支撑本卡片结论。 - 原始内容:更好的解决方案是在批处理作业内创建一个全新的数据库,并将其作为文件写入分布式文件系统……能够从错误代码中恢复的概念被称为人类容错……这种最小化不可逆性的原则有利于敏捷软件开发。