我试图在我们的测试集群上运行Flink上的Apache Beam管道。在通过序列化对对象进行编码期间,EOFException
在org.apache.flink.runtime.io.disk.SimpleCollectingOutputView:79
失败了。我还没有能够在本地重现错误。你可以找到the entire job log here。一些值已被假数据替换。
用于运行管道的命令:
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行为(不应该溢出到磁盘?)。看起来不像是可以扩展的解决方案。
答案 0 :(得分:1)
抛出EOFException
因为Flink内存不足。 Flink希望EOFException
作为通知开始将数据写入磁盘。
这个问题是由于梁SerializableCoder
将EOFException
包裹在CoderException
中引起的。因此,Flink没有捕获预期的EOFException
并且失败。
问题可以通过使用自定义编码器来解决,该编码器不会包裹EOFException
但会转发它。