Java Flink IOException:网络缓冲区数量不足

Java Flink IOException:网络缓冲区数量不足,java,apache-flink,Java,Apache Flink,我使用的是flinkv1.4.0。我使用的是数据集API(尽管如此,我认为这并不重要) 我正在12核虚拟机上运行一些重载转换。我在一个Flink作业中使用了两个内核,其中我将一些数据存储到Flink可查询状态,并使用剩余的10个内核运行另一个Flink作业 当我使用10个内核运行第二个作业时,我似乎遇到以下错误: java.io.IOException: Insufficient number of network buffers: required 10, but only 9 availab

我使用的是
flinkv1.4.0
。我使用的是
数据集API
(尽管如此,我认为这并不重要)

我正在12核虚拟机上运行一些重载转换。我在一个
Flink作业
中使用了两个内核,其中我将一些数据存储到
Flink可查询状态
,并使用剩余的10个内核运行另一个
Flink
作业

当我使用10个内核运行第二个作业时,我似乎遇到以下错误:

java.io.IOException: Insufficient number of network buffers: required 10, but only 9 available. The total number of network buffers is currently set to 4096 of 32768 bytes each. You can increase this number by setting the configuration keys 'taskmanager.network.memory.fraction', 'taskmanager.network.memory.min', and 'taskmanager.network.memory.max'.
            at org.apache.flink.runtime.io.network.buffer.NetworkBufferPool.createBufferPool(NetworkBufferPool.java:257)
            at org.apache.flink.runtime.io.network.NetworkEnvironment.registerTask(NetworkEnvironment.java:199)
            at org.apache.flink.runtime.taskmanager.Task.run(Task.java:618)
            at java.lang.Thread.run(Thread.java:745)

如果我用8个内核运行它,它就可以正常运行。这是什么原因造成的?为什么我不能使用其他2-->8+2=10内核?

引用Apache Flink常见问题解答:

如果以非常高的并行度运行Flink,则可能需要增加网络缓冲区的数量

默认情况下,Flink为网络缓冲区占用JVM堆大小的10%,最小值为64MB,最大值为1GB。您可以通过taskmanager.network.memory.fraction、taskmanager.network.memory.min和taskmanager.network.memory.max调整所有这些值

有关详细信息,请参阅配置参考

有一个问题

总之,通过设置
taskmanager.network.numberOfBuffers
参数,可以在
/conf/flink-conf.yaml
文件中配置网络缓冲区的数量

该参数应设置为
#slots per TM^2*#TMs*4
,其中
#slots per TM
是每个TaskManager的插槽数,
#TMs
是任务管理器的总数

例如,为了支持由20台8插槽机器组成的集群,您应该使用大约5000个网络缓冲区以获得最佳吞吐量。默认情况下,每个网络缓冲区的大小为32 KB。在上面的示例中,系统将因此为网络缓冲区分配大约300兆字节


有关详细信息,请参阅文档。

我已经解决了这个问题,但当我从IntelliJ运行Flink时,问题仍然存在。实际上,我得到了一个非常类似的配置键,不过这一个指的是配置键“taskmanager.network.memory.fraction”、“taskmanager.network.memory.min”和“taskmanager.network.memory.max”。一般来说,有没有办法从IntelliJ或通过Flink执行环境将此参数传递给Flink?您给出的公式最多只能是一个粗略的估计。它根本不考虑处理图的大小。