flink调优之RocksDB设置
一、开启监控
RocksDB是基于LSM Tree实现的,写数据都是先缓存到内存中,所以RocksDB的写请求效率比较高。RocksDB使用内存结合磁盘的方式来存储数据,每次获取数据时,先从内存中blockcache中查找,如果内存中没有再去磁盘中查询。使用
RocksDB时,状态大小仅受可用磁盘空间量的限制,性能瓶颈主要在于RocksDB对磁盘的读请求,每次读写操作都必须对数据进行反序列化或者序列化。当处理性能不够时。仅需要横向扩展并行度即可提高整个Job的吞吐量。

flink1.13中引入了State访问的性能监控,即latency tracking state、此功能不局限于State Backend的类型,自定义实现的State Backend也可以复用此功能。

state访问的性能监控会产生一定的性能影响,所以默认每100次做一次抽样sample,对不同的state Backend性能损失影响不同。
对于RocksDB State Backend,性能损失大概在1%左右
对于heap State Backend,性能损失最多可达10%(内存本身速度比较快,一点损失影响就很大)
关于性能监控的一些参数,正常开启第一个参数即可,
state.backend.latency-track.keyed-state-enabled:true //启用访问状态的性能监控
state.backend.latency-track.sample-interval:100 //采样间隔
state.backend.latency-track.histroy-size:128 //保留的采样数据个数,越大越精确
state.backend.latency-track.state-name-as-variable:true //将状态名作为变量

0代表是任务编号,filter.visit-state是定义的状态的变量名

有很多这种统计值可以查看,中位值,75分位值等。
二、RocksDB状态优化
①开启增量检查点:
RocksDB是目前唯一可用于支持有状态流处理应用程序增量检查点的状态后端,可以修改参数开启增量检查点:
state.backend.incremental:true //默认false,可以改为true
或代码中指定 new EmbededRocksDBStateBackend(true)
②开启本地恢复:当flink任务失败时,可以基于本地的状态信息进行恢复任务。可能不需要从hdfs拉取数据。本地恢复目前仅涵盖键值类型的状态后端(RocksDB)。MemoryStateBackend不支持本地恢复并忽略此选项
state.backend.local-recovery:true
③如果你有多块磁盘,可以考虑指定本地多目录
state.backend.rocksdb.localdir:
/data1/flink/rocksdb,/data2/flink/rocksdb,/data3/flink/rocksdb
不要配置单块磁盘的多个目录,务必将目录配置到多块不同的磁盘上,让多块磁盘来分担io压力
三、增量检查点优化效果案例
提交一个任务,具体参数如下
bin/flink run \
-t yarn-per-job \
-d \
-p 5 \
-Dyarn.application.queue=test \
-Djobmanager.memory.process.size=2048mb \
-Dtaskmanager.memory.process.size=4096mb \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dstate.backend.latency-track.keyed-state-enabled=true \ //开启状态监控
-c com.xxx.xxx.Demo \
在flink ui查看状态的监控

然后重新提交任务,在提交时增加参数:
-Dstate.backend.incremental=true \ //开启增量检查点
-Dstate.backend.local-recovery=true \ //开启本地恢复
代码中增加 env.setStateBackend(new EmbeddedRocksDBStateBackend()) //状态后端使用RocksDB

查看两张图的checkpointed data size,可以发现,第一次任务(第一张图)checkpoint时是全量备份,所以状态是越来越大的,从1m+增加到了3m+, 而第二次任务它每次checkpoint的状态大小是有大有小的,范围在200kb-1.2m之间
再查看End to End Duration,第一次任务的状态后端是内存存储,而时间却略大于第二次任务,说明增量的RocksDB的效果有可能好于全量的memory
四、调整RockSDB的预定义选项。
预定义选项就是一个选项集合,如果调整预定义选项达不到预期,再去调整block、writebuffer等参数。
当前支持的预定义选项有支持的选项有:
DEFAULT
SPINING_DISK_OPTIMIZED
SPINNING_DISK_OPTIMIZED_HIGH_MEM
FLASH_SSD_OPTIMIZED (有条件使用ssd的可以使用这个选项)
我们一般使用第三个SPINNING_DISK_OPTIMIZED_HIGH_MEM,设置为机械硬盘+内存模式
该模式下flink会帮我们设置一些它认为比较ok的参数(选项集合),具体如下:

