Structured Streaming 是一种基于 Spark SQL 引擎构建的可扩展且容错的流处理引擎。您可以像表达对静态数据的批处理计算一样表达流式计算。Spark SQL 引擎将负责以增量方式持续运行它,并随着流数据不断到达而更新最终结果。您可以使用Scala、Java、Python 或 R 中的Dataset/DataFrame API来表达流聚合、事件时间窗口、流到批连接等。计算在同一个优化的 Spark SQL 引擎上执行。最后,系统通过检查点和预写日志确保端到端的恰好一次容错保证。简而言之,Structured Streaming 提供快速、可扩展、容错、端到端的 exactly-once 流处理,而无需用户对流进行推理。
在内部,默认情况下,结构化流查询是使用微批处理引擎处理的,该引擎将数据流处理为一系列小批作业,从而实现低至 100 毫秒的端到端延迟和恰好一次的容错保证. 然而,从 Spark 2.3 开始,我们引入了一种新的低延迟处理模式,称为Continuous Processing,它可以实现低至 1 毫秒的端到端延迟,并保证至少一次。在不更改查询中的 Dataset/DataFrame 操作的情况下,您将能够根据您的应用程序要求选择模式。
简单示例
1.监听TCP套接字的数据服务器接收到的文本数据中的单词数。您需要做的就是如下。
安装netcat
启动8888端口
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.streaming.StreamingQuery;
import org.apache.spark.sql.streaming.StreamingQueryException;
import java.util.Arrays;
public class JavaStructuredNetworkWordCount {
public static void main(String[] args) throws StreamingQueryException {
SparkSession spark = SparkSession
.builder()
.appName("JavaStructuredNetworkWordCount")
.master("local")
.getOrCreate();
// 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", 8888)
.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();
// Start running the query that prints the running counts to the console
StreamingQuery query = wordCounts.writeStream()
.outputMode("complete")
.format("console")
.start();
query.awaitTermination();
}
}
2.监听kafka主题消息
首先创建kafka主题并发布消息
引入依赖
<dependency>
<groupId> org.apache.spark</groupId>
<artifactId> spark-sql-kafka-0-10_2.10</artifactId>
<version>2.2.0</version>
</dependency>
Java代码如下:
public class KafkaStuctureStream {
public static void main(String[] args) throws StreamingQueryException {
SparkSession spark = SparkSession
.builder()
.appName("JavaStructuredNetworkWordCount")
.master("local")
.getOrCreate();
Dataset<Row> df = spark
.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", "127.0.0.1:9092")
.option("subscribe", "dome-topic")
.load();
Dataset<String> as = df.selectExpr("CAST(value AS STRING)").as(Encoders.STRING()).flatMap((FlatMapFunction<String, String>) x -> Arrays.asList(x.split(" ")).iterator(), Encoders.STRING());
Dataset<Row> value = as.groupBy("value").count();
StreamingQuery query =value.writeStream().format("console").outputMode("update")
.start();
query.awaitTermination();
}
}