目录
1、基本介绍
结构化流的关键思想是将活生生的数据流看作一张正在被连续追加数据的表。产生了一个与批处理模型非常相似的新的流处理模型。可以像在静态表之上的标准批处理查询一样,Spark是使用在一张无界的输入表之上的增量式查询来执行流计算的。
数据流Data Stream看成了表的行数据,连续地往表中追加。结构化流查询将会产生一张结果表(Result Table),
Time,每秒有个触发器,
input,对输入流执行查询后产生的结果最终会被更新到 result 的结果表中。
result,图中显示的输出模式是完全模式(Complete Mode)。图中显示的是无论结果表何时得到更新,我们将希望将改变的结果行写入到外部存储。输出有三种不同的模式;
a、完全模式(Complete Mode)
整个结果表(Result Table)将被写入到外部存储。这取决于外部连接决定如何操作整个表的写入。
b、追加模式(Append Mode)
只有从上一次触发后追加到结果表中新行会被写入到外部存储。适用于已经存在结果表中的行不期望被改变的查询。
c、更新模式(Update Mode)
只有从上一次触发后在结果表中更新的行将会写入外部存储(Spark 2.1.1之后才可用,个人理解类似于append+update的组合)。这种模式不同于之前的完全模式,它仅仅输出上一次触发后改变的行。如果查询中不包含聚合,这种模式与追加模式等价的。
2、三种Sink模式
1、Complete Mode
object HelloApp {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
val sqLContext = SparkSession.builder().appName(" HelloApp").master("local[*]")
.getOrCreate()
val df = sqLContext.readStream.format("socket")
.option("host","192.168.199.135")
.option("port",9999).load()//nc -lk 9999
import sqLContext.implicits._
val words = df.as[String].flatMap(_.split(" "))
// 对 "value" 列做 count,得到多行二列的 Dataset/DataFrame;即 result table
val wordCounts = words.groupBy("value").count()
val query = wordCounts.writeStream// 打算写出 wordCounts 这个 Dataset/DataFrame
// .outputMode("complete") // 打算写出 wordCounts 的全量数据
.outputMode("update") // 打算写出 wordCounts 的全量数据
.format("console")// 打算写出到控制台
.start()// 新起一个线程开始真正不停写出
query.awaitTermination()// 当前用户主线程挂住,等待新起来的写出线程结束
}
}
分多次发送消息,在该模式下,每一次计算都会输出整个结果表
+-----+-----+
|value|count|
+-----+-----+
|hello| 1|
| java| 1|
+-----+-----+
-------------------------------------------
Batch: 1
-------------------------------------------
+------+-----+
| value|count|
+------+-----+
| hello| 3|
| scala| 1|
| java| 1|
|python| 1|
+------+-----+
2、Update Mode
该模式下,分多次发送消息,每一批次计算后只会输出更新的和追加的行
+-----+-----+
|value|count|
+-----+-----+
|hello| 1|
| java| 1|
+-----+-----+
-------------------------------------------
Batch: 1
-------------------------------------------
+------+-----+
| value|count|
+------+-----+
| hello| 3|
| scala| 1|
|python| 1|
+------+-----+
3、Append Mode
在本次读取socket数据量实验中会报错
Exception in thread "main" org.apache.spark.sql.AnalysisException: Append output mode not supported
when there are streaming aggregations on streaming DataFrames/DataSets without watermark;