开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

Flink这个合并过程不是自动进行的吗?

Caused by: org.apache.flink.util.SerializedThrowable: While open a file for random read: /mnt/hadoop/yarn/local/usercache/tomx/appcache/application_1665995808929_366429/flink-io-62d0d9c8-de12-4678-bf64-fa0446105214/job_a79d0fdbbe7d3adf6601b9d1df871a3b_op_EvictingWindowOperator_3d40dac218b144ba619d5f915bddce501_1uuid_3a975d99-78dc-478b-ab40-4a3be2a76afe/db/101082.sst: Too many open files
各位大佬,我在用rocksdb作为状态后端的时候,遇到了这个问题,似乎是sst文件的数量一直在增长,Flink这个合并过程不是自动进行的吗?

展开
收起
真的很搞笑 2024-03-19 12:17:35 31 0
2 条回答
写回答
取消 提交回答
  • 操作系统的open files 太小了吧,改下句柄数 ,此回答整理自钉群“【②群】Apache Flink China社区”

    2024-03-19 20:26:42
    赞同 展开评论 打赏
  • 将军百战死,壮士十年归!

    在 Apache Flink 中,当 RocksDB 被用作状态后端时,RocksDB 内部确实有一个后台合并(compaction)流程,它是自动进行的。RocksDB 通过 compaction 过程来管理其 SST 文件(Sorted String Table),包括合并小文件、删除过期或已覆盖的键值对以及释放空间。这个过程有助于优化存储效率和查询性能。

    然而,您遇到的问题表明由于某种原因,RocksDB 在尝试打开更多文件时达到了操作系统允许的最大打开文件数限制。这可能是由于以下几个原因:

    1. 打开文件句柄限制:操作系统对单个进程可同时打开的文件数量有限制。在 Linux 系统中,可以通过 ulimit -n 命令查看和修改此限制。对于高并发或大量状态存储的应用场景,可能需要增加这个限制。

    2. Compaction 不及时或配置不当:如果 RocksDB 的 compaction 配置不合适(例如,阈值设置得过高),可能导致 SST 文件累积过多而未能及时合并。检查并调整 RocksDB 的 compaction 参数可以帮助解决此类问题。

    3. 状态增长过快:如果您的应用状态增长速度非常快,以至于 compaction 过程无法跟上新产生的 SST 文件的速度,也可能导致文件数量激增。

    4. 资源限制:Flink 或 RocksDB 在运行过程中可能受限于 YARN 等资源管理系统分配的资源,如果磁盘 I/O 或 CPU 资源不足,可能影响 compaction 的效率。

    要解决这个问题,您可以考虑以下措施:

    • 调整操作系统级别的最大打开文件数限制。
    • 调整 RocksDB 的 compaction 参数,使之更适应您的应用场景。
    • 监控并优化 Flink 应用的状态存储量和增长率,避免状态无限制膨胀。
    • 如果在 YARN 等集群环境中运行,确保给 Flink 任务分配足够的资源,特别是磁盘空间和 CPU。同时,也可以针对 RocksDB 设置合理的内存缓冲区大小以提高写入性能和 compaction 效率。
    2024-03-19 13:52:02
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载