Structured Streaming Programming Guide-2.3.0

概览
结构化流是一个可伸缩和容错的流处理引擎,内置在Spark SQL 引擎中。你可以以对静态数据表达批处理计算的方式表达你的流计算。Spark SQL引擎会注意逐渐/持续第运行,并随着流数据不断到来而更新最终的结果。你可以使用Scala/Java/Python/R语言的Dataset/DataFrame API来表达流愈合、event-time windows、stream-to-batch joins等等。计算在相同的优化的Spark SQL引擎上执行。最终,系统通过checkpointing和write ahead logs保证端到端仅仅一次容错。总之,结构化流提供快速、可伸缩、容错、端到端一次流处理,在用户没必要思考流的情况下。
本质上,默认情况下,结构化流查询使用小批量的处理引擎来处理,处理数据流作为一系列小批量任务因而获得100ms的端到端延迟和仅仅一次容错保证。然而,从Spark2.3开始,我们引入了一种新的低延时处理模式,称作持续处理,能够获得端到端低至1ms的延迟和保证至少一次。不需要改变你查询中的Dataset/DataFrame操作,你可以基于你的程序需要选择这种模式。
在这个指南中,我们将带着你浏览编程模式和APIs。我们会主要使用默认的小批量处理模式来解释概念,然后讨论持续处理模式。首先,让我们从一个简单的结构化流查询例子即流式单词计数开始。
Quick Example
我们假设你想维护一个运行的单词计数任务,文本数据来自一个监听TCP socket的数据服务。让我们看下你如何使用结构化流来表达它。你可以看到Scala/Java/Python/R语言的全部代码。如果你下载了Spark,你可以直接运行示例。无论如何,让我们一步一步看下示例,理解它是如何工作的。首先,我们必须引入必要的类,创建一个本地SparkSession,所有功能的起点都和Spark相关。

import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.sql.*;
import org.apache.spark.sql.streaming.StreamingQuery;
import java.util.Arrays;
import java.util.Iterator;
SparkSession spark=SparkSession.builder().appName("JavaStructuredNetworkWordCount").getOrCreate();

接下来,创建一个streaming DataFrame,代表从监听本地9999端口的服务收到的文本数据,然后转换DataFrame来计算单词计数。

//create DataFrame representing the stream of input lines from connecting to localhost:9999
Dataset<Row> lines=spark.readStream().format("socket").option("host","localhost").option("port",9999).load();
//split the lines into words
Dataset<String> words=lines.as(Encoders.String()).flatMap((FlatMapFunction<String,String>) x -> Arrays.asList(x.split(" ")).iterator(),Encoders.String());
//generate running word count
Dataset<Row> wordCounts=words.groupBy("value").count();

猜你喜欢

转载自blog.csdn.net/z949061740/article/details/79418536