Flink Exactly

  • 时间:
  • 浏览:0
  • 来源:uu快3新平台_uu快3诀窍_讨论群

15万人关注的大数据成神之路,真的不来了解一下吗?

运行时,Bucketing File Sink 首先会打开好2个 临时文件不须断地将收到的数据写入(要花费事务的 beginTransaction 步骤),这时文件发生 in-progress。直到四种 文件然后大小超过阈值然后一段时间内都可以不想 新数据写入,这时文件关闭并变为 pending 情况表(要花费事务的 pre-commit 步骤)。然后 Flink checkpoint 是异步的,然后有多个并发的 checkpoint,Bucketing File Sink 会记录 pending 文件对应的 checkpoint epoch,当某个 epoch 的 checkpoint 完成后,Bucketing File Sink 会收到 callback 并将对应的文件改为 committed 情况表。这是通过原子操作重命名来完成的,之都可以否保证 pre-commit 的事务要么 commit 成功要么 commit 失败,不想出先然后 中间情况表。

真是消息的 exactly-once 投递并后会 好2个 分布式系统产生的新课题(真是它一般特指分布式领域的 exactly-once),早在计算网络发展初期的 TCP 协议然后实现了网络的可靠传输。TCP 协议的 exactly-once 实现最好的方式是将消息传递变为有情况表的:首先同步建立连接,然后发送的每个数据包再加递增的序列号(sequence number),发送完毕后再同步释放连接。然后发送端和接受端都保存了情况表信息(已发送数据包的序列号/已接收数据包的序列号),它们都可以知道哪些数据包是缺失或重复的。

15万人关注的大数据成神之路,选择真的不来了解一下吗?

Flink 提供 exactly-once 的情况表(state)投递语义,这为有情况表的(stateful)计算提供了准确性保证。其中比较容易令人混淆的然后 是情况表投递语义和更加常见的端到端(end to end)投递语义,而实现前者是实现后者的前置条件。

下面以 Bucketing File Sink 作为例子来说明如保基于异步 checkpoint 来实现事务性 sink。

在 Bucketing File Sink 的例子中,发生 in-progress 和 pending 情况表的文件默认情况表下后会 隐藏文件(在实践中是使用下划线作为文件名前缀,HDFS 的 FileInputFormat 会将其过滤掉),都可以不想 commit 成功后文件才对用户是可见的,即提供了 read-committed 的事务隔离性。理想的情况表下 exactly-once sink 都应该使用在下游系统缓存未 commit 数据的最好的方式,然后这最为符合流式计算的理念。最为典型的是下游系统另好2个 就支持事务,都可以不想 未 commit 的数据很自然地全都 缓发生下游系统的,然后 sink 都可以选择像上例的 Bucketing File Sink 一样在下游系统的用户层面实现此人 的事务,然后 fallback 到等候数据变为 committed 再发出的 micro-batching 模式。

1.Fault Tolerance Guarantees of Data Sources and Sinks

2.An Overview of End-to-End Exactly-Once Processing in Apache Flink

3.State Management in Apache Flink

4.An Overview of End-to-End Exactly-Once Processing in Apache Flink (with Apache Kafka, too!)

而端到端的一致性则还要上下游的内部人员系统配合,然后 Flink 无法将它们的情况表也保存到快照并独立地回滚它们,然后就不叫作内部人员系统了。通常来说 Flink 的上游是都可以重复读取然后消费的 pull-based 持续化存储,全还要实现 source 端的 exactly-once 只还要回滚 source 的读取进度即可(e.g. Kafka 的 offset)。而 sink 端的 exactly-once 则复杂化化,然后 sink 是 push-based 的。所谓覆水难收,要撤出 发出去的消息是并后会 容易的事情,然后这要求下游根据消息作出的一系列反应后会 可撤出 的。这就还要用 State API 来保存已发出消息的元数据,记录哪些数据是重启后还要回滚的。

