Structured_Sink_容错语义 | 学习笔记

简介: 快速学习 Structured_Sink_容错语义

开发者学堂课程【大数据Spark2020版(知识精讲与实战演练)第五阶段:Structured_Sink_容错语义】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/692/detail/12159


Structured_Sink_容错语义

内容介绍

一.从 source 到 sink 的流程

二.错误恢复语义

三.Sink 的容错

 

一.从 source 到 sink 的流程

理解流程会了解到如何将错误恢复,有助于解决问题

image.png 

1.StreamExecution

整体流处理器,从 source 捕获数据,把内容添加到 think 落地数据

2. Source

接口,有3种方法

(1)getoffset() 获取当前访问进度

(2)getBatch() 获取某一批次的数据

(3)commit( )  给出确认,将offset向前移动

3. Sink

接口

AddBatch()处理批次,通过批次写入 kafka 等。

4. 过程

(1) 在每个 StreamExecution 的批次开始, StreamExecution 会向 Source 询问当前 Source 最新进度 ,即最新的 offset

(2) StreamExecution 将 Offset 放入 WAL  内

(3)StreamExecution 从 Source 获取 start offset, end offset 区间内的数据

(4)StreamExecution 触发计算逻辑 logicalPlan 的优化与编译

(5)计算结果写出给 Sink

调用 Sink. addBatch(batchId: Long, data: DataFrame) 完成

此时才会由 Sink 的写入操作 开始触发实际的数据获取和计算过程

5. 在数据完整写出到 Sink 后, StreamExecution 通知 Source 批次 id ;写入到 batchCommitLog, 当前批次结束。

 

二.错误恢复语义

1.目标和步骤

目标

理解 Structured Streaming 中提供的系统级别容错手段

步骤

(1)端到端

(2)三种容错语义

(3)Sink 的容错

2.端到端

image.png

Source 可能是 Kafka,HDFS

Sink 也可能是 Kafka,HDFS,MySQL 等存储服务

消息从 Source 取出,经过 Structured Streaming 处理,后落地到 Sink 的过程,叫做端到端

3.三种容错语义

(1)at-most-once

image.png

在数据从 Source 到 Sink 的过程中,出错了,(不能保证一定发送成功)Sink可能没收到数据,但是不会收到两次,叫做 at-most-once

一般错误恢复的时候,不重复计算,则是 at-most-once

(2) at-least-once

(不保证重复)

image.png

在数据从 Source 到 Sink 的过程中,出错了,Sink 定会收到数据,但是可能收到两次,叫做 at-least-once

一般错误恢复的时候,重复计算可能完成也可能未完成的计算,则是 at-least-once

3.exactly-once

在数据从 Source 到 Sink 的过程中,虽然出错了,Sink 定恰好收到应该收到的数据,一条不重复也一条都不少,即是 exactly-once

想做到 exactly-once 是非常困难的

 

三.Sink 的容错

故障恢复一般分为 Driver 的容错和 Task 的容错

1. Driver 的容错

指的是整个系统都挂掉了

2. Task 的容错

指的是一个任务没运行明白,重新运行一次

3.因为 Spark 的 ExeC 金 tor 能够非常好的处理 Task 的容错,以我们上要讨论Driver 的容错,如果出错的时候

(1)读取 WAL offsetlog 恢复出最新的 offsets

当 StreamExecution 找到 Source 获取数据的时候,会将数据的起始放在 WAL offsetlog 中,当出错受恢夏的时就可以从中获取当前处理批次的数据起始,例Kafka offset

(2)读取 batchCommitLog 决定是否需要重做近:个批次

当 Sink 处理完批次的数据写入时,公将当前的批次 ID 存入 batchCommitLog ,当出箭的时候家以从中取出进行到哪一个批次了,和 WL 对比即可得当前批次是否处理完

(3)如果有必要的话,当前批次数据重做

·如果上次执行在(5)结来前即失效,那么本次执行里 Sik 应该光整写出计算结果

·如果上次执行在(5)结束后才尖效,那么木次执行里 Sik 可以重新写出计算结果(覆盖上次结果),也可以跳过写出计算结果(因为上次执行已经完整写出过计算结果了)

这样即可保证每次执行的计算结果,在 Sink 这个层面,是不重不丢的,即使中问发生过失效和恢复,所以 Structured

Streaming 可以做到 exactly-once

4.容错所需要的存储

(1)存储

offsetlog 和 batchCommitLog 关于错误恢复

//记录当前批次出现的问题

offsetlog 和 batchCommitLog 需要存储在可靠的空间里

