Spark structured streaming(未完)

Spark Structured Streaming

结构化流是基于Spark SQL引擎构建的可伸缩且容错的流处理引擎。您可以像对静态数据进行批处理计算一样来表示流计算。当流数据继续到达时,Spark SQL引擎将负责逐步递增地运行它并更新最终结果。您可以在Scala,Java,Python或R中使用Dataset / DataFrame API来表示流聚合,事件时间窗口,流到批处理联接等。计算在同一优化的Spark SQL引擎上执行。最后,系统通过检查点和预写日志来确保端到端的一次容错保证。简而言之,结构化流提供了快速,可伸缩,容错,端到端的精确一次流处理,而用户无需推理流。在内部,默认情况下,结构化流查询是使用微批处理引擎处理的,该引擎将数据流作为一系列小批处理作业进行处理,从而实现了低至100毫秒的端到端延迟以及一次精确的容错保证。但是,自Spark 2.3起,我们引入了一种称为“连续处理”的新低延迟处理模式,该模式可以实现一次最少保证的低至1毫秒的端到端延迟。在不更改查询中的Dataset / DataFrame操作的情况下,您将能够根据应用程序需求选择模式。在本指南中,我们将带您逐步了解编程模型和API。我们将主要使用默认的微批处理模型来解释这些概念,然后再讨论连续处理模型。首先,让我们从一个结构化流查询的简单示例开始-流字数。

入门:WordCount

对于数据输出模式的选择:

complete:完整模式-整个更新的结果表将被写入外部存储器。 由存储连接器决定如何处理整个表的写入。 追加模式-仅将自上次触发以来追加在结果表中的新行写入外部存储器。 这仅适用于结果表中现有行预计不会更改的查询。

update:更新模式-仅自上次触发以来在结果表中已更新的行将被写入外部存储(自Spark 2.1.1起可用)。 请注意,这与完成模式的不同之处在于此模式仅输出自上次触发以来已更改的行。 如果查询不包含汇总,则相当于追加模式。

append:只输出将来不会更新的数据

编程模型

结构化流传输中的关键思想是将实时数据流视为被连续添加的表。这导致了一个新的流处理模型,该模型与批处理模型非常相似。您将像在静态表上一样将流计算表示为类似于批处理的标准查询,Spark 在无界输入表上将其作为增量查询运行。

基本概念

将输入数据流视为“输入表”。流上到达的每个数据项都像是将新行附加到输入表中

处理事件时间和延迟数据

事件时间是嵌入数据本身的时间。对于许多应用程序,您可能需要在此事件时间进行操作。例如,如果要获取每分钟由IoT设备生成的事件数,则可能要使用生成数据的时间(即数据中的事件时间),而不是Spark收到的时间。他们。此事件时间在此模型中非常自然地表示-设备中的每个事件都是表中的一行,而事件时间是该行中的列值。这允许基于窗口的聚合(例如,每分钟的事件数)只是事件时间列上的一种特殊类型的分组和聚合-每个时间窗口是一个组,每行可以属于多个窗口/组。因此,

此外,此模型自然会根据事件时间处理比预期晚到达的数据。由于Spark正在更新结果表,因此它具有完全控制权,可以在有较晚数据时更新旧聚合,并可以清除旧聚合以限制中间状态数据的大小。从Spark 2.1开始,我们支持水印功能,该功能允许用户指定最新数据的阈值,并允许引擎相应地清除旧状态。这些将在后面的“ 窗口操作”部分中详细介绍。

容错语义

提供端到端的一次语义是结构化流设计背后的主要目标之一。为此,我们设计了结构化流源,接收器和执行引擎,以可靠地跟踪处理的确切进度,以便它可以通过重新启动和/或重新处理来处理任何类型的故障。假定每个流源都有偏移量(类似于Kafka偏移量或Kinesis序列号),以跟踪流中的读取位置。引擎使用检查点和预写日志来记录每个触发器中正在处理的数据的偏移范围。流接收器被设计为是幂等的,用于处理后处理。结合使用可重播的源和幂等的接收器,结构化流可以确保端到端的一次精确语义 在任何故障下。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容