内存不足后Spark Executors挂起

时间:2016-09-08 18:05:03

标签: hadoop apache-spark

我在EMR上运行了一个spark应用程序(16个节点,1个主节点,15个核心,r3.2xlarge实例)。对于spark执行器配置,我们使用动态分配。

在将数据加载到RDD时,我发现有时当存在大量数据(700 Gb)时,Spark会运行Out of Memory,但它不会使App失败。而应用程序坐在那里挂了。我不确定为什么会这样,但这是我的理论: -

  1. 我们使用可能缓存内容的数据框。
  2. spark flag spark.dynamicAllocation.cachedExecutorIdleTimeout设置为无穷大
  3. 我的理论是它可能在创建数据帧时缓存内容,但缓存永远不会被放弃,这会导致Spark挂起。

    有两种解决方案

    1. 增加群集大小(更糟糕的情况)
    2. 找出一种向Spark app添加超时的方法。
    3. 以编程方式终止EMR步骤(找不到执行此操作的API)
    4. 关于如何去做的任何线索?

1 个答案:

答案 0 :(得分:0)

可能还有另外两种可能性。分区太大,或者您有严重的偏斜(分区大小变化很大)。

尝试使用重新分区来增加分区数量(因此减小其大小)。这将随机重新整理执行程序中的数据(很好地减少偏差,但速度很慢)。理想情况下,我喜欢我的分区大约64Mo,具体取决于你的机器。