我正在EC2群集上部署Spark数据处理作业,该作业对于群集来说很小(16核,总共120G RAM),最大的RDD只有76k+行,但中间严重倾斜(因此需要重新分区)并且在序列化之后每行具有大约100k的数据。该作业总是在重新分区时卡住。即,作业将不断收到以下错误并重试:
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle
org.apache.spark.shuffle.FetchFailedException: Error in opening FileSegmentManagedBuffer
org.apache.spark.shuffle.FetchFailedException: java.io.FileNotFoundException: /tmp/spark-...
我已经尝试找出问题所在,但似乎抛出这些错误的机器的内存和磁盘消耗都低于50%。我还尝试了不同的配置,包括:
let driver/executor memory use 60% of total memory.
let netty to priortize JVM shuffling buffer.
increase shuffling streaming buffer to 128m.
use KryoSerializer and max out all buffers
increase shuffling memoryFraction to 0.4
但是它们都不起作用。小作业总是触发相同的一系列错误和最大重试次数(最多1000次)。在这种情况下如何解决这个问题?
如果你有线索的话,谢谢你。
3条答案
按热度按时间9udxz4iz1#
如果出现类似的错误,请检查日志。
每次你得到这个错误都是因为你失去了一个遗嘱执行人。至于为什么你失去了一个遗嘱执行人,那是另一回事,再次检查你的日志寻找线索。
有一件事Yarn可以杀死你的工作,如果它认为看到你是使用"太多的内存"
检查以下内容:
另请参阅:http://apache-spark-developers-list.1001551.n3.nabble.com/Lost-executor-on-YARN-ALS-iterations-td7916.html
当前的技术水平是增加Spark. Yarn. Executor. MemoryOverhead,直到作业停止失败。我们确实有计划尝试根据所请求的内存量自动调整此值,但这仍然只是一种启发式方法。
fdbelqdn2#
我还收到了错误
我进一步查看日志发现
在搜索退出代码后,我意识到这主要与内存分配有关。于是我检查了为执行器配置的内存量。我发现错误地为驱动程序配置了7g,而为执行器只配置了1g。在增加执行器内存后,我的spark作业成功运行。
o2rvlv0m3#
似乎我做了changeQueue操作后使用可能会导致这个问题,服务器已经改变后,我改变了队列。