Spark Streaming vs. Structured Streaming

Spark Streaming vs. Structured Streaming细说Spark Streaming和Structured Streaming的区别

简介

Spark Streaming

Spark Streaming是spark最初的流处理框架,使用了微批的形式来进行流处理。

提供了基于RDDs的Dstream API,每个时间间隔内的数据为一个RDD,源源不断对RDD进行处理来实现流计算

Structured Streaming

Spark 2.X出来的流框架,采用了无界表的概念,流数据相当于往一个表上不断追加行。

基于Spark SQL引擎实现,可以使用大多数Spark SQL的function

区别

1. 流模型

Spark Streaming

在这里插入图片描述
Spark Streaming采用微批的处理方法。每一个批处理间隔的为一个批,也就是一个RDD,我们对RDD进行操作就可以源源不断的接收、处理数据。

spark streaming微批终是批

Structured Streaming

在这里插入图片描述

Structured Streaming is to treat a live data stream as a table that is being continuously appended

Structured Streaming将实时数据当做被连续追加的表。流上的每一条数据都类似于将一行新数据添加到表中。

在这里插入图片描述

以上图为例,每隔1秒从输入源获取数据到Input Table,并触发Query计算,然后将结果写入Result Table,之后根据指定的Output模式进行写出。

上面的1秒是指定的触发间隔(trigger interval),如果不指定的话,先前数据的处理完成后,系统将立即检查是否有新数据。

需要注意的是,Spark Streaming本身设计就是一批批的以批处理间隔划分RDD;而Structured Streaming中并没有提出批的概念,Structured Streaming按照每个Trigger Interval接收数据到Input Table,将数据处理后再追加到无边界的Result Table中,想要何种方式输出结果取决于指定的模式。所以,虽说Structured Streaming也有类似于Spark Streaming的Interval,其本质概念是不一样的。Structured Streaming更像流模式。

2. RDD vs. DataFrame、DataSet

Spark Streaming中的DStream编程接口是RDD,我们需要对RDD进行处理,处理起来较为费劲且不美观。

stream.foreachRDD(rdd => {
    balabala(rdd)
})

代码100分

Structured Streaming使用DataFrame、DataSet的编程接口,处理数据时可以使用Spark SQL中提供的方法,数据的转换和输出会变得更加简单。

代码100分spark
    .readStream
    .format("kafka")
    .option("kafka.bootstrap.servers", "hadoop01:9092")
    .option("subscribe", "order_data")
    .load()
    .select($"value".cast("string"))
    .as[String]
    .writeStream
    .outputMode("complete")
    .format("console")

3. Process Time vs. Event Time

Process Time:流处理引擎接收到数据的时间

Event Time:时间真正发生的时间

Spark Streaming中由于其微批的概念,会将一段时间内接收的数据放入一个批内,进而对数据进行处理。划分批的时间是Process Time,而不是Event Time,Spark Streaming没有提供对Event Time的支持。

Structured Streaming提供了基于事件时间处理数据的功能,如果数据包含事件的时间戳,就可以基于事件时间进行处理。

这里以窗口计数为例说明一下区别:

我们这里以10分钟为窗口间隔,5分钟为滑动间隔,每隔5分钟统计过去10分钟网站的pv

假设有一些迟到的点击数据,其本身事件时间是12:01,被spark接收到的时间是12:11;在spark streaming的统计中,会毫不犹豫的将它算作是12:05-12:15这个范围内的pv,这显然是不恰当的;在structured streaming中,可以使用事件时间将它划分到12:00-12:10的范围内,这才是我们想要的效果。

4. 可靠性保障

两者在可靠性保证方面都是使用了checkpoint机制。

checkpoint通过设置检查点,将数据保存到文件系统,在出现出故障的时候进行数据恢复。

在spark streaming中,如果我们需要修改流程序的代码,在修改代码重新提交任务时,是不能从checkpoint中恢复数据的(程序就跑不起来),是因为spark不认识修改后的程序了。

在structured streaming中,对于指定的代码修改操作,是不影响修改后从checkpoint中恢复数据的。具体可参见文档

5. sink

二者的输出数据(写入下游)的方式有很大的不同。

