为什么Spark作业在使用org.apache.spark.shuffle.MetadataFetchFailedException时失败:在猜测模式下丢失shuffle 0的输出位置?

我在推测模式下运行Spark工作。 我有大约500个任务和大约500个1 GB gz的文件压缩。 我一直在进行每项工作,1-2个任务,以及之后重复执行几十次的附加错误(阻止工作完成)。

org.apache.spark.shuffle.MetadataFetchFailedException:缺lessshuffle的输出位置0

任何想法是什么问题的意义,以及如何克服它?

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0 at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$1.apply(MapOutputTracker.scala:384) at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$1.apply(MapOutputTracker.scala:381) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108) at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108) at org.apache.spark.MapOutputTracker$.org$apache$spark$MapOutputTracker$$convertMapStatuses(MapOutputTracker.scala:380) at org.apache.spark.MapOutputTracker.getServerStatuses(MapOutputTracker.scala:176) at org.apache.spark.shuffle.hash.BlockStoreShuffleFetcher$.fetch(BlockStoreShuffleFetcher.scala:42) at org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:40) at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:92) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) at org.apache.spark.rdd.FlatMappedRDD.compute(FlatMappedRDD.scala:33) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) at org.apache.spark.rdd.MappedRDD.compute(MappedRDD.scala:31) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61) at org.apache.spark.scheduler.Task.run(Task.scala:56) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:196) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) 

当我给工作者节点提供了更多的内存时,这发生在我身上。 由于没有交换,因此在尝试存储洗牌对象时没有更多的内存,spark会崩溃。

解决scheme是添加交换,或者configuration工作者/执行者使用更less的内存,另外使用MEMORY_AND_DISK存储级别执行多个持久化。

我们与Spark有类似的错误,但是我不确定它与您的问题有关。

我们在100GB的数据上使用了JavaPairRDD.repartitionAndSortWithinPartitions ,并且保持与你的应用类似的失败。 然后我们查看了特定节点上的Yarn日志,发现我们有某种内存不足的问题,所以Yarn中断了执行。 我们的解决scheme是在.../spark/conf/spark-defaults.conf更改/添加spark.shuffle.memoryFraction 0 。 这使我们能够以这种方式处理更大的(但不幸的是不是无限的)数据量。

我在我的3机YARN群集上遇到同样的问题。 我一直在改变内存,但问题依然存在。 最后,我在日志中看到以下消息:

 17/02/20 13:11:02 WARN spark.HeartbeatReceiver: Removing executor 2 with no recent heartbeats: 1006275 ms exceeds timeout 1000000 ms 17/02/20 13:11:02 ERROR cluster.YarnScheduler: Lost executor 2 on 1worker.com: Executor heartbeat timed out after 1006275 ms 

在此之后,有这样的信息:

 org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 67 

我修改了spark-defaults.conf中的属性,如下所示:

 spark.yarn.scheduler.heartbeat.interval-ms 7200000 spark.executor.heartbeatInterval 7200000 spark.network.timeout 7200000 

而已! 此后我的工作顺利完成。

在我的情况下(独立群集)抛出exception,因为一些Spark从属的文件系统被填满了100%。 删除从属的spark/work文件夹中的所有内容解决了这个问题。

这个问题是关于内存 。 你传递的是不可用的内存。 在spark提交命令中有3个关于内存和执行的参数。 这些参数是

 --driver-memory 1200M --driver-cores 1 --num-executors 1 

给驱动程序内存最大n/2n =节点的总内存)。

给驱动程序核心n/1000n =驱动程序内存(以MB为单位))

给num-executors nn =你有的节点数)

如果在spark提交命令中没有给出正确的参数,那么响应会很慢,否则会导致exception。