作者: 施晓罡

本文来自2018年8月11日在北京举行的 Flink Meetup会议,分享来自于施晓罡,目前在阿里大数据团队部从事Blink方面的研发,现在主要负责Blink状态管理和容错相关技术的研发

本文主要内容如下:

  • 有状态的流数据处理;

  • Flink中的状态接口;

  • 状态管理和容错机制实现;

  • 阿里相关工作介绍;

一.有状态的流数据处理

1.1什么是有状态的计算

计算任务的结果不仅仅依赖于输入,还依赖于它的当前状态,其实大多数的计算都是有状态的计算。 比如wordcount,给一些word,其计算它的count,这是一个很常见的业务场景。count做为输出,在计算的过程中要不断的把输入累加到count上去,那么count就是一个state。

1.2.传统的流计算系统缺少对于程序状态的有效支持

  • 状态数据的存储和访问;

  • 状态数据的备份和恢复;

  • 状态数据的划分和动态扩容;

在传统的批处理中,数据是划分为块分片去完成的,然后每一个Task去处理一个分片。当分片执行完成后,把输出聚合起来就是最终的结果。在这个过程当中,对于state的需求还是比较小的。

对于流计算而言,对State有非常高的要求,因为在流系统中输入是一个无限制的流,会运行很长一段时间,甚至运行几天或者几个月都不会停机。在这个过程当中,就需要将状态数据很好的管理起来。很不幸的是,在传统的流计算系统中,对状态管理支持并不是很完善。比如storm,没有任何程序状态的支持,一种可选的方案是storm+hbase这样的方式去实现,把这状态数据存放在Hbase中,计算的时候再次从Hbase读取状态数据,做更新在写入进去。这样就会有如下几个问题

  • 流计算系统的任务和Hbase的数据存储有可能不在同一台机器上,导致性能会很差。这样经常会做远端的访问,走网络和存储;

  • 备份和恢复是比较困难,因为Hbase是没有回滚的,要做到Exactly onces很困难。在分布式环境下,如果程序出现故障,只能重启Storm,那么Hbase的数据也就无法回滚到之前的状态。比如广告计费的这种场景,Storm+Hbase是是行不通的,出现的问题是钱可能就会多算,解决以上的办法是Storm+mysql,通过mysql的回滚解决一致性的问题。但是架构会变得非常复杂。性能也会很差,要commit确保数据的一致性。

  • 对于storm而言状态数据的划分和动态扩容也是非常难做,一个很严重的问题是所有用户都会在strom上重复的做这些工作,比如搜索,广告都要在做一遍,由此限制了部门的业务发展。

1.3.Flink丰富的状态访问和高效的容错机制

Flink在最早设计的时候就意识到了这个问题,并提供了丰富的状态访问和容错机制。如下图所示:

二.Flink中的状态管理

2.1.按照数据的划分和扩张方式,Flink中大致分为2类:

  • Keyed States

  • Operator States

2.1.1.Keyed States

Keyed States的使用

Flink也提供了Keyed States多种数据结构类型

Keyed States的动态扩容

2.1.2.Operator State

Operator States的使用

Operator States的数据结构不像Keyed States丰富,现在只支持List

Operator States多种扩展方式

Operator States的动态扩展是非常灵活的,现提供了3种扩展,下面分别介绍:

  • ListState:并发度在改变的时候,会将并发上的每个List都取出,然后把这些List合并到一个新的List,然后根据元素的个数在均匀分配给新的Task;

  • UnionListState:相比于ListState更加灵活,把划分的方式交给用户去做,当改变并发的时候,会将原来的List拼接起来。然后不做划分,直接交给用户;

  • BroadcastState:如大表和小表做Join时,小表可以直接广播给大表的分区,在每个并发上的数据都是完全一致的。做的更新也相同,当改变并发的时候,把这些数据COPY到新的Task即可

以上是Flink Operator States提供的3种扩展方式,用户可以根据自己的需求做选择。

使用Checkpoint提高程序的可靠性

用户可以根据的程序里面的配置将checkpoint打开,给定一个时间间隔后,框架会按照时间间隔给程序的状态进行备份。当发生故障时,Flink会将所有Task的状态一起恢复到Checkpoint的状态。从哪个位置开始重新执行。

Flink也提供了多种正确性的保障,包括:

  • AT LEAST ONCE;

  • Exactly once;

备份为保存在State中的程序状态数据

Flink也提供了一套机制,允许把这些状态放到内存当中。做Checkpoint的时候,由Flink去完成恢复。

从已停止作业的运行状态中恢复

当组件升级的时候,需要停止当前作业。这个时候需要从之前停止的作业当中恢复,Flink提供了2种机制恢复作业:

  • Savepoint:是一种特殊的checkpoint,只不过不像checkpoint定期的从系统中去触发的,它是用户通过命令触发,存储格式和checkpoint也是不相同的,会将数据按照一个标准的格式存储,不管配置什么样,Flink都会从这个checkpoint恢复,是用来做版本升级一个非常好的工具;

  • External Checkpoint:对已有checkpoint的一种扩展,就是说做完一次内部的一次Checkpoint后,还会在用户给定的一个目录中,多存储一份checkpoint的数据;

三.状态管理和容错机制实现

下面介绍一下状态管理和容错机制实现方式,Flink提供了3种不同的StateBackend

  • MemoryStateBackend

  • FsStateBackend

  • RockDBStateBackend

用户可以根据自己的需求选择,如果数据量较小,可以存放到MemoryStateBackend和FsStateBackend中,如果数据量较大,可以放到RockDB中。

下面介绍HeapKeyedStateBackend和RockDBKeyedStateBackend

