本文旨在深入探讨流式计算的核心概念及其设计理念。流式计算是一种处理无界数据集的技术,与现有的系统如Flink和Spark Structured Streaming的设计理念密切相关。作者随后撰写了一本详细介绍流计算基本概念及设计框架的书籍《Streaming System》,进一步丰富了该领域的知识体系。本文是对这本书第一章的概览,旨在为后续文章奠定基础。
一谈到“流”,很多人可能会认为流计算具有低延迟但结果不准确的特征,这是一个严重的误解。实际上,设计良好的流计算系统可以同时实现低延迟和高精度。本文将重点介绍流计算系统,它是指能够处理无界数据集的数据处理系统。
数据集可以通过两个维度来描述:基数和构成。基数指的是数据集的大小,包括有界数据和无界数据。构成则指数据集的物理表现形式,包括静态快照和随时间变化的数据集。
早期关于流计算的文章常常提到低延迟但结果不准确的问题,而批处理系统则被认为能够提供准确的结果。但实际上,通过精心设计,流计算系统完全可以实现低延迟和高精度。从本质上讲,流计算是批处理的一种超集。Flink等系统已经实现了这一目标,支持批处理和流处理的统一。
为了在性能上超越批处理,流计算系统需要具备以下两点: - 正确性:确保流计算系统能够达到与批处理系统相同的准确性。持久化存储状态是保证正确性的关键。 - 处理事件时间:事件时间是指数据实际发生的时间,处理事件时间的能力对于流计算系统至关重要。
为了正确理解无界数据处理的实际,需要深入了解事件时间和处理时间的概念。事件时间是指数据实际发生的时间,而处理时间则是数据进入系统的时间。理想情况下,事件时间和处理时间应该是同步的,但在现实世界中,这两者往往存在偏差。
本文接下来介绍了目前处理两种数据类型(有界数据和无界数据)的核心模型。
处理有界数据相对简单,可以通过某种数据处理引擎将数据转换为结构化的数据集。这种模型应用广泛,但处理无界数据则更为复杂。
传统的批处理引擎通过切片的方式将无界数据流切分成多个有界数据集,再进行处理。常见的切片方式包括固定窗口和会话窗口。然而,这些方法在处理乱序数据时存在局限性。
流计算系统专门设计用于处理无界数据。这类数据具有高度无序和事件时间不固定的特点。处理这类数据的方法主要有四种:时间无关操作、近似算法、窗口操作等。
窗口是流计算中常用的一种处理无界数据的方式。常见的窗口类型包括固定窗口、滑动窗口和会话窗口。窗口可以根据事件时间和处理时间进行划分。
基于处理时间的窗口较为简单,适用于一些特定场景,如监控类需求。然而,大多数场景需要基于事件时间进行处理。
基于事件时间的窗口是标准的窗口类型,适用于需要处理乱序数据的场景。虽然这种窗口的功能强大,但也存在数据缓存和完整性问题。
本文主要探讨了流计算的一些核心概念,包括术语定义、批处理与流处理的性能对比、事件时间和处理时间的区别、主流数据处理系统的处理方式以及窗口操作的应用。希望这些内容能够帮助读者更好地理解流计算系统的设计和应用。