Spark Structured Streaming 结构化流

Spark Structured Streaming 结构化流

Structured Streaming是一个构建在Spark SQL基础上可靠具备容错处理的流处理引擎。Structured Streaming提供快速,可扩展,容错,端到端的精确一次流处理,而无需用户推理流式传输。

流数据处理的三种语义:

  • 最少一次(at least once): 流数据中的记录最少会被处理一次(1-n)
  • 最多一次(at most once): 流数据中的记录最多会被处理一次(0-1)
  • 精确一次(at exactly once):流数据中的记录只能被处理一次(1)

在内部,默认情况下,Structured Streaming查询和处理使用micro-batch(微批)处理引擎。它将数据流作为一系列小批量作业进行处理,从而实现低至100毫秒的端到端延迟和完全一次的容错保证。在Spark 2.3版本后,又提供了一个低延迟的处理模式称为Continuous Processing(持续处理),可以实现端对端低至1毫秒和最少一次的容错保证。

一、Quick Example

流数据单词计数

package example8

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession

object StructuredStreamingQuickStart {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[4]").setAppName("StructuredNetworkWordCount")
    val sc = new SparkContext(conf)
    sc.setLogLevel("FATAL")
    val spark = SparkSession.builder().getOrCreate()
    import spark.implicits._
    // 构建DataFrame
    val df = spark.readStream.format("socket").option("host","gaozhy").option("port","9999").load()
		
    // 转换为Dataset 进行算子操作
    val words = df.as[String].flatMap(_.split(" "))

    val wordCounts = words.groupBy("value").count()

    val query = wordCounts.writeStream.outputMode("complete").format("console").start()

    query.awaitTermination()
  }
}

运行结果:

-------------------------------------------
Batch: 0
-------------------------------------------
+-----+-----+
|value|count|
+-----+-----+
+-----+-----+

-------------------------------------------
Batch: 1
-------------------------------------------
+-----+-----+
|value|count|
+-----+-----+
|   AA|    3|
|   CC|    1|
|   BB|    2|
+-----+-----+

-------------------------------------------
Batch: 2
-------------------------------------------
+-----+-----+
|value|count|
+-----+-----+
|   AA|    5|
|   CC|    1|
|   BB|    2|
+-----+-----+

...

spark streaming结构化流的编程步骤:

  1. 构建Spark Session对象【不光是SQL的入口,也是Structured Streaming应用入口】
  2. spark#readStream方法构建数据流的DF
  3. 数据流的DF应用SQL计算或者将DF转为DS应用计算操作
  4. 数据流的计算结果需要 DF.writeStream.format(输出格式).outputMode(输出模型)
  5. 启动 query#start & awaittermnation

Structured Streaming程序模型

Structured Streaming的核心是将流式的数据看成一张不断增加的数据库表,这种流式的数据处理模型类似于数据块处理模型,你可以把静态数据库表的一些查询操作应用在流式计算中,Spark运行这些标准的SQL查询,从不断增加的无边界表中获取数据。

基本概念

输入数据流视为"Input Table"(输入表)

在输入表上的每一次查询都会产生"Result Table"(输出表)

Output”(输出)定义了如何将结果写出到外部的存储系统,有三种不同的写出模式:

  • Complete Mode: 整个更新的结果集都会写入外部存储。整张表的写入操作将由外部存储系统的连接器Connector。
  • Append Mode:当时间间隔触发时,只有在Result Table中新增加的数据行会被写入外部存储。这种方式只适用于结果集中已经存在的内容不希望发生改变的情况下,如果已经存在的数据会被更新,不适合适用此种方式。
  • Update Mode: 当时间间隔触发时,只有在Result Table中被更新的数据才会被写入外部存储系统。注意,和Complete Mode方式的不同之处是不更新的结果集不会写入外部存储。如果查询不包含aggregations, 将会和append模式相同

第一个lines DataFrame对象是一张数据输入的Input Table,最后的WordCounts DataFrame是一个结果集Result Table。在lines DataFrame数据流之上的查询产生了wordCounts的表示方式和在静态的Static DataFrame上的使用方式相同。然而,Spark会监控socket连接,获取新的持续不断产生的数据。当新的数据产生时,Spark将会在新数据上运行一个增量的counts查询,并且整合新的counts和之前已经计算出来的counts,获取更新后的counts,如下所示:

这个模型和其他的流式数据处理引擎是非常不一样的,许多系统要求用户自己维护运行的聚合等,从而需要熟悉容错机制和数据保障机制(at-least-once, or at-most-once, or exactly-once)。在本模型中,Spark负责更新结果集ResultTable,从而解放了用户。

Fault Tolerance Semantics【容错语义】

Structure Streaming通过checkpoint和write ahead log去记录每一次批处理的数据源的偏移量(区间),可以保证在失败的时候可以重复的读取数据源。其次Structure Streaming也提供了Sink的幂等写的特性(在编程中一个操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同), 因此Structure Streaming实现end-to-end exactly-once 语义的故障恢复。

API using Datasets and DataFrames

从Spark2.0以来,DataFrames 和 Datasets可以表示静态的,有界的数据,也可以表示流式的,无界的数据。和静态的相似,您可以使用通用入口点SparkSession(Scala / Java / Python / R docs)从流式source创建流式DataFrames/Datasets,并且可以应用和静态数据相同的操作。

二、创建流式DataFrame和流式Datasets

Streaming DataFrames可以通过SparkSession.readStream()返回的DataStreamReader接口(Scala / Java / Python文档)创建。

Input Sources

常见的内置Sources

  • File source : 读取指定目录下的文件作为流数据,支持的文件格式有:text、csv、json、parquet、orc等
  • Kafka source(常用): 从kafka读取数据
  • Socket source (测试使用):从套接字连接读取UTF-8编码的文本数据
Source Options Fault-tolerant Notes
File source 1. **path:**路径到输入目录,并且与所有文件格式通用。2. **maxFilesPerTrigger:**每个时间间隔触发器中要考虑的最大新文件数(默认值:无最大值)3. **latestFirst:**是否首先处理最新的新文件,当有大量的文件积压(default:false)时很有用。4. **fileNameOnly:**是否仅根据文件名而不是完整路径检查新文件(默认值:false)。将此设置为“true”,以下文件将被视为相同的文件,因为它们的文件名“dataset.txt”是相同的:· “file:///dataset.txt” · “s3://a/dataset.txt” Yes
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值