Structured Streaming中文参考指南
一、概述
Structured Streaming是构建在Spark SQL引擎之上的可扩展且容错的流处理引擎。用户可以像处理静态数据的批处理计算一样表达流计算,Spark SQL引擎会持续增量地运行计算,并在流数据不断到达时更新最终结果。用户可以使用Scala、Java、Python或R中的Dataset/DataFrame API来表达流聚合、事件时间窗口、流到批处理的连接等操作,计算在优化的Spark SQL引擎上执行,系统通过检查点和预写日志确保端到端的精确一次容错保证。
内部默认情况下,Structured Streaming查询使用微批处理引擎处理,将数据流作为一系列小批量作业处理,实现低至100毫秒的端到端延迟和精确一次容错保证。从Spark 2.3开始,引入了新的低延迟处理模式——连续处理模式,可实现低至1毫秒的端到端延迟和至少一次保证,用户可根据应用需求选择模式。
二、快速示例
以维护从监听TCP套接字的数据服务器接收的文本数据的实时单词计数为例,展示如何使用Structured Streaming实现。
- 导入必要的类并创建本地SparkSession
- 在Python中,使用如下代码:
from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split
spark = SparkSession \
.builder \
.appName("StructuredNetworkWordCount") \
.getOrCreate()
- 创建表示从服务器接收的文本数据流的DataFrame并进行转换计算单词计数
- 创建监听本地9999端口的DataFrame:
lines = spark \
.readStream \
.format("socket") \
.option("host", "localhost") \
.option("port", 9999) \
.load()
- 将每行文本拆分为单词:
words = lines.select(
explode(
split(lines.value, " ")
).alias("word"))
- 计算每个单词的出现次数:
wordCounts = words.groupBy("word").count()
- 启动流式查询并将结果输出到控制台
query = wordCounts \
.writeStream \
.outputMode("complete") \
.format("console") \
.start()
query.awaitTermination()
执行代码后,启动Netcat作为数据服务器(nc -lk 9999
),在另一个终端运行示例代码,在Netcat终端输入的文本会被实时计数并每秒在屏幕上打印结果。
三、编程模型
- 基本概念
- 将实时数据流视为不断追加的表,对流的查询生成“结果表”。每经过一个触发间隔(如每秒),新数据作为新行追加到输入表,进而更新结果表,结果表更新时将变化的结果行写入外部存储(输出)。输出模式有:
- Comple
- 将实时数据流视为不断追加的表,对流的查询生成“结果表”。每经过一个触发间隔(如每秒),新数据作为新行追加到输入表,进而更新结果表,结果表更新时将变化的结果行写入外部存储(输出)。输出模式有: