Spark Streaming(二) Structed Streaming
本文详细介绍下Spark Streaming的第二代引擎Structed Streaming,包括Structed Streaming的概述,核心概念,
Structed Streaming相关的应用等。
Structed Streaming 概述
Structed Streaming 有两个关键思想:以处理批量计算的方式对待流计算和与存储系统的事务集成,以提供端到端、只需一次的保证。
- 以处理批量计算的方式对待流计算
以处理批量计算的方式对待流计算,也就是说将流数据看作是连续追加表的形式。这意味着将传入的数据流视为输入表,并在新的一组数据到达时将其视为附加到输入表的一组新行。
这种思路有很多好处。其中之一是能够利用Scala、Java或Python中现有的DataFrame和DataSet的结构化API来执行流计算,
并让结构化流引擎负责在新的流数据到达时增量地、连续地运行它们。
另一个好处是可以使用上一章中讨论的同一Catalyst引擎来优化通过结构化API表示的流计算。
除此之外从使用结构化API中获得的知识可以直接用于构建在Spark结构化流引擎上运行的流应用程序。唯一需要学习的剩余部分是特定于流处理域的部分,例如事件时间处理和维护状态,节约了学习成本。
- 与存储系统的事务集成,以提供端到端、只需一次的保证
这里的目标是确保从存储系统读取数据的服务应用程序看到流应用程序已处理的数据的一致快照。
传统上,开发人员有责任确保从流应用程序向外部存储系统发送数据时不会出现重复数据或数据丢失。这是流应用程序开发人员提出的痛点之一。
从内部来看,Structure Streaming引擎已经提供了恰好只有一次的保证,现在,如果外部存储系统支持事务,同样的保证也会扩展到这些系统。
从Spark 2.3 开始,Structed Streaming 已经扩展为支持一种叫“ontinuous processing”的新模型,在此之前Spark只支持Micro Batch 模型,Micro Batch是Spark的默认模型。
由于Micro Batch模型等待并收集一小批数据然后处理的性质,它适用于可以容忍100毫秒范围内的端到端延迟的应用。对于其他需要低至1毫秒的端到端延迟的应用它们应该使用连续处理模型。
Structed Streaming的核心概念
通常情况下流应用程序的主要部分包括指定一个或多个流数据源、提供用于以DataFrame转换的形式操作传入数据流的逻辑、定义输出模式和触发器,以及最后指定要将结果写入的数据接收器。
这些构成了Structed Streaming的核心概念。
数据源(Data Source)
对于批处理来说,Data Source是驻留在某些存储系统(如本地文件系统、HDFS或S3)上的静态数据集。Structed Straming 的数据源有很大的不同。他们产生的数据是连续的,可能永远不会结束,而且产生的速度可能会随着时间的推移而变化。
Structed Streaming 支持以下Data Source:
-
Kafka Source
这里要求Kafka版本在0.10及以上,是生产环境中最