一.概述
结构化流是基于Spark SQL引擎构建的可伸缩且容错的流处理引擎。可以像对静态数据进行批处理计算一样来表示流计算。当流数据继续到达时,Spark SQL引擎将负责逐步递增地运行它并更新最终结果。可以在Scala,Java,Python或R中使用Dataset / DataFrame API来表示流聚合,事件时间窗口,流到批处理联接等。计算在同一优化的Spark SQL引擎上执行。最后,系统通过检查点和预写日志来确保端到端的一次容错保证。简而言之,结构化流提供了快速,可扩展,容错,端到端的精确一次流处理,而用户无需推理流。
在内部,默认情况下,结构化流查询是使用微批量处理引擎处理的,该引擎将数据流作为一系列小批量作业处理,从而实现了低至100毫秒的端到端延迟以及一次精确的容错保证。但是,自Spark 2.3起,我们引入了一种称为“ 连续处理”的新低延迟处理模式,该模式可以实现一次最少保证的低至1毫秒的端到端延迟。在不更改查询中的Dataset / DataFrame操作的情况下,将能够根据应用程序需求选择模式。
二.快速案例
1.获取SparkSession入口并导入转换
val spark = SparkSession
.builder()
.appName("从Socket获取数据进行结构化处理")
.master("local[2]")
.getOrCreate()
// 导入转换
import spark.implicits._
2.创建流处理框架
// split the lines into words
val wordCounts = lines.as[String]
.flatMap(_.split(" "))
.groupBy("value")
.count()
此linesDataFrame表示一个包含流文本数据的无界表。该表包含一列名为“值”的字符串,流文本数据中的每一行都成为表中的一行。请注意,由于我们正在设置转换,并且尚未开始转换,因此当前未接收到任何数据。接下来,我们使用将该DataFrame转换为String的Dataset .as[String],以便我们可以应用该flatMap操作将每一行拆分为多个单词。最后,我们wordCounts通过对数据集中的唯一值进行分组并对其进行计数来定义DataFrame。请注意,这是一个流数据帧,它表示流的运行字数。
3.开启执行
设置outputMode(“complete”)为在每次更新计数时将完整的计数集(由指定)打印到控制台。然后使用开始流计算start()。
// start running program
val result = wordCounts
.writeStream
.outputMode("complete")
.format("console")
.start()
result.