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 ...
随机推荐
- 查看Linux系统、Apche、Nginx、 MySQL 、 PHP 版本
1. 查看Linux版本: uname -a: more /etc/issue; cat /proc/version; 2. 查看Mysql版本: 在终端下执行 mysql -V #V必须大写 在he ...
- 数据结构 - 单链表 C++ 实现
单链表 单链表的定义 typedef int ElemType; typedef struct LNode { ElemType data; LNode *next; } LNode, *LinkLi ...
- tea加密算法及其变种的研究
tea 介绍 "TEA" 的全称为"Tiny Encryption Algorithm" 是1994年由英国剑桥大学的David j.wheeler发明的. T ...
- MySQL面试题--常见的四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- 说说对 SQL 语句优化有哪些方法?(选择几条)
1.Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可 以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后. 2.用 EXISTS 替代 ...
- Java并发机制(8)--concurrent包下辅助类的使用
Java并发编程:concurrent包下辅助类的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920397.html 1.CountDown ...
- 面试问题之计算机网络:简述TCP和UDP的区别以及优缺点
转载于:https://blog.csdn.net/liulin1207/article/details/80960964 一.TCP: TCP是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四 ...
- mybatis 自定义插件的使用
今天看了别人的mybatis的教学视频,自己手写了一个简单的自定义的插件,有些细节记录一下. 先看下mybatis的插件的一些说明: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用. ...
- (转载) MOS管区分NP沟道
三极管是流控型器件,MOS管是压控型器件,两者存在相似之处.三极管机可能经常用,但MOS管你用的可能较少.对于MOS管先抛出几个问题: 如何区分P-MOS和N-MOS: 如何区分MOS的G.D.S ...
- Citus 分布式 PostgreSQL 集群 - SQL Reference(查询处理)
一个 Citus 集群由一个 coordinator 实例和多个 worker 实例组成. 数据在 worker 上进行分片和复制,而 coordinator 存储有关这些分片的元数据.向集群发出的所 ...