Spark执行程序在内存不足后挂起



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

在将数据加载到RDD时,我发现有时当有大量数据(700 Gb)时,Spark会耗尽内存,但它不会使应用程序失败。而是应用程序挂起。我不确定为什么会发生这种情况,但这是我的理论:-

  1. 我们使用的数据帧可能是缓存的东西。
  2. spark标志spark. dynamicallocation . cachedexecutoridletimeout设置为无穷大

我的理论是,它可能是缓存的东西,而创建数据框架,但缓存从来没有放弃,这导致Spark挂起。

有两个解

  1. 增加集群大小(最坏的情况)
  2. 想办法在Spark应用程序中添加超时
  3. 以编程方式终止EMR步骤(找不到这样做的API)

关于怎么做有什么建议吗?

还有两种可能。要么分区太大,要么有严重的偏度(分区的大小变化很大)。

尝试使用重分区来增加分区的数量(从而减小分区的大小)。这将在执行器中随机重新洗牌数据(有利于减少偏度,但速度较慢)。理想情况下,我希望我的分区大小在64Mo左右,这取决于您的机器。

最新更新