EOFException 与 Flink 上 Beam 流水线运行期间的内存段相关



我正在尝试在我们的测试集群上运行 Flink 上的 Apache Beam 管道。在通过序列化对对象进行编码期间,它在org.apache.flink.runtime.io.disk.SimpleCollectingOutputView:79EOFException失败。我还没有能够在本地重现错误。您可以在此处找到完整的作业日志。某些值已替换为假数据。

用于运行管道的命令:

bin/flink run 
-m yarn-cluster                                         
--yarncontainer                 1                       
--yarnslots                     4                       
--yarnjobManagerMemory          2000                    
--yarntaskManagerMemory         2000                    
--yarnname "EBI"        
pipeline.jar               
--runner=FlinkRunner 
--zookeeperQuorum=hdp-master-001.fake.org:2181

虽然我认为它不相关,但要序列化的对象是可序列化的,并且同时具有隐式和显式编码器,但这不会影响这种情况。

可能导致这种情况的原因是什么,我该怎么做才能解决?


目前,将管理器的堆内存增加到 4 到 8GiB 之间似乎可以防止异常。仍然不确定这是否应该是正常的 Flink 行为(它不应该溢出到磁盘吗?似乎不是一个可扩展的解决方案。

抛出EOFException是因为 Flink 内存缓冲区不足。Flink 期望EOFException作为开始将数据写入磁盘的通知。

此问题是由 Beam 的SerializableCoderEOFException包裹在CoderException中引起的。因此,Flink 无法捕获预期的EOFException并失败。

这个问题可以通过使用自定义编码器来解决,该编码器不包装EOFException而是转发它。

相关内容

  • 没有找到相关文章

最新更新