1.总览

savepoints是外部存储的自包含的checkpoints,可以用来stop and resume,或者程序升级。savepoints利用checkpointing机制来创建流式作业的状态的完整快照(非增量快照),将checkpoint的数据和元数据都写入到一个外部文件系统。

如何触发、恢复或者释放savepoint了?下面一一道来。

2.分配Operator ID

极度推荐你给每个方法分配一个uid,这样才可以升级应用。ID起到的作用是明确每个operator的状态的使用范围。

DataStream<String> stream = env.
// Stateful source (e.g. Kafka) with ID
.addSource(new StatefulSource())
.uid("source-id") // ID for the source operator
.shuffle()
// Stateful mapper with ID
.map(new StatefulMapper())
.uid("mapper-id") // ID for the mapper
// Stateless printing sink
.print(); // Auto-generated ID

如果不手动指定ID,则系统会自动创建。如果这些ID不变,则应用可以被自动恢复出来。但是自动创建的ID依赖于应用的结构,任何应用的变动都可能导致ID的变化。所以,请手动分配ID吧。

Savepoint State

什么是savepoint了?savepoint对每个有状态的operator保存一个map的KV结构,Operator ID -> State 。

Operator ID | State
------------+------------------------
source-id | State of StatefulSource
mapper-id | State of StatefulMapper

上面代码片段的print方法没有savepoint结构,因为他是无状态的。通常,会尝试将map的每个entry都恢复回去。

3.Operations

可以利用cli来触发savepoint,或者cancel一个作业的同时做savepoint,或者从某个savepoint恢复,或者释放savepoint。

如果Flink版本大于1.2.0,则可以通过webui来恢复savepoints。

Triggering Savepoints

当触发savepoint的时候,新的savepoint目录就会被创建,数据和元信息都会保存在这里。保存的位置可以是默认的目录,也可以是trigger命令指定的目录。但要注意,这个目录需要是JM和TM都可以访问的目录。

举例,对于FsStateBackend 或者 RocksDBStateBackend而言:

# Savepoint target directory
/savepoints/ # Savepoint directory
/savepoints/savepoint-:shortjobid-:savepointid/ # Savepoint file contains the checkpoint meta data
/savepoints/savepoint-:shortjobid-:savepointid/_metadata # Savepoint state
/savepoints/savepoint-:shortjobid-:savepointid/...

通常,不建议移动savepoints到别的地方,因为_metadata里面有绝对路径。但是在使用MemoryStateBackend的时候,元信息和数据会一起被存入_metadata文件,所以可以移动。

Trigger a Savepoint

$ bin/flink savepoint :jobId [:targetDirectory]

如果命令会以jobid触发一次savepoint,返回的是本次savepoint的路径,这个路径可以用来恢复或者释放savepoint。

Trigger a Savepoint with YARN

$ bin/flink savepoint :jobId [:targetDirectory] -yid :yarnAppId

以jobId和yarnAppId来触发savepoint。

Cancel Job with Savepoint

$ bin/flink cancel -s [:targetDirectory] :jobId

取消作业的同时触发一次savepoint。

Resuming from Savepoints

$ bin/flink run -s :savepointPath [:runArgs]

这样提交作业就会让作业在指定的savepoint恢复出来,路径可以是savepoint的目录,也可以是_metadata的文件地址。

Allowing Non-Restored State

通常,恢复意味着savepoint的每一个状态都要恢复到应用中去,但如果你恰好去掉了某个operator,你可以通过设置来忽略这个状态,--allowNonRestoredState。

$ bin/flink run -s :savepointPath -n [:runArgs]

Disposing Savepoints

$ bin/flink savepoint -d :savepointPath

如上,就释放了存储在savepointPath位置的savepoint。

其实也可以手动删除某个savepoint,这通过常规的文件系统操作就可以做到,并且不影响别的savepoints和checkpoints。

Configuration

可以通过配置项state.savepoints.dir来定义一个默认的savepoint存储目录。当触发savepoints的时候,这个目录就会被用来存储savepoint,但是你也可以通过在trigger命令中指定目录来覆盖默认设置。

# Default savepoint target directory
state.savepoints.dir: hdfs:///flink/savepoints

如果既没有默认目录,也没有指定目录,则触发savepoint就会失败。

4.FAQ

  1. 是否需要给所有的operator指定ID?原则上,只需要给有状态的operator设置id就可以。但建议给所有的operator都设置。
  2. 如果新的应用添加了一个有状态的operator会怎样?应用恢复的时候,新添加的operator会被当做没有状态来处理。
  3. 如果删除了一个了?默认,恢复作业是所有状态都要恢复,删除了一个就会导致恢复失败,除非你指定可以忽略,见上面。
  4. 如果改变了operator的顺序了?如果是你手动指定的id,则恢复不受影响。如果是自动生成的,改变了顺序往往也意味着id的改变,所以恢复会失败。
  5. 如果添加、删除或者改变了没有状态的operator的顺序了?同4,手动设置了id则不受影响,否则会失败。
  6. 如果改变了应用的并行度了?对于版本在1.2.0之后的,没影响?版本在之前怎么办?只能将应用和savepoint都升级到1.2.0之后。