offsetlog 和 batchCommitLog 存储在 Checkpoint

WAL 其实也存在于 Checkpoint 中

//设置 Checkpoint 为容错

(2)指定 Checkpoint

只有指定了 Checkpoint 路径的时候,对应的容错功能才可以开启

5.需要的外部支持

如果要做到 exactly-once, 只是 Structured Streaming 能做到还不行,还需要Source 和 Sink 系统的支特

(1)Source 需要支持数据重放

当有必要的时候,Structured Streaming 需要根据 start 和 end offset 从 Source 系统中再次茯取数据,这叫做重放

(2)Sink 需要支持幂等写入

果需要重做整个批次的时候,Sik 要支持给定的 ID 写入数据,这叫幂等写入,一个ID 对应一条数据进行写入,如果前面已经写入,则替换或者丢充,不能重复

所以 Structured Streaming 想要做到 exactly-once, 则也需要外部系统的支持

6. Source

Sources

是否可重放

原生内置支持

注解

 

HDFS

可以

 已支持

包括但不限于Text,JSON,CSV,ParquetORC

 

Kafka

可以

已支持

Kafka 0.10.0+

 

RateStream

可以

已支持

以一定速率产生数据

 

RDBMS

可以

待支持

预计后线很快会支持

 

Socket

可以

已支持

主要用途在技术会议和讲座上demo

 

7.区别

Structured Streaming 是流式型,另一个是静态型

相关文章
|
3月前
|
存储 调度 流计算
Flink 新一代流计算和容错问题之如何实现 Generalized Log-Based Incremental Checkpoint
Flink 新一代流计算和容错问题之如何实现 Generalized Log-Based Incremental Checkpoint
|
3月前
|
分布式计算 Apache 数据安全/隐私保护
流计算引擎数据问题之在 Spark Structured Streaming 中水印计算和使用如何解决
流计算引擎数据问题之在 Spark Structured Streaming 中水印计算和使用如何解决
48 1
|
3月前
|
存储 数据处理 数据安全/隐私保护
流计算引擎数据问题之MillWheel/Cloud DataFlow 实现完整性推理如何解决
流计算引擎数据问题之MillWheel/Cloud DataFlow 实现完整性推理如何解决
40 0
|
6月前
|
消息中间件 关系型数据库 MySQL
[flink 实时流基础] 输出算子(Sink)
[flink 实时流基础] 输出算子(Sink)
143 1
|
6月前
|
消息中间件 存储 监控
Kafka Streams:深度探索实时流处理应用程序
Apache Kafka Streams 是一款强大的实时流处理库,为构建实时数据处理应用提供了灵活且高性能的解决方案。本文将深入探讨 Kafka Streams 的核心概念、详细原理,并提供更加丰富的示例代码,以帮助大家深入理解和应用这一流处理框架。
|
消息中间件 分布式计算 Java
|
消息中间件 存储 缓存
深入解析 Kafka Exactly Once 语义设计 & 实现
本篇文章主要介绍 Kafka 如何在流计算场景下保证端到端的 Exactly Once 语义,通过其架构上的设计以及源码分析帮助读者理解背后的实现原理。什么是 Exactly-Once?消息的投递语义主要分为三种:At Most Once: 消息投递至多一次,可能会丢但不会出现重复。At Least Once: 消息投递至少一次,可能会出现重复但不会丢。Exactly Once: 消息投递正好一次
深入解析 Kafka Exactly Once 语义设计 & 实现
|
消息中间件 资源调度 Oracle
对Flink流处理模型的抽象
对Flink流处理模型的抽象
对Flink流处理模型的抽象
|
消息中间件 SQL 缓存
Exactly Once语义在Flink中的实现
Exactly Once语义在Flink中的实现
201 0
Exactly Once语义在Flink中的实现
|
消息中间件 存储 Kafka
Flink到底能不能实现exactly-once语义
关于这个问题其实从一开始很多人是存在质疑的,首先exactly-once语义指的是即使在出现故障的情况下,Flink流应用程序中的所有算子都保证事件只会被"精确一次"(恰好一次,不多不少)的处理.假设有下面一个场景,Flink在完成了一次checkpoint后,第二次checkpoint前(此时两个checkpoint中间的数据已经处理了一部分了)任务挂掉了,然后任务恢复的时候会从上一次成功的checkpoint处恢复(也即是checkpoint ID为1的位置)任务,那这个时候刚才被处理的数据又会被处理一次,这部分数据被处理了两次甚至可能是多次,那这就不能称为exactly-once语义了啊