流处理:从概念到实现
1. 流处理概述
在数据处理领域,传统的批处理技术是读取一组文件作为输入,生成一组新的输出文件。输出是一种派生数据,必要时可以通过再次运行批处理过程来重新创建。然而,批处理有一个重要假设,即输入是有界的,也就是已知且大小有限,这样批处理过程才能知道何时完成输入读取。
但在现实中,很多数据是无界的,因为它们会随着时间逐渐到来。例如,用户每天都会产生新的数据,除非业务停止,否则这个过程不会结束,数据集也永远不会真正“完整”。因此,批处理程序必须人为地将数据划分为固定时长的块,比如每天结束时处理一天的数据,或每小时结束时处理一小时的数据。
不过,每日批处理的问题在于输入的变化要一天后才会反映在输出中,这对于很多用户来说太慢了。为了减少延迟,可以更频繁地运行处理,甚至连续处理,即完全放弃固定时间片,实时处理每个事件,这就是流处理的理念。
一般来说,“流”指的是随着时间逐渐提供的数据。这个概念在很多地方都有体现,如Unix的标准输入输出、编程语言中的惰性列表、文件系统API(如Java的FileInputStream)、TCP连接以及互联网上的音视频传输等。
2. 事件流的传输
在批处理中,作业的输入和输出是文件(可能在分布式文件系统上)。那么流处理的等效形式是什么呢?
当输入是文件(字节序列)时,第一个处理步骤通常是将其解析为记录序列。在流处理中,记录更常被称为事件,它本质上是一个小的、自包含的、不可变的对象,包含某个时间点发生的事情的详细信息。事件通常包含一个时间戳,指示事件发生的时间。
事件可以编码为文本字符串、JSON或二进制形式。这种编码方式允许将事件存储
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