Flink之状态之savepoint的更多相关文章

  1. Flink的状态与容错

    本文主要运行到Flink以下内容 检查点机制(CheckPoint) 状态管理器(StateBackend) 状态周期(StateTtlConfig) 关系 首先要将state和checkpoint概 ...

  2. Flink Streaming状态处理(Working with State)

    参考来源: https://www.jianshu.com/p/6ed0ef5e2b74 https://blog.csdn.net/Fenggms/article/details/102855159 ...

  3. [Flink原理介绍第四篇】:Flink的Checkpoint和Savepoint介绍

    原文:https://blog.csdn.net/hxcaifly/article/details/84673292 https://blog.csdn.net/zero__007/article/d ...

  4. 「Flink」Flink的状态管理与容错

    在Flink中的每个函数和运算符都是有状态的.在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作.为了让状态容错,Flink需要设置checkpoint状态.Flink程序是通过chec ...

  5. 9、flink的状态与容错

    1.理解State(状态) 1.1.State 对象的状态 Flink中的状态:一般指一个具体的task/operator某时刻在内存中的状态(例如某属性的值) 注意:State和Checkpoint ...

  6. Flink的状态编程和容错机制(四)

    一.状态编程 Flink 内置的很多算子,数据源 source,数据存储 sink 都是有状态的,流中的数据都是 buffer records,会保存一定的元素或者元数据.例如 : ProcessWi ...

  7. Flink的状态管理与恢复机制

    参考地址:https://www.cnblogs.com/airnew/p/9544683.html 问题一.什么是状态? 问题二.Flink状态类型有哪几种? 问题三.状态有什么作用? 问题四.如何 ...

  8. flink 有状态udf 引起血案一

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/83422587 场景 近期在做一个画像的 ...

  9. Flink之状态之checkpointing

    1.前言 在Flink中,函数和操作符都可以是有状态的.在处理每个消息或者元素时,有状态的函数都会储存信息,使得状态成为精密操作中关键的组成部分. 为了使状态能够容错,Flink会checkpoint ...

随机推荐

  1. web网络攻击解决方案

    原文地址:https://www.xingkongbj.com/blog/http/web-attack.html 产生原因 HTTP 不具备安全功能. 在客户端可以篡改请求. 跨站脚本攻击 XSS ...

  2. org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field xxx exceeds its maximum permitted size of 1048576 bytes.

    springboot 通过MultipartFile接受前端传过来的文件时是有文件大小限制的(springboot内置tomact的的文件传输默认为1MB),我们可以通过配置改变它的大小限制 首先在启 ...

  3. Percona XtraDB Cluster 5.7安装配置

    优点:1.准同步复制2.多个可同时读写节点,可实现写扩展,较分片方案更进一步3.自动节点管理4.数据严格一致5.服务高可用缺点:1.只支持innodb引擎2.所有表都要有主键3.所有的写操作都将发生在 ...

  4. css实现未知元素宽高垂直居中和水平居中的方法

    第一种:display:table-cell的方式 .container { /*父级容器*/ display:table-cell; text-align:center; vertical-alig ...

  5. STM32Cube 5.0 使用V1.7.0的固件库生成keil5环境下的F1工程时发现问题

    生成的stm32f1xx_hal_msp.c文件里面,HAL_MspInit(void)函数居然没有了之前1.6库里面的系统中断优先级的设置: /* MemoryManagement_IRQn int ...

  6. 20190105-打印字母C,H,N,口等图像和杨辉三角

    1. 打印字母C ****** * * * * ****** def print_c(n): print('*' * n) for i in range(n): print('* ') print(' ...

  7. Centos安装docker#避免很多坑

    采用yum方式安装 安装: step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 Step 2 ...

  8. Windows和Linux系统下,虚拟环境安装的全面说明和详细步骤

    虚拟环境的创建和使用 用途: ​ 1.在同一台电脑安装同一个包的不同版本 2.记录项目所用的所有的包的版本,方便部署. 如何使用: 1.创建虚拟环境 mkvirtualenv 虚拟环境名 -p pyt ...

  9. Java学习笔记九:Java的循环跳转语句

    Java的循环跳转语句 一:Java循环跳转语句之break: 生活中,我们经常会因为某些原因中断既定的任务安排.如在参加 10000 米长跑时,才跑了 500 米就由于体力不支,需要退出比赛.在 J ...

  10. ansible结合SHELL搭建自己的CD持续交付系统

    一. 设计出发点 因公司业务面临频繁的迭代上线,一日数次.仅仅依靠手工效率过低且易出错. 考虑搭建一套可以满足现有场景的上线系统. 二 .为何采用ansible+shell方式 1.可控性(完全自主拥 ...