开发者社区> 问答> 正文

flink 1.10内存合跑standalone cluster吗?

   我有个测试的单机的standalone flink,平时跑几个测试job,tm内存设置了8g。最近升级了flink1.10,只设置了taskmanager.memory.flink.size为10g。但是启了一个数据量最大的job后,就无法再启动第二个job了,报内存不够:java.lang.OutOfMemoryError: Direct buffer memory。这是1个job就基本把所有的Direct Memory占完了吗?如果是这样的话,flink1.10还适合跑standalone cluster吗?slot没有隔离这个内存吗? 在官网讲解slot的地方有这么一句话:A TaskManager with three slots, for example, will dedicate 1/3 of its managed memory to each slot. 这里的its managed memory指的是taskmanager.memory.managed.size产生指定的内存吗?*来自志愿者整理的FLINK邮件归档

展开
收起
又出bug了-- 2021-12-03 17:30:49 453 0
1 条回答
写回答
取消 提交回答
  • Flink 1.10 对不同的内存类型进行了更精细的控制,明确了总内存中每种类型、用途的内存的大小。举个例子,如果简单考虑 TM 中有 heap, direct, native 三种内存类型,总内存大小是 300mb。在之前的版本中,可能是 heap 固定占用100mb,剩下 direct 和 native 共用 200mb。理论上,direct/native 可以分别占用 200/0, 100/100, 0/200,只要总大小不超过 200 即可。但是一旦出现超用,我们很难判断是 direct 还是 native 内存造成的。在 Flink 1.10 里,对 direct/native 分别用多少也做了明确的划分,这样一旦出现内存不足,就能够知道是哪部分造成的。上述描述是对内存模型做了简化,实际 Flink 考虑的内存类型不只三种,具体可以参考相关文档[1]。

    针对你的问题,是 direct 内存不足造成的,在不改变总内存大小的情况下,可以调大 ‘taskmanager.memory.task.off-heap.size’ ,详见[2]。

    关于隔离,Flink 中一个 TM 上的多个 slot 是跑在同一个进程中的,由于 JVM 自身的特点,进程内不同线程的内存是没有隔离的。Flink 仅对托管内存(managed memory)[3] 进行了隔离,这部分内存是由 Flink 负责管理申请、分配、释放的,不依赖于 JVM 的垃圾回收机制。托管内存目前仅用于 RocksDBStateBackend 和部分 Batch 算子,与你现在遇到的 direct oom 的问题无关。

    [1] https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_detail.html [2] https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory [3] https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98*来自志愿者整理的FLINK邮件归档

    2021-12-03 18:36:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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