然后在分布式系统的守护进程间协调还要通过网络,而网络情况表在全都情况表下是不可预知的,通常发送消息要考虑四种 情况表:正常返回、错误返回和超时,其中错误返回又都可以分为可重试错误返回(e.g. 数据库维护暂时不可用)和不可重试错误返回(e.g. 认证错误),而可重试错误返回和超时后会 导致 重发消息,导致 下游然后接收到重复的消息,也全都 at-least-once 的投递语义。而 exactly-once 是在 at-least-once 的基础之上再加了都可以识别出重发数据然后将消息包装为为幂等操作的机制。

下文将基于 Flink 详细分析 exactly-once 的难点所在以及实现方案,而哪些结论不想 否推广到然后 实时系统,特别是流式计算系统。

Exactly-once 是实时系统最为关键的准确性要求,也是当前限制大要素分布式实时系统应用到准确性要求更高的业务场景(比如在线事务出理 OLTP)的难题之一。目前来说流式计算的 exactly-once 在理论上然后有了很大的突破,而 Flink 社区也在积极汲取最先进的思想和实践经验。随着 Flink 在 exactly-once 上的技术愈发心智心智心智心智心智性性成熟期是什么图片 图片 图片 图片 图片 ,结合 Flink 四种 的流出理 形态,相信在不远的将来,除了构造数据分析、数据管道应用, Flink 不想 否在微服务领域占有一席之地。

Flink 从 0.9 版本结束了了提供 State API,标志着 Flink 进入了 Stateful Streaming 的时代。State API 简单来说是“不受守护进程重启影响的“数据形态,其命名规范也与常见的数据形态一致,比如 MapState、ListState。Flink 官方提供的算子(比如 KafkaSource)和用户开发的算子都都可以使用 State API 来保存情况表信息。和大多数分布式系统一样 Flink 采用快照的最好的方式来将整个作业的情况表定期同步到内部人员存储,也全都 将 State API 保存的信息以序列化的形式存储,作业恢复的然后假使 读取内部人员存储即可将作业恢复到先前某个时间点的情况表。然后从快照恢复同后会 回滚数据流的出理 进度,全都 State 是绿帘石的 exactly-once 投递。

第2点和第3点真是是同好2个 难题,即还要区分出另好2个 守护进程和重启后的守护进程。对此业界然后有比较心智心智心智心智心智性性成熟期是什么图片 图片 图片 图片 图片 的出理 方案: 引入 epoch 表示守护进程的不同世代并用分布式协调系统来负责管理。真是还有然后 衍生的细节难题,但总体来说难题后会 大。然后第1点难题造成了好2个 比较深远的影响,即为了减低 IO 成本,情况表的保存必然是微批量(micro-batching)的而后会 流式的,这会导致 情况表的保存老会 落后于流计算进度,因而为了保证 exactly-once 流计算引擎还要实现事务回滚。

事务性 sink 顾名思义类似 于传统 DBMS 的事务,将一系列(一般是好2个 checkpoint 内)的所有输出包装为好2个 逻辑单元,理想的情况表下提供 ACID 的事务保证。难能可贵说是“理想的情况表下”,主全都 然后 sink 依赖于目标输出系统的事务保证,而分布式系统对于事务的支持不须一定很详细,比如 HBase 就不支持跨行事务,再比如 HDFS 等文件系统是不提供事务的,四种 情况表下 sink 只都可以在客户端的基础上再包装一层来尽最大努力地提供事务保证。

Commit 出先错误会导致 作业自动重启,重启后 Bucketing File Sink 四种 已被恢复为上次 checkpoint 时的情况表,不过仍还要将文件系统的情况表也恢复以保证一致性。从 checkpoint 恢复后对应的事务会再次重试 commit,它会将记录的 pending 文件改为 committed 情况表,记录的 in-progress 文件 truncate 到 checkpoint 记录下来的 offset,而其余未被记录的 pending 文件和 in-progress 文件都将被删除。

