【Spark分布式内存计算框架——Structured Streaming】2. Structured Streaming 核心设计与编程模型

核心设计

2016年,Spark在2.0版本中推出了结构化流处理的模块Structured Streaming,核心设计如下:

第一点:Input and Output(输入和输出)

  • Structured Streaming 内置了很多 connector 来保证 input 数据源和 output sink 保证 exactly-once 语义。
  • 实现 exactly-once 语义的前提:
    • Input 数据源必须是可以replay的,比如Kafka,这样节点crash的时候就可以重新读取input数据,常见的数据源包括 Amazon Kinesis, Apache Kafka 和文件系统。
    • Output sink 必须要支持写入是幂等的,这个很好理解,如果 output 不支持幂等写入,那么一致性语义就是 at-least-once 了。另外对于某些 sink, Structured Streaming 还提供了原子写入来保证 exactly-once 语义。
    • 补充:幂等性:在HTTP/1.1中对幂等性的定义:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。

第二点:Program API(编程 API)

  • Structured Streaming 代码编写完全复用 Spark SQL 的 batch API,也就是对一个或者多个 stream 或者 table 进行 query。
    【Spark分布式内存计算框架——Structured Streaming】2. Structured Streaming 核心设计与编程模型_第1张图片
  • query 的结果是 result table,可以以多种不同的模式(追加:append, 更新:update, 完全:complete)输出到外部存储中。
  • 另外,Structured Streaming 还提供了一些 Streaming 处理特有的 API:Trigger, watermark, stateful operator。

第三点:Execution Engine(执行引擎)

  • 复用 Spark SQL 的执行引擎;
  • Structured Streaming 默认使用类似 Spark Streaming 的 micro-batch 模式,有很多好处,比如动态负载均衡、再扩展、错误恢复以及 straggler (straggler 指的是哪些执行明显慢于其他 task 的 task)重试;
  • 提供了基于传统的 long-running operator 的 continuous(持续) 处理模式;

第四点:Operational Features(操作特性)

  • 利用 wal 和状态State存储,开发者可以做到集中形式的 rollback 和错误恢复FailOver。

编程模型

Structured Streaming将流式数据当成一个不断增长的table,然后使用和批处理同一套API,都是基于DataSet/DataFrame的。如下图所示,通过将流式数据理解成一张不断增长的表,从而就可以像操作批的静态数据一样来操作流数据了。
【Spark分布式内存计算框架——Structured Streaming】2. Structured Streaming 核心设计与编程模型_第2张图片
在这个模型中,主要存在下面几个组成部分:
第一部分:Input Table(Unbounded Table),流式数据的抽象表示,没有限制边界的,表的数据源源不断增加;
第二部分:Query(查询),对 Input Table 的增量式查询,只要Input Table中有数据,立即(默认情况)执行查询分析操作,然后进行输出(类似SparkStreaming中微批处理);
第三部分:Result Table,Query 产生的结果表;
第四部分:Output,Result Table 的输出,依据设置的输出模式OutputMode输出结果;

【Spark分布式内存计算框架——Structured Streaming】2. Structured Streaming 核心设计与编程模型_第3张图片
Structured Streaming最核心的思想就是将实时到达的数据看作是一个不断追加的unbound table无界表,到达流的每个数据项就像是表中的一个新行被附加到无边界的表中,用静态结构化数据的批处理查询方式进行流计算。
【Spark分布式内存计算框架——Structured Streaming】2. Structured Streaming 核心设计与编程模型_第4张图片
以词频统计WordCount案例,Structured Streaming实时处理数据的示意图如下,各行含义:
第一行、表示从TCP Socket不断接收数据,使用【nc -lk 9999】;
第二行、表示时间轴,每隔1秒进行一次数据处理;
第三行、可以看成是“input unbound table",当有新数据到达时追加到表中;
第四行、最终的wordCounts是结果表,新数据到达后触发查询Query,输出的结果;
第五行、当有新的数据到达时,Spark会执行“增量"查询,并更新结果集;该示例设置为Complete Mode,因此每次都将所有数据输出到控制台;

【Spark分布式内存计算框架——Structured Streaming】2. Structured Streaming 核心设计与编程模型_第5张图片
上图中数据实时处理说明:

  • 第一、在第1秒时,此时到达的数据为"cat dog"和"dog dog",因此可以得到第1秒时的结果集cat=1 dog=3,并输出到控制台;
  • 第二、当第2秒时,到达的数据为"owl cat",此时"unbound table"增加了一行数据"owl cat",执行word count查询并更新结果集,可得第2秒时的结果集为cat=2 dog=3 owl=1,并输出到控制台;
  • 第三、当第3秒时,到达的数据为"dog"和"owl",此时"unbound table"增加两行数据"dog"和"owl",执行word count查询并更新结果集,可得第3秒时的结果集为cat=2 dog=4 owl=2;

使用Structured Streaming处理实时数据时,会负责将新到达的数据与历史数据进行整合,并完成正确的计算操作,同时更新Result Table。

你可能感兴趣的:(spark,分布式,大数据,kafka,数据库)