三、Structured Streaming的基本介绍

目录

 

1、基本介绍

2、三种Sink模式


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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值