Flink状态(二)
Flink提供了不同的状态存储方式,并说明了状态如何存和存储在哪里。
状态可以被存储在Jvm的堆和堆外。根据状态存储方式的不同,Flink也能代替应用管理状态,意思是Flink能够进行内存管理(有必要的时候,可能会溢出到硬盘),允许应用保存非常大的状态。默认情况下,在配置文件flink-conf.yaml中为所有Flink作业配置状态存储方式。
然而,默认的状态存储方式配置可以被单独的作业设置覆盖,就像下面那样。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(...);
使用Data Stream API写的程序经常需要以多种情况保存状态:
- 在窗口被触发之前, 窗口需要保存或聚合元素
- 转换算子也许会使用key/value状态接口保存数据
- 转换算子也许实现
CheckpointedFunction接口使本地变量容错。
当checkpointing被激活的时候,一旦发生checkpoint,状态会被保存,这样数据就不会丢失,并且在恢复的时候能够保持数据一致性。状态在内部是怎么表示的,以及当checkpoint的时候,状态怎么样被保存,以及保存到哪里依赖选择的状态存储方式。
Flink提供了三种开箱即用的状态存储方式:
- MemoryStateBackend 内存存储
- FsStateBackend 文件系统存储
- RocksDBStateBackend RocksDB存储
如果没有特殊配置,系统默认使用内存存储方式。
MemoryStateBackend 内存存储
内存存储:在Java堆中保存状态对象。Key/Value状态和窗口算子都会以Hash表的方式保存状态值,触发器等。
当checkpoint的时候,状态存储将会快照状态,将当checkpoint向JobManager发送回执消息时,作为消息的一部分发给JobManager(master),JobManager会将状态存储到堆内存中。
可以配置内存存储使用异步快照。我们也强烈推荐使用异步快照,避免阻塞流处理通道。请注意默认是打开异步快照的。如果想要关闭这个特性,用户可以在实现化MemoryStateBackend对象的时候,给构造函数中相应的boolean参数传false(这应该仅用于调试目的)。
new MemoryStateBackend(MAX_MEM_STATE_SIZE, false);
内存存储有如下限制:
- 每一个状态大小默认不超过
5M。这个值可以在实例化MemoryStateBackend的时候增加 - 不管配置的最大状态大小是多少,状态大小不能超过akka配置的桢(一次RPC传输的数据)大小(参数: akka.framesize,默认:10M)。
- 聚合的状态必须适合
JobMaanger内存
以下情况推荐使用内存存储
- 本地开发或调用
- 只保存少量状态的作业。例如仅仅包含一次一条记录算子(例如:Map,FlatMap,Fliter,....)的作业。对于这样的作业,
Kafka Consumer仅仅需要非常少的状态。
FsStateBackend 文件系统存储
通过配置文件系统的URL(类型,地址,路径)使用文件系统存储。例如"hdfs://namenode:40010/flink/checkpoints"或者"file:///data/flink/checkpoints"。
FsStateBackend 将状态数据保存在TaskManager’s 内存中。当checkpoint的时候,将状态数据写到配置的文件系统或目录中。最小的元数据会存储到JobManager内存中(或者在HA模式下,存储到checkpoint元数据中).
FsStateBackend 默认使用异步快照,以避免阻塞流处理。如果想禁止该特性,在实现化FsStateBackend对象的时候,构造函数中应的参数传入false即可。
new FsStateBackend(path, false);
以下情况,推荐使用FsStateBackend
- 具有大状态,长窗口,大的key/value状态的作业
- 所有HA模式下
RocksDBStateBackend RocksDB存储
要想使用RocksDB存储,需要配置文件系统的URL(类型,地址,路径)。例如"hdfs://namenode:40010/flink/checkpoints"或者"file:///data/flink/checkpoints"。
RocksDBStateBackend 将状态数据保存到RocksDB数据库.RocksDB文件默认会存储到TaskManager的数据目录中。当checkpoint的时候,整个RocksDB数据库将会保存到配置的文件系统或目录中。最小的元数据会存储到JobManager内存中(或者在HA模式下,存储到checkpoint元数据中).
RocksDBStateBackend 总是执行异步快照。
RocksDBStateBackend 具有如下限制:
- 由于 RocksDB JNI通信使用的API基于byte[],每个key或每个value最大支持2^31字节。
注意: 在以RocksDB作用存储情况下,使用merge操作的状态(例如:ListState)会默默地将值大小累加到大于2^31字节,当再次读取的时候会失败,这是目前RocksDB JNI的限制。
以下情况,推荐使用RocksDBStateBackend
- 具有非常大的状态,长窗口,大的key/value状态的作业
- 所有HA模式下
你可以保存的状态数据量仅仅受限于磁盘剩余空间大小。与将状态保存到内存中的``FsStateBackend `相比,可以保存更大的状态。然而这也意味着能达到的最大吞吐量更小。因为所有从rocksDB读或写入rocksDB都需要经过序列化与反序例化,比那些基于Java堆的存储后端开销更大。
RocksDBStateBackend 是目前唯一提供 增量的checkpoint的存储。
RocksDB的一些指标可以被获取,但是默认没打开,可以在这里找到全部文档说明。
配置状态存储
如果你什么也没配置,默认的状态存储在JobManager内存中。如果你希望为所有作业默认一个其它的存储,你可以在flink-conf.ymal中配置其它的存储。当然,每一个作业也能单独设置存储。
每个作业单独设置存储
下面示例显示StreamExecutionEnvironment 的作业如何设置存储。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints"));
如果你想使用 RocksDBStateBackend ,你就必须在你的Flink项目中添加如下Maven依赖。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-statebackend-rocksdb_2.11</artifactId>
<version>1.8.0</version>
</dependency>
设置默认的状态存储
默认的状态存储能够在flink-conf.yaml文件中配置,参数是state.backend. 值可以选择jobmanager(MemoryStateBackend), filesystem(FsStateBackend),rocksdb(RocksDBStateBackend)三者中的一个,也可以配置实现了接口StateBackendFactory的全类名。例如: RocksDBStateBackend 的实现类 org.apache.flink.contrib.streaming.state.RocksDBStateBackendFactory.
state.checkpoints.dir参数定义了checkpoint数据和元数据文件存储的位置,你可以在这里发现更详细的checkpoint目录结构说明
配置示例:
# 状态存储
state.backend: filesystem
# checkpoints数据存储目录
state.checkpoints.dir: hdfs://namenode:40010/flink/checkpoints
翻译自: https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/state/state_backends.html
Flink状态(二)的更多相关文章
- Flink状态管理与状态一致性(长文)
目录 一.前言 二.状态类型 2.1.Keyed State 2.2.Operator State 三.状态横向扩展 四.检查点机制 4.1.开启检查点 (checkpoint) 4.2.保存点机制 ...
- Flink使用二次聚合实现TopN计算-乱序数据
一.背景说明: 在上篇文章实现了TopN计算,但是碰到迟到数据则会无法在当前窗口计算,需要对其中的键控状态优化 Flink使用二次聚合实现TopN计算 本次需求是对数据进行统计,要求每隔5秒,输出最近 ...
- 第09讲:Flink 状态与容错
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- Flink状态专题:keyed state和Operator state
众所周知,flink是有状态的计算.所以学习flink不可不知状态. 正好最近公司有个需求,要用到flink的状态计算,需求是这样的,收集数据库新增的数据. ...
- 大数据计算引擎之Flink Flink状态管理和容错
这里将介绍Flink对有状态计算的支持,其中包括状态计算和无状态计算的区别,以及在Flink中支持的不同状态类型,分别有 Keyed State 和 Operator State .另外针对状态数据的 ...
- Flink状态后端的对比及机制
1. Flink状态后端的类型: MemoryStateBackend FsStateBackend RocksDBStateBackend 2. 各状态后端对比: 2.1 MemoryStateBa ...
- 总结Flink状态管理和容错机制
本文来自8月11日在北京举行的 Flink Meetup会议,分享来自于施晓罡,目前在阿里大数据团队部从事Blink方面的研发,现在主要负责Blink状态管理和容错相关技术的研发. 本文主要内容如 ...
- Flink(二)CentOS7.5搭建Flink1.6.1分布式集群
一. Flink的下载 安装包下载地址:http://flink.apache.org/downloads.html ,选择对应Hadoop的Flink版本下载 [admin@node21 soft ...
- Flink状态管理和容错机制介绍
本文主要内容如下: 有状态的流数据处理: Flink中的状态接口: 状态管理和容错机制实现: 阿里相关工作介绍: 一.有状态的流数据处理# 1.1.什么是有状态的计算# 计算任务的结果不仅仅依赖于输入 ...
- Flink使用二次聚合实现TopN计算
一.背景说明: 有需求需要对数据进行统计,要求每隔5分钟输出最近1小时内点击量最多的前N个商品,数据格式预览如下: 543462,1715,1464116,pv,1511658000 662867,2 ...
随机推荐
- [FAQ] Win10 WSL Ubuntu 根目录实际位置
1. 运行(win+R),直接输入 \\wsl$ 进入Ubuntu的目录. 2. 或者文件夹里同样输入 \\wsl$ 进行查找. Refer:Win10 WSL 路径 Link:https://ww ...
- [FE] uni-app 导航栏开发指南
一种是 原生导航栏添加自定义按钮.简单明了. pages.json 配置 { "path": "pages/log/log", "style" ...
- [Blockchain] 前后端完全去中心化的思路, IPFS 与 Ethereum Contract
我们在使用智能合约的时候,一般是把它当成去中心.减少信任依赖的后端存在. 如果没有特殊后端功能要求,一个 DApp 只需要前端驱动 web3js 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...
- 2019-4-29-win10-uwp-使用-Border-布局
title author date CreateTime categories win10 uwp 使用 Border 布局 lindexi 2019-04-29 12:29:45 +0800 201 ...
- M3U8下载器加嗅探浏览器
M3U8下载器太多了,随便一抓一大把,没什么新奇的. 下载地址: https://www.zhaimaojun.cn/P/%e8%a7%86%e9%a2%91%e7%bd%91%e7%ab%99%e5 ...
- docker-compse 安装nginx 配置目录挂载
一.新建一个启动服务的目录 mkdir /usr/local/docker/compose cd /usr/local/docker/compose 二.新建文件docker-compose.yml ...
- su与sudo用法详解
su与sudo用法详解 目录 su与sudo用法详解 1. su和sudo详解:切换用户身份 1.1 shell登录类型和环境配置文件 1.2 su进行身份切换 1.3 sudo命令详解 1.3.1 ...
- 效率工具mysoV0.3.0功能介绍
也许大家在日常工作中,有使用过提升效率的工具,比如快速搜索文件的Everything:火柴:Listary等,这些工具都在一定程度上提升您的工作效率.myso作为后来者,跟上述软件一样,也是为提升 ...
- C语言:渔夫捕鱼算法问题
题目:渔夫捕鱼 A,B,C,D,E五个渔夫夜间合伙捕鱼,,第二天清A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一 ...
- AIRIOT答疑第4期|如何使用数据分析引擎?
灵活报表曲线,满足各类分析需求! AIRIOT物联网低代码平台的数据分析引擎满足各类型数据分类及分析需求,毫秒级数据反馈速度,快速响应客户分析条件变换查询需求.通过机器学习.融合各种计算模型.人工智能 ...