中间主要围绕事务保证的 AC 两点(Atomicity 和 Consistency),而在 I(Isolation)上 Flink exactly-once sink 后会 不同的实现最好的方式。实际上然后 Flink 的流计算形态,当前事务的未 commit 数据是老会 在积累的,根据缓存未 commit 数据的地方的不同,都可以将事务性 sink 分为四种 实现最好的方式。

Checkpoint 提供给算子的 hook 有 CheckpointedFunction 和 CheckpointListener 好2个 ,前者在算子进行 checkpoint 快照时被调用,后者在 checkpoint 成功后调用。为了简单起见 Flink 结合上述好2个 接口抽象出 exactly-once sink 的通用逻辑抽象 TwoPhaseCommitSinkFunction 接口,从命名即可看出这是对两阶段提交协议的好2个 实现,其主要最好的方式如下:

15万人关注的大数据成神之路,不来了解一下吗?

Bucketing File Sink 是 Flink 提供的好2个 FileSystem Connector,用于将数据流写到固定大小的文件里。Bucketing File Sink 将文件分为四种 情况表,in-progress/pending/committed,分别表示正在写的文件、写完准备提交的文件和然后提交的文件。

然而仅有下游系统四种 提供的事务保证对于 exactly-once sink 来说是过低的,然后同好2个 sink 的子任务(subtask)会有多个,对于下游系统来说它们是发生不同会话和事务中的,不须能保证操作的原子性,然后 exactly-once sink 还还要实现分布式事务来达到所有 subtask 的一致 commit 或 rollback。然后 sink 事务生命周期是与 checkpoint 一一对应的,然后说 checkpoint 另好2个 全都 实现作业情况表持久化的分布式事务,sink 的分布式事务也理所当然都可以通过 checkpoint 机制提供的 hook 来实现。

随着近来太久的业务迁移到 Flink 上,对 Flink 作业的准确性要求也随之进一步提高,其中最为关键的是如保在不同业务场景下保证 exactly-once 的投递语义。真是不少实时系统(e.g. 实时计算/消息队列)都宣称支持 exactly-once,exactly-once 投递似乎是好2个 已被出理 的难题,然后真是它们更多是针对内部人员模块之间的信息投递,比如 Kafka 生产(producer 到 Kafka broker)和消费(broker 到 consumer)的 exactly-once。而 Flink 作为实时计算引擎,在实际场景业务会涉及到全都不同组件,然后组件形态和定位的不同,Flink 并后会 对所有组件都支持 exactly-once(见[1]),然后不同组件实现 exactly-once 的最好的方式后会 所差异,然后 实现或许会带来副作用然后用法上的局限性,然后深入了解 Flink exactly-once 的实现机制对于设计稳定可靠的架构有十分重要的意义。

幂等性是分布式领域里十分有用的形态,它导致 相同的操作执行一次和执行多次都可以获得相同的结果,然后 at-least-once 自然等同于 exactly-once。都可以不想 一来,在从快照恢复的然后幂等 sink 便不还要对内部人员系统撤出 已发消息,要花费回避了内部人员系统的情况表回滚难题。比如写入 KV 数据库的 sink,然后插入一行的操作是幂等的,然后 sink 都可以无情况表的,在错误恢复时全都 还要关心内部人员系统的情况表。从四种 意义来讲,上文提到的 TCP 协议也是利用了发送数据包幂等性来保证 exactly-once。

然而幂等 sink 的适用场景依赖于业务逻辑,然后下游业务另好2个 就无法保证幂等性,这时就还要应用事务性 sink。

Flink 的 exactly-once sink 均基于快照机制,按照实现原理都可以分为幂等(Idempotent) sink 和事务性(Transactional) sink 四种 。

而在分布式环境下 exactly-once 则更为复杂化,最大的不同点在于分布式系统还要容忍守护进程崩溃和节点丢失,这会带来然后 难题,比如下面常见的哪2个:

下面将分析 Flink 是如保实现 exactly-once Sink 的。