批处理技术,它读取一组文件作为输入,并生成一组新的文件作为输出。输出是 衍生数据(derived data) 的一种形式;即若需要,可通过再次运行批处理过程来重新创建数据集。我们看到了如何使用这个简单而强大的想法来建立搜索索引、推荐系统、做分析等。
但这有很大的假设:输入有界,即已知和有限的大小,所以批处理知道它何时能完成输入的读取。如MapReduce核心的排序操作须读全部输入,才能开始生成输出。这就可能发生case:最后一条输入记录具有最小的键,因此需第一个被输出,所以提早开始输出是不可行的。
而很多数据无界,因为它随着时间推移而逐渐到达:你的用户在昨天和今天产生数据,明天他们将继续产生数据。除非你停业,否则该过程永不结束,所以数据集从来就不会以任何有意义的方式而 “完成”。因此,批处理程序必须将数据人为分成固定时间段的数据块,如每天结束时处理一天的数据或每h结束时处理一小时的数据。
批处理的问题是,输入的变更只会在一天之后的输出中反映,对急躁的用户来说太慢。为减少延迟,可更频繁运行处理,如每s的末尾或更连续一些,完全抛开固定时间切片,当事件发生时就立即处理,这就是流处理(stream processing)的想法。
一般来说,“流” 是指随着时间的推移逐渐可用的数据。这个概念出现在很多地方:Unix 的 stdin 和 stdout,编程语言(惰性列表)【2】,文件系统 API(如 Java 的 FileInputStream),TCP 连接,通过互联网传送音频和视频等等。
本文将把 事件流(event stream) 视为一种数据管理机制:无界限,增量处理,与上一章中的批量数据相对应。我们将首先讨论怎样表示、存储、通过网络传输流。在 “数据库与流” 中,我们将研究流和数据库之间的关系。最后在 “流处理” ,研究连续处理这些流的方法和工具,以及它们用于应用构建的方式。