Sparkstreaming首次引入在0.*版本,其核心思想是利用spark批处理框架,以microbatch(以一段时间的流作为一个batch)的方式,完成对流数据的处理。其核心思想是建立DStream进行微批处理,依旧属于批处理的一部分。不满足基于Event Time的实时处理需求。
Event time 事件时间: 就是数据真正发生的时间,比如用户浏览了一个页面可能会产生一条用户的该时间点的浏览日志。
Process time 处理时间: 则是这条日志数据真正到达计算框架中被处理的时间点,简单的说,就是你的Spark程序是什么时候读到这条日志的。
事件时间是嵌入在数据本身中的时间。对于许多应用程序,用户可能希望在此事件时间操作。例如,如果要获取IoT设备每分钟生成的事件数,则可能需要使用生成数据的时间(即数据中的事件时间),而不是Spark接收他们的时间。事件时间在此模型中非常自然地表示 - 来自设备的每个事件都是表中的一行,事件时间是该行中的一个列值。
Structured Streaming是Spark2.0版本提出的新的实时流框架(2.0和2.1是实验版本,从Spark2.2开始为稳定版本),相比于Spark Streaming,优点如下:
1.同样能支持多种数据源的输入和输出,Kafka、flume、Socket、Json。
2.基于Event-Time,相比于Spark Streaming的Processing-Time更精确,更符合业务场景。
3.支持spark2的dataframe处理。
4.解决了Spark Streaming存在的代码升级,DAG图变化引起的任务失败,无法断点续传的问题。
5.基于SparkSQL构建的可扩展和容错的流式数据处理引擎,使得实时流式数据计算可以和离线计算采用相同的处理方式(DataFrame&SQL)。
6.可以使用与静态数据批处理计算相同的方式来表达流计算。
7.结构化流查询(Structured Streaming Query)内部默认使用微批处理引擎( micro-batch processing engine),它将数据流看作一系列小的批任务(batch jobs)来处理,从而达到端到端如100毫秒这样低的延迟以及只执行一次容错的保证。然而,从Spark 2.3,我们已经引入了一个新的低延迟处理方式——连续处理(Continuous Processing),可以达到端到端如1毫秒这样低的延迟至少一次保证。不用改变查询中DataSet/DataFrame的操作,你就能够选择基于应用要求的查询模式。
Structured Streaming支持的Source:
1.File Source:从给定的目录读取数据,目前支持的格式有text,csv,json,parquet,容错。
2.Kafka Source:从kafka拉取数据。仅兼容kafka 0.10.0或者更高版本,容错。
3.Socket Source(for testing):从一个连接中读取UTF8编码的文本数据,不容错。
Structured Streaming的输出:
输出模式 | 功能 |
---|---|
Append mode(default) | 仅仅从上次触发计算到当前新增的行会被输出到sink。仅仅支持行数据插入结果表后不进行更改的query操作。因此,这种方式能保证每行数据仅仅输出一次。例如,带有Select,where,map,flatmap,filter,join等的query操作支持append模式。 |
Complete mode | 每次trigger都会将整个结果表输出到sink。这个是针对聚合操作的。 |
Update mode | 仅仅是自上次trigger之后结果表有变更的行会输出到sink。在以后的版本中会有更详细的信息。 |
StructuredStreaming目前支持的sink只有FileSink、KafkaSink、ConsoleSink、MemorySink和ForeachSink。
其中最常用的是ForeachSink。