第一,HeapKeyedStateBackend
第二,RockDBKeyedStateBackend
Checkpoint的执行流程

Checkpoint的执行流程是按照Chandy-Lamport算法实现的。

Checkpoint Barrier的对齐
全量Checkpoint

全量Checkpoint会在每个节点做备份数据时,只需要将数据都便利一遍,然后写到外部存储中,这种情况会影响备份性能。在此基础上做了优化。

RockDB的增量Checkpoint

RockDB的数据会更新到内存,当内存满时,会写入到磁盘中。增量的机制会将新产生的文件COPY持久化中,而之前产生的文件就不需要COPY到持久化中去了。通过这种方式减少COPY的数据量,并提高性能。

四.阿里相关工作介绍

4.1.Flink在阿里的成长路线

阿里是从2015年开始调研Flink,2015年10月启动Blink项目,并完善Flink在大规模生产下的一些优化和改进。2016年双11采用了Blink系统,为搜索,推荐,广告业务提供服务。2017年5月Blink已成为阿里的实时计算引擎。

4.2.阿里在状态管理和容错相关的工作

正在做的工作,基于State重构Window方面的一些优化,阿里也正在将功能做完善。后续将包括asynchronous Checkpoint的功能完善,并和社区进一步沟通和合作。帮助Flink社区完善相关方面的工作。

更多资讯请访问 Apache Flink 中文社区网站

Flink状态管理和容错机制介绍相关推荐

  1. Flink 状态管理与 Checkpoint 机制

    点击上方"zhisheng",选择"设为星标" 一.状态分类 相对于其他流计算框架,Flink 一个比较重要的特性就是其支持有状态计算.即你可以将中间的计算结果 ...

  2. 大数据入门--Flink(四)状态管理与容错机制

    状态管理与容错机制 术语 状态管理 容错机制 状态一致性 检查点(checkpoint) 保存点(savepoint) 状态后端(state backend) 案例 术语 算子状态.键控状态.状态一致 ...

  3. Flink状态管理与CheckPoint、Savepoint

    转载自:https://blog.csdn.net/hxcaifly/article/details/84673292     https://blog.csdn.net/rlnLo2pNEfx9c/ ...

  4. Flink教程(14)- Flink高级API(容错机制)

    文章目录 01 引言 02 Checkpoint 2.1 Checkpoint VS State 2.2 Checkpoint 执行流程 2.2.1 简单流程 2.2.2 复杂流程 2.3 State ...

  5. 2021年大数据Flink(二十五):Flink 状态管理

    目录 Flink-状态管理 Flink中的有状态计算 无状态计算和有状态计算 无状态计算 有状态计算 有状态计算的场景 状态的分类 Managed State & Raw State Keye ...

  6. Flink 状态管理:算子状态、键值分区状态、状态后端、有状态算子的扩缩容

    文章目录 状态管理 算子状态 键值分区状态 状态后端(State Backends) 有状态算子的扩缩容 状态管理 通常意义上,函数里所有需要任务去维护并用来计算结果的数据都属于任务的状态,可以把状态 ...

  7. 科普系列—低速容错CAN的容错机制介绍

    汽车的CAN总线大致可以分为三大类,分别是:单线CAN(GM专用的低速CAN).高速CAN(通信速率高)以及低速容错CAN(通信速率较低但容错性能好).本文所要讲述的是低速容错CAN.在传统的分布式架 ...

  8. Flink 状态管理

    1.MemoryStateBackend(Default) • 内存级的状态后端,会将键控状态作为内存中的对象进⾏管理,将它们存储在 TaskManager 的 JVM 堆上,⽽将 checkpoin ...

  9. 【推荐实践】Flink 状态(State)管理在推荐场景中的应用

    导语 Flink 提供了灵活丰富的状态管理,可轻松解决数据之间的关联性.本文介绍了Flink 状态(State)管理在推荐场景中的应用,大家结合自己的应用场景与业务逻辑,选择合适的状态管理. 背景 F ...

最新文章

  1. edit怎么读英语_名师说学习:英语学习有方法
  2. shareSDK(分享第三方库)的 使用
  3. Xshell链接远程服务器调用Pycharm的方法
  4. [Apio2012]dispatching 主席树做法
  5. VMtools的安装与卸载
  6. 当我学完Python我学了些什么
  7. BZOJ 3527: [ZJOI2014]力(FFT)
  8. gulp教程之gulp-htmlmin压缩html
  9. 【kafka】Kafka扩容
  10. oracle中实现分页,Oracle中实现分页的方法
  11. 以太坊开发入门,如何搭建一个区块链DApp投票系统
  12. [译]JavaScript中的属性:定义和赋值的区别
  13. Java 实现 植物大战僵尸 小游戏【附源码】
  14. android 测试手机屏幕,如何才能知道自己手机屏幕质量如何 安卓手机专业测屏神器体验...
  15. 数字图像处理课程设计-疲劳检测系统
  16. Linux的tomcat文件夹下没有startup.sh
  17. android的 root权限
  18. pv 、uv、ip、vv、cv分别是什么
  19. c语言数字的写法田字格,数字100田字格怎么写
  20. Latex 字体的设置

热门文章

  1. 【转】关于OnPaint的工作机制
  2. 并发入库面临重复数据的问题
  3. 第3章 文件操作-函数练习题
  4. Hamilton四元数
  5. 如何在centos7上安装源码包
  6. C# AE 对图层筛选要素后显示/只显示符合条件的要素
  7. SQLServer的本月统计和本周统计
  8. [ZT]CCNA课堂精简笔记 2
  9. Oracle 单实例 迁移到 RAC 实例 -- 使用RMAN 异机恢复
  10. 类型转换和页面获取值(总爱忘的)