可以在提交任务时指定
state.backend.rocksdb.predefined-options:SPINNING_DISK_OPTIMIZED_HIGH+MEN
也可以在代码中指定:
EmbededRocksDBStateBackend embededRocksDBStateBackend = new EmbededRocksDBStateBackend();
EmbededRocksDBStateBackend,setPredefinedOptions(PredefinedOptions.SPINNING_DISK_OPTIMIZED_HIGH_MEM);
env.setStateBackend(embeddedRocksDBStateBackend);
flink调优之RocksDB设置的更多相关文章
- Spark性能调优之合理设置并行度
Spark性能调优之合理设置并行度 1.Spark的并行度指的是什么? spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度! 当分配 ...
- Flink调优
第1章 资源配置调优 Flink性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略. ...
- 生产环境下JVM调优参数的设置实例
JVM基础:生产环境参数实例及分析 原始配置: -Xms128m -Xmx128m -XX:NewSize=64m -XX:PermSize=64m -XX:+UseConcMarkSweepGC - ...
- JVM调优及参数设置
(1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持 ...
- Linux系统调优及安全设置
1.关闭SELinux #临时关闭 setenforce 0 #永久关闭 vim /etc/selinux/config SELINUX=disabled 2.设定运行级别为3 #设定运行级别 vim ...
- nginx调优buffer参数设置
内容来自 https://blog.tanteng.me/2016/03/nginx-buffer-params/.有空再详细了解 Nginx性能调优之buffer参数设置 打开Nginx的error ...
- Tomcat性能调优 通过ExpiresFilter设置资源缓存
转自 http://www.cnblogs.com/daxin/p/3995287.html [简介] ExpiresFilter是Java servlet API 当中的一部分,它负责控制设置res ...
- 22.centos7基础学习与积累-008-系统调优及安全设置
从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 1.关闭selinux功能: SELinux(Securety-EnhancedLi ...
- Linux之【安装系统后的调优和安全设置】
关闭SElinux功能 •修改配置文件使其永远生效 第一种修改方法vi vi /etc/sysconfig/selinuc 或者 vi /etc/selinux/config修改: SELINUX=d ...
随机推荐
- 分享一些阅读Java相关框架源码的经验
昨天和部分网友进行了线上的交流,交流中有不少网友提到阅读源码比较难,不知道怎么上手.胖哥分享了一些个人经验,这里总结一下. 阅读源码实际上是Debug源码 其实所谓的阅读源码并不是单纯的阅读,而是调试 ...
- count(*)这么慢,我该怎么办?
1)计算一个表有多少行数用什么命令? select count(*) from t 2)count(*)底层是怎样实现的? 在MYISAM中,是把这个总行数存到磁盘中去的,要的时候直接去读就行,特别快 ...
- IIS将应用程序池配置为在计划时间执行回收 (IIS 7)
将应用程序池配置为在计划时间执行回收 您可以通过以下方法执行此过程:使用用户界面 (UI).在命令行窗口中运行 Appcmd.exe 命令.直接编辑配置文件或编写 WMI 脚本. 如下只介绍用户界面U ...
- (转)Linux的文件权限与目录配置
ref:https://www.cnblogs.com/ysocean/p/7712412.html#_label1_0 (转)Linux文件权限和目录配置 1.Linux命令的普遍语法格式 命令格式 ...
- String 是最基本的数据类型吗?
不是. Java中基本数据类型只有8个:byte.short.int.long.float.double.char.boolean:除了基本类型(primitive type),剩下都是引用类型(re ...
- 为什么要使用 kafka,为什么要使用消息队列?
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理. 解耦 ...
- 模糊查询 like 语句该怎么写?
第 1 种:在 Java 代码中添加 sql 通配符. string wildcardname = "%smi%"; list<name> names = mapper ...
- char 和 varchar 的区别是什么?float 和 double 的区别是什么?
char 和 varchar 的区别是什么? char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 ...
- 使用mqtt+ssl加密 WebSocket 客户端连接 MQTT 服务器以及ws+wss协议
上篇用TLS/SSL保证EMQ的网络传输安全讲了使用自签ca加密MQTT传输数据,如果mqtt用在web端,如何使用ssl.tsl加密? 1.web客户端 // 引入mqtt.min.js // 将在 ...
- springBoot集成Elasticsearch抛出Factory method 'restHighLevelClient' threw exception; nested exception is java.lang.NoSuchFieldError: IGNORE_DEPRECATIONS
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restHighLeve ...