Streaming101起源于在O'really上发表的两篇博客,原文如下:
https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101
https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102
其中对流式计算的设计理念做了非常透彻的介绍。现存的系统如Flink/Spark Structured Streaming的设计理念都是出自于上述文章。后其作者又写了一本介绍流计算原理的书《Streaming System》,更加详细的介绍了流计算的基本概念及设计框架等。本文即为其开篇第一章的概述。有志于深入研究流计算系统的读者,可以详细读一下两篇博客以及《Streaming System》原文,会大有毗益。
术语:什么是流?
一说到流,很多文章中都会这样描述:计算延时底但结果不准确,这是对流计算这个术语非常大的误解。这些文章描述的都是现有流计算系统的特点,而不是‘流计算’本身。有良好设计的流计算系统,是完全能达到延时低并且结果准确的效果。因此本文及接下来一系列文章中中,‘流’特指:
__流计算系统__:能处理无界数据集的数据处理系统。
现实世界中,需要处理各种类型的数据。有两个重要的(和正交的)维度定义了给定数据集的形状:基数(cardinality)和构成(constitution)。
基数:描述了数据集的大小,有两种精确的表达方式:
- 有界数据:数据集大小固定
- 无界数据:(理论上)数据集无限大
其中如何处理无界数据,给数据处理系统带来了新的挑战。
构成:数据集的物理展现方式。两种非常重要的构成方式如下:
- 表:某个时间点上,所有数据的快照。现存的数据库都是在处理表。
-
流:随时间变化的数据集,从每个元素(变化)的视角看,得到的视图。基于MapReduce的系统都是在处理流。
被极度夸大的流处理的局限性
本节会着重讨论流系统的能力。之前很多针对流系统的论述都是低延时但是结果不精确,反之批处理才能提供精确的计算结果,这其实都是对流计算系统的误解。经过良好的设计,流系统完全可以保证低延时,并且提供正确的结果。并且从理论上来说,流是批的超集。Flink根据这个理论实现了一个批流统一的计算引擎,并且批和流数据处理都是用流的方式实现的。为了在处理能力上超越批,需要做好两件事:
- 正确性:使流的能力与批相同。
保证流计算系统正确性的关键,是如何随时将状态进行持久化存储。目前市面上很多流计算系统,还只能做到at-lease-once(至少一次)语义,根本不足以保证计算结果的准确。当然也有很多系统已经实现了exactley-once语义,从而保证结果的正确性。相关的论文有:Flink,