玉兆的博客

心如止水


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索

Flink-分布式快照的设计-流程

发表于 2018-01-29 | 分类于 Flink源码 | | 阅读次数:

Flink 通过 barrier 来协调 checkpoint 的时机,我们在介绍【Flink 网络栈】的时候已经有介绍:对于一个拓扑结构,只有上游算子 checkpoint 完成,下游算子的 checkpoint 才能开始并有意义,又因为下游算子的消费速率并不统一【有的 channel 快,有的 channel 慢】,barrier 就是这样一种协调上下游算子的机制。
stream_barriers

阅读全文 »

Flink 分布式快照的设计-存储

发表于 2017-12-24 | 分类于 Flink源码 | | 阅读次数:

分布式快照是整个 Flink 计算框架中非常核心的模块,Flink 的 checkpoint、状态存储都依赖于其分布式快照;不仅框架自身借助于 chandy-lamda 算法,实现了算子状态的快照和恢复,也对用户暴露了一套简洁的状态存储的 API,用户无需关心快照自身的容错/扩展/一致性,这些 Flink 都已对用户透明;由于分布式快照这块的设计比较复杂,因此将拆成两篇文章来介绍,本篇文章主要介绍分布式快照存储部分的设计,下一篇会介绍快照的流程和细节。

代码参考版本: 1.5-SNAPSHOT。

核心模块

Flink 的分布式快照存储部分设计抽象出了大致 5 个层次:

  • 最底层是快照的物理存储,包括内存和文件系统两种形式
  • 再上层是 CheckpointStreamFactory:封装了具体的存储交互,也就是内存/文件系统读写
  • 再上层是 StateBackend:封装了工作状态的存储逻辑,包括内存和 RocksDB 两种形式
  • 再上层是 KeyedStateBackend:封装了快照的读写细节,快照分区策略等
  • 再上层是 State:封装了与 KeyedStateBackend 交互时状态的 val 序列化/反序列化 等逻辑

还有一个 StateContext 比较特殊,它不提供快照功能,只提供临时的状态读写,下面会讲到
核心模块的总体交互图:
checkpoint-sys-interact

阅读全文 »

Flink WindowOperator 的设计

发表于 2017-10-18 | 分类于 Flink源码 | | 阅读次数:
本文将介绍 flink 1.3.1 版本 WindowOperator 的设计,主要涉及核心的抽象,角色功能以及之间的交互,因为 WindowOperator 的状态存储用到了 flink 的状态存储,所以这里会略带涉及状态存储的知识,具体细节会单独开一篇文章介绍。
阅读全文 »

Flink Kafka Connector 设计与实现

发表于 2017-03-29 | 分类于 Flink源码 | | 阅读次数:
本文将介绍 flink 1.2 的 0.9.0 版本 kafka connector,主要讲解消费模型,快照策略/恢复等,尤其是为什么 flink kafka connector 借助于 flink 内核的分布式快照算法做到了 exact-once 语义
阅读全文 »

Flink AsyncIO 剖析

发表于 2017-03-29 | 分类于 Flink源码 | | 阅读次数:
AsyncIO 是由 flink 1.2 引入的新特性,其目的是优化流处理过程中外部服务访问的耗时造成的瓶颈问题
阅读全文 »

Flink 对用户代码异常处理

发表于 2017-02-09 | 分类于 Flink源码 | | 阅读次数:
flink 的架构在 flink 基本组件一节已经介绍过,其中的 TaskManager 负责监护 task 的执行,对于每个 task,flink 都会启动一个线程去执行,那么当用户的代码抛出异常时,flink 的处理逻辑是什么呢?
阅读全文 »

Flink Scheduler

发表于 2017-02-09 | 分类于 Flink源码 | | 阅读次数:

前面已经介绍了一系列的 flink 任务抽象、网络传输、可靠性机制等细节,有了这些铺垫,终于可以开心的介绍 flink 的任务调度机制了

因为没有这些铺垫,就无法明白 flink 为什么要设计这样的一套调度机制!所以本章节讲解时会多穿插一些为什么

资源组

资源组模型

flink 的一个 Instance 可以被划分出多个 Slot,通过初始参数可以指定,他们既可以是 SimpleSlot,也可以是同时跑多个 task 的 SharedSlot,为了约束 task 之间的运行时的绑定关系,flink 抽象出了 SlotSharingGroup 和 CoLocationGroup 的概念。

一个 SlotSharingGroup 规定了一个 Job 的 DAG 图中的哪些 JobVertex 的 sub task 可以部署到一个 SharedSlot 上,这是一个软限制,并不是一定会满足,只是调度的时候有位置偏好,而 CoLocationGroup 是在 SlotSharingGroup 的基础上的硬限制,它限定了 CoLocationGroup 中的 JobVertex 中的 sub task 运行必须是一一对应的:假如 CoLocationGrou 限定了 JobVertex A 和 B ,那么 A 的编号为 i 的 sub task 必须和 B 的编号为 i 的 sub task 跑在一起。假如一个 job 的运算逻辑包括 source -> head -> tail -> sink,那么它的 task 运行时限制关系见下图:
flink-slot-group

阅读全文 »

Flink Watermark & Checkpoint

发表于 2017-02-09 | 分类于 Flink源码 | | 阅读次数:
在前面一章 flink 网络栈的讲解中,我们介绍了 Barrier 的改变以及 Barrier 在 InputGate 消费数据的过程中扮演的时间对齐作用,同时,我们介绍了 InputProcessor 负责数据读取,同时会追踪 watermark 时间并分发到下游。这里我们从 InputProcessor 开始讲起,接着会介绍 checkpoint
阅读全文 »

Flink 网络栈

发表于 2017-02-09 | 分类于 Flink源码 | | 阅读次数:
本章节主要介绍 flink 的网络交互,包括每个 task 的输入输出管理,内存分配和释放等,因为涉及到内存申请,这里会介绍 flink 的内存管理
阅读全文 »

TaskManager 基本组件

发表于 2017-02-09 | 分类于 Flink源码 | | 阅读次数:
TaskManager 在 Flink 中也被叫做一个 Instance,统一管理该物理节点上的所有 Flink job 的 tasks 运行,它的功能包括了 task 的启动销毁、内存管理、磁盘IO、网络传输管理等,本章将一一介绍这些功能,方面后续章节的开展
阅读全文 »
12
chenyuzhao

chenyuzhao

热情、对技术偏执、不善交际

14 日志
1 分类
4 标签
RSS
GitHub E-Mail
© Mon Oct 23 2017 08:00:00 GMT+0800 (CST) — 2018 chenyuzhao
由 Hexo 强力驱动
|
主题 — NexT.Mist