zoukankan      html  css  js  c++  java
  • 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.  (Spark2.2开始为稳定版本).

    区别

    1. 流模型

    Spark Streaming

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

    Structured Streaming

     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)
    })

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

    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的编程接口,实现相关方法就可以完成。
    // console sink
    val query = res
        .writeStream
        .outputMode("append")
        .format("console")
        .start()

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

  • 相关阅读:
    《大话数据结构》最小生成树——Prim算法
    《大话数据结构》图的BFS和DFS
    寒假集训日志(三)——数论
    寒假集训日志(二)——最小生成树,拓扑排序,欧拉回路,连通路
    set
    寒假集训日志(一)——图,最短路问题
    经典的图论算法,C++描述
    动态数组
    stack and queue
    最长递增子序列,最长公共子串,最长公共子序列问题,最长公共增长子序列问题
  • 原文地址:https://www.cnblogs.com/chong-zuo3322/p/13452798.html
Copyright © 2011-2022 走看看