Flink优化——资源优化(一)

这篇具有很好参考价值的文章主要介绍了Flink优化——资源优化(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

资源配置优化

内存设置 (1CPU 配置 4G 内存)

并行度设置

最优并行度计算

Source 端并行度的配置

Transform 端并行度的配置

Keyby 之前的算子

Keyby 之后的算子 (KeyGroup 最小值为128)

Sink 端并行度的配置

RocksDB 大状态调优

设置本地 RocksDB 多目录:

Checkpoint 设置


资源配置优化

    Flink 性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的心更难调优策略。

    提交方式主要 yarn-per-job ,资源的分配在使用脚本提交 Flink 任务时进行指定。

内存设置 (1CPU 配置 4G 内存)

    生产资源配置:

bin/flink run \
-t yarn-per-job \
-d \
-p 5 \ 指定并行度
-Dyarn.application.queue=test \ 指定 yarn 队列
-Djobmanager.memory.process.size=2048mb \ JM2~4G足够
-Dtaskmanager.memory.process.size=6144mb \ 单个TM2~8G足够
-Dtaskmanager.numberOfTaskSlots=2 \ 与容器核数 1 core:1 slot或1 core:2 slot
-c com.xxxx.classApp
/opt/..../ jar

Flink 是实时流处理,关键在于资源情况能不能抗住高峰时期每秒的数据量,通常用QPS/TPS来描述数据情况。

并行度设置

最优并行度计算

开发完成后,先进行压测,任务并行度给 10 以下,测试单个并行度的处理上限。然后 总 QPS / 单并行度的处理能力 = 并行度

不能只从 QPS 去得出并行度,因为有些字段少、逻辑简单的任务,单并行度一秒处理几万条数据。而有些数据字段多,处理逻辑复杂,单并行度一秒只能处理 1000 条数据。

最好根据高峰期的 QPS 压测, 并行度*1.2倍,富余一些资源。

Source 端并行度的配置

数据源端是 Kafka, Source 的并行度设置为 Kafka 对应 Topic 的分区数

如果已经等于 Kafka 的分区数,消费速度仍跟不上数据生产速度,考虑下 Kafka 要扩大分区,同时调大并行度等于分区数。

Flink 的一个并行度可以处理一至多个分区的数据,如果并行度多于 Kafka 的分区数, 那么就会造成有的并行度空闲,浪费资源。

Transform 端并行度的配置

Keyby 之前的算子

一般不会做太重的操作,都是比如 map、filter、flatmap 等处理较快的算子。并行度可以和 source 保持一致。

Keyby 之后的算子 (KeyGroup 最小值为128)

如果并发较大,建议设置并行度为 2 的整数次幂, 例如:128、256、512;

小并发任务的并行度不一定需要设置成 2 的整数次幂;

大并发任务如果没有 Keyby,并行度也无需设置为 2 的整数次幂;

Sink 端并行度的配置

Sink 端是数据流向下游的地方,可以根据 Sink 端的数据量下游的服务抗压能力 进行评估。

如果 Sink 端是 Kafka,可以设为 Kafka 对应 Topic 的分区数。

Sink 端的数据量小,比较常见的就是监控告警的场景,并行度可以设置的小一些。

Source 端的数据量是最小的,拿到 Source 端流过来的数据后做了细粒度的拆分,数据量不断的增加,到 Sink 端的数据量就非常大。那么在 Sink 到下游的存储中间件的时候就需要提高并行度。

另外 Sink 端要与下游的服务进行交互,并行度还得根据下游的服务抗压能力来设置,如果在 Flink Sink 这端的数据量过大的话,且 Sink 处并行度也设置的很大, 但下游的服务完全撑不住这么大的并发写入, 可能会造成下游服务直接被写挂,所以最终还是要在 Sink 处的并行度做一定的权衡。

RocksDB 大状态调优

RocksDB 是基于 LSM Tree 实现的(类似 HBase),写数据都是先缓存到内存中,所以 RocksDB 的写请求效率比较高。 RocksDB 使用内存结合磁盘的方式来存储数据,每次获取数据时,先从内存中 bolckcache 中查找,如果内存中没有再去磁盘中查询。优化后差不多单并行度 TPS 5000 record/s,性能瓶颈主要在于 RocksDB 对磁盘的读请求,所以当处理性能不够时,仅需要横向扩展并行度即可提高整个 Job 的吞吐量,以下几个调优参数:

设置本地 RocksDB 多目录:

在 flink-conf.yaml 中配置: state.backend.rocksdb.localdir:xxx

注意:不要配置单块磁盘的多个目录,务必将目录配置到多块不同的磁盘上,让多块磁盘来分担压力。当设置多个 RocksDB 本地磁盘目录时, Flink 会随机选择要使用的目录,所以就可能存在三个并行度共用同一目录的情况。如果服务器磁盘数较多,一般不会出现该情况,但是如果任务重启后吞吐量较低,可以检查是否发生了多个并行度共用同一块磁盘的情况。

当一个 TaskManager 包含 3 个 slot 时,那么单个服务器上的三个并行度都对磁盘造成频繁读写,从而导致三个并行度的之间相互争抢同一个磁盘 io,这样务必导致三个并行度的吞吐量都会下降。设置多目录实现三个并行度使用不同的硬盘从而减少资源竞争。

state.backend.incremental: 开启增量检查点,默认 false,改为 true。

state.backend.rocksdb.predefined-options:SPINNING_DISK_OPTIMIZED_HIGH_MEM 设置为机械硬盘 + 内存模式,有条件上 SSD,指定为 FLASH_SSD_OPTIMIZED

state.backend.rocksdb.block.cache-size: 整个 RocksDB 共享一个 block cache,读数据时内存的 cache 大小,该参数越大读数据时缓存命中率越高,默认大小为 8MB,建议设置到 64 - 256 MB

state.backend.rocksdb.thread.num: 用于后台 flush 和合并 sst 文件的线程数,默认为 1, 建议调大,机械硬盘用户可以改为 4 等更大的值。

state.backend.rocksdb.writebuffer.size: RocksDB 中, 每个 State 使用一个 Column Family, 每个 Column Family 使用独占的 write buffer,建议调大,例如:32M

state.backend.rocksdb.writebuffer.count: 每个 Column Family 对应的 writebuffer 数目,默认值是 2, 对应机械磁盘来说,如果内存足够大,可以调大到 5 左右。

state.backend.rocksdb.writebuffer.number-to-merge: 将数据从 writebuffer 中 flush 到磁盘时,需要合并的 writebuffer 数量,默认值为 1,可以调成 3。

Checkpoint 设置

 一般我们的 Checkpoint 时间间隔可以设置为分钟级别,对于状态很大的任务每次 Checkpoint 访问 HDFS 比较耗时,可以设置为 5 - 10 分钟一次 Checkpoint ,并且调大两次 Checkpoint 之间的暂停间隔,例如设置两次 Checkpoint 之间至少暂停 4或8 分钟。

如果 Checkpoint 语义配置为EXACTLY_ONCE,那么在 Checkpoint 过程中还会存在 barrier 对齐的过程,可以通过 Flink Web UI 的 Checkpoint 选项来查看 Checkpoint 过程中个阶段的耗时情况,从而确定到底是那个阶段导致 Checkpoint 时间过长。

参考

176-Flink优化-资源优化_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-758314.html

到了这里,关于Flink优化——资源优化(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实时Flink的数据库与Kafka集成优化案例

    在现代数据处理系统中,实时数据处理和分析是至关重要的。Apache Flink是一个流处理框架,可以用于实时数据处理和分析。在许多场景下,Flink需要与数据库和Kafka等消息系统进行集成,以实现更高效的数据处理。本文将讨论Flink与数据库和Kafka集成的优化案例,并提供实际示

    2024年02月20日
    浏览(32)
  • 涤生大数据实战:基于Flink+ODPS历史累计计算项目分析与优化(下)

    涤生大数据实战:基于Flink+ODPS历史累计计算项目分析与优化(二) 问题分析 在 ODPS计算期间 或者 odps表同步到hbase表期间,发生了查询,会导致数据错误。出现问题的地方就是这两个时间窗口:ODPS计算期间 和 odps表同步到hbase表期间。那就针对性分析,各个击破。  解决方案

    2024年03月27日
    浏览(38)
  • Flink 资源管理

    在Flink中,资源管理是一个核心组件,它负责分配和管理计算资源,以确保任务能够高效、稳定地运行。以下是关于Flink资源管理的详细解释: 资源管理的目标 : 高效性 :确保任务能够充分利用可用的计算资源,达到最佳的处理性能。 稳定性 :在资源不足或任务失败时,能

    2024年03月14日
    浏览(33)
  • Apache Flink连载(二十八):Flink细粒度资源管理(1)-适用场景和原理

    🏡 个人主页:IT贫道-CSDN博客  🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~  🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

    2024年02月19日
    浏览(27)
  • 小米基于 Flink 的实时计算资源治理实践

    摘要:本文整理自小米高级软件工程师张蛟,在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分: 发展现状与规模 框架层治理实践 平台层治理实践 未来规划与展望 点击查看原文视频 演讲PPT 如上图所示,下层是基础服务,包括:统一元数据服务、统一

    2024年02月13日
    浏览(30)
  • Flink流批一体计算(7):Flink优化

    目录 配置内存 设置并行度 操作场景 具体设置 补充 配置进程参数 操作场景 具体配置 配置netty网络通信 操作场景 具体配置 配置内存 Flink 是依赖内存计算,计算过程中内存不够对 Flink 的执行效率影响很大。可以通过监控 GC ( Garbage Collection ),评估内存使用及剩余情况来判

    2024年02月12日
    浏览(32)
  • flink集群与资源@k8s源码分析-资源III 声明式资源管理

    资源分析分3部分,资源请求,资源提供,声明式资源管理,本文是第三部分 声明式资源管理 检查资源需求/检查资源声明是flink 声明式资源管理 的核心方法 上面的资源场景分为两类, 提出资源需求 和 提供资源 , 检查资源请求/检查资源声明是交汇点,处理资源请求,该分

    2024年02月07日
    浏览(30)
  • flink集群与资源@k8s源码分析-集群

    本文是flink集群与资源@k8s源码分析系列的第二篇-集群 下面详细分析各用例 k8s集群支持session和application模式,job模式将会被废弃,本文分析session模式集群 Configuration作为配置容器,几乎所有的构建需要从配置类获取配置项,这里不显示关联关系 1. 用户命令行执行kubernates-ses

    2024年02月07日
    浏览(33)
  • flink集群与资源@k8s源码分析-运行时

    运行时提供了Flink作业运行过程依赖的基础执行环境,包含Dispatcher、ResourceManager、JobManager和TaskManager等核心组件,本节分析资源相关运行时组件构建和启动。 flink没有使用spring,缺少ioc的构建过程相当复杂,所有依赖手动关联和置入,为了共享组件,flink使用了很多中间持有

    2024年02月07日
    浏览(32)
  • flink优化

    我们在做UV独立访客数的时候,将用户的访问时间保存到了状态中,由于访客比较多,大概有1000万,所以会造成大状态,解决办法:因为我们是统计的一天的独立访客数,所以我们设置状态的TTL为一天,这样就解决了大状态问题。 大状态调优:在我们的项目中,在做新老访客

    2024年02月12日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包