Structured Streaming-快速入门
一 概览
Structured Streaming是一种可伸缩的、容错的、基于Spark SQL引擎的流式计算引擎。我们可以使用与针对静态数据的批处理计算操作一样的方式来编写流式计算操作。随着数据不断地到达,Spark SQL引擎会以一种增量的方式来执行这些操作,并且持续更新结算结果。可以使用java、scala、python等编程语言,以及dataset/dataframe api来编写计算操作,执行数据流的聚合、基于event的滑动窗口、流式数据与离线数据的join等操作。所有这些操作都与Spark SQL使用一套引擎来执行。此外,structured streaming会通过checkpoint和预写日志等机制来实现一次且仅一次的语义。简单来说,对于开发人员来说,根本不用去考虑是流式计算,还是批处理,只要使用同样的方式来编写计算操作即可,structured streaming在底层会自动去实现快速、可伸缩、容错、一次且仅一次语义。
二 入门案例
1、创建SparkSession
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();
2、创建DataFrame用于表示从本地9999端口监听到的数据,然后对DataFrame进行转换,计算单词数。
// Create DataFrame representing the stream of input lines from connection 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();
lines这个DataFrame表示一个包含流文本数据的*表。 此表包含一列名为“value”的字符串,并且流文本数据中的每一行都将成为表中的一行。 需要注意的是,这并不是正在收到任何数据,因为我们只是设置转换,还没有开始。 接下来,我们使用.as [Encoders.STRING()]将DataFrame转换为String的Dataset,以便我们可以应用flatMap操作将每一行分割成多个单词。 所得词汇Dataset包含所有单词。 最后,我们已经通过将数据集中唯一的值进行分组并对它们进行计数来定义wordCounts DataFrame。 请注意,这是一个streaming DataFrame,它表示运行的stream的word counts。
我们现在已经设置了关于streaming data的查询。 剩下的就是实际开始接收数据并计算数量。 为此,我们将其设置为在每次更新时将完整的计数集合(由outputMode(“complete”)指定)打印到控制台。 然后使用start()启动流计算。
// Start running the query that prints the running counts to the console
StreamingQuery query = wordCounts.writeStream()
.outputMode("complete")
.format("console")
.start();
query.awaitTermination();
执行此代码后,流式计算将在后台启动。 查询对象是该活动流查询的句柄,我们已经决定使用query.awaitTermination()等待查询的终止,以防止查询处于活动状态时退出进程。
现在我们编译Spark应用程序代码,运行Netcat作为数据服务器。
$ nc -lk 9999
然后,我们在netcat服务器的终端中输入的任何行将每秒计数并打印在屏幕上。它将看起来像下面这样:
$ nc -lk 9999
apache spark
apache hadoop
# TERMINAL 2: RUNNING JavaStructuredNetworkWordCount
$ ./bin/run-example org.apache.spark.examples.sql.streaming.JavaStructuredNetworkWordCount localhost 9999
-------------------------------------------
Batch: 0
-------------------------------------------
+------+-----+
| value|count|
+------+-----+
|apache| 1|
| spark| 1|
+------+-----+
-------------------------------------------
Batch: 1
-------------------------------------------
+------+-----+
| value|count|
+------+-----+
|apache| 2|
| spark| 1|
|hadoop| 1|
+------+-----+
...
上一篇: textarea 自适应宽度和高度