Spark Streaming是spark最初的流处理框架,使用了微批的形式来进行流处理。html
提供了基于RDDs的Dstream API,每一个时间间隔内的数据为一个RDD,源源不断对RDD进行处理来实现流计算apache
Spark 2.X出来的流框架,采用了无界表的概念,流数据至关于往一个表上不断追加行。编程
基于Spark SQL引擎实现,可使用大多数Spark SQL的functionbootstrap
Spark Streaming采用微批的处理方法。每个批处理间隔的为一个批,也就是一个RDD,咱们对RDD进行操做就能够源源不断的接收、处理数据。app
spark streaming微批终是批框架
Structured Streaming is to treat a live data stream as a table that is being continuously appendedide
Structured Streaming将实时数据当作被连续追加的表。流上的每一条数据都相似于将一行新数据添加到表中。oop
以上图为例,每隔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更像流模式。
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")
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的范围内,这才是咱们想要的效果。
二者在可靠性保证方面都是使用了checkpoint机制。
checkpoint经过设置检查点,将数据保存到文件系统,在出现出故障的时候进行数据恢复。
在spark streaming中,若是咱们须要修改流程序的代码,在修改代码从新提交任务时,是不能从checkpoint中恢复数据的(程序就跑不起来),是由于spark不认识修改后的程序了。
在structured streaming中,对于指定的代码修改操做,是不影响修改后从checkpoint中恢复数据的。具体可参见文档。
两者的输出数据(写入下游)的方式有很大的不一样。
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,更适用于与偏批处理的场景。
在流处理引擎方面,flink最近也很火,值得咱们去学习一番。
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
以上为我的理解,若有不对的地方,欢迎交流指正。
我的公众号:码农峰,推送最新行业资讯,每周发布原创技术文章,欢迎你们关注。