flink调优之RocksDB设置

一、开启监控

RocksDB是基于LSM Tree实现的,写数据都是先缓存到内存中,所以RocksDB的写请求效率比较高。RocksDB使用内存结合磁盘的方式来存储数据,每次获取数据时,先从内存中blockcache中查找,如果内存中没有再去磁盘中查询。使用

RocksDB时,状态大小仅受可用磁盘空间量的限制,性能瓶颈主要在于RocksDB对磁盘的读请求,每次读写操作都必须对数据进行反序列化或者序列化。当处理性能不够时。仅需要横向扩展并行度即可提高整个Job的吞吐量。

《flink调优之RocksDB设置》

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

《flink调优之RocksDB设置》

 

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  //将状态名作为变量

《flink调优之RocksDB设置》

 

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

 《flink调优之RocksDB设置》

 

 

有很多这种统计值可以查看,中位值,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查看状态的监控《flink调优之RocksDB设置》

 

 《flink调优之RocksDB设置》

 

 然后重新提交任务,在提交时增加参数:

-Dstate.backend.incremental=true  \                      //开启增量检查点

-Dstate.backend.local-recovery=true \                    //开启本地恢复

代码中增加 env.setStateBackend(new EmbeddedRocksDBStateBackend())   //状态后端使用RocksDB

《flink调优之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的参数(选项集合),具体如下:

《flink调优之RocksDB设置》

可以在提交任务时指定

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); 

 

    原文作者:肥仔佳文猪
    原文地址: https://www.cnblogs.com/feizaijiawenzhu/p/16127197.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