spark streaming中提供了foreachRDD()方法,通过自己编程实现将每个批的数据写出。

stream.foreachRDD(rdd => {
    save(rdd)
})

structured streaming自身提供了一些sink(Console Sink、File Sink、Kafka Sink等),只要通过option配置就可以使用;对于需要自定义的Sink,提供了ForeachWriter的编程接口,实现相关方法就可以完成。

代码100分// console sink
val query = res
    .writeStream
    .outputMode("append")
    .format("console")
    .start()

最后

总体来说,structured streaming有更简洁的API、更完善的流功能、更适用于流处理。而spark streaming,更适用于与偏批处理的场景。

在流处理引擎方面,flink最近也很火,值得我们去学习一番。

reference

https://blog.knoldus.com/spark-streaming-vs-structured-streaming/

https://dzone.com/articles/spark-streaming-vs-structured-streaming

https://spark.apache.org/docs/2.0.2/streaming-programming-guide.html

https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html

以上为个人理解,如有不对的地方,欢迎交流指正。

在这里插入图片描述
个人公众号:码农峰,推送最新行业资讯,每周发布原创技术文章,欢迎大家关注。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10396.html

(0)
上一篇 2022-12-28
下一篇 2022-12-28

相关推荐

  • Python列表操作:实现对列表数据的增、删、查、改操作

    Python列表操作:实现对列表数据的增、删、查、改操作Python中的列表是一种有序的集合,它可以保存任意数量的Python对象。列表使用方括号[]来表示,其中的元素用逗号隔开。在Python中,列表是非常常见的数据结构,也是处理数据的重要基础。在本文中,我们将对Python列表的增、删、查、改操作进行详细介绍。

    2024-01-11
    66
  • 在Linux系统中通过rpm包安装MySQL[亲测有效]

    在Linux系统中通过rpm包安装MySQL[亲测有效]操作系统:CentOS 7 MySQL版本:5.7.29 通过rpm包方式安装就像去服装店买衣服,衣服的大小、颜色等样式都是设计好的,我们只要买来就能穿,方便快捷。 一、下载rpm包 打开MySQL官

    2023-02-27
    104
  • Anaconda历史版本

    Anaconda历史版本作为数据科学家和Python开发者必备的一款工具,Anaconda拥有着众多的用户和高度的关注度。而随着科技的不断发展,Anaconda也在不断更新迭代,不同版本间的差异会对用户带来不同的使用体验。接下来本文将从多个方面详细介绍Anaconda的历史版本,带大家回顾、了解Anaconda的发展历程,以及各版本的新特性。

    2024-05-20
    29
  • 综合脚手架工程量怎么算_脚手架工程资质

    综合脚手架工程量怎么算_脚手架工程资质高日耀 资深数据库内核研发 毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),现主要负责 MyS

    2023-04-27
    121
  • mysql 二级_mysql和sql server

    mysql 二级_mysql和sql server#获取会员的上二级 drop view if exists vwMemberL2Parent; create view vwMemberL2Parent as select m.id, m.paren

    2023-03-01
    120
  • Percona 已经决定放弃 TokuDB [亲测有效]

    Percona 已经决定放弃 TokuDB [亲测有效]早上看到一条消息,说TokuDB要被放弃了,去官方看了下,确有此事,如下是官方的说法: TokuDB is deprecated in the 8.0 series and will be supp…

    2023-03-04
    117
  • oracle行转列decode_oracle行转列逗号隔开

    oracle行转列decode_oracle行转列逗号隔开###第一种 函数 wm_content(‘待转列名称’) 11g 往后,不推荐使用 ###实例 多表关联时可以使用 (SELECT wm_concat(nvl(B1.OPERA_CODE,’a’)…

    2023-03-21
    119
  • Elasticsearch常用查询过滤接口与值得注意的问题「建议收藏」

    Elasticsearch常用查询过滤接口与值得注意的问题「建议收藏」Elasticsearch常用查询过滤接口与值得注意的问题 简介 本文将介绍一些ES查询过滤的接口和一些值得问题。 在ES中主要是查询,并且只有在bool查询中才有过滤上下文,当然聚合函数中也可能出…

    2023-04-04
    110

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注