【问题标题】:spark shuffle memory error: failed to allocate direct memoryspark shuffle memory 错误:无法分配直接内存
【发布时间】:2020-03-24 07:18:06
【问题描述】:

在 spark 数据帧 (4x) 上执行几个连接时,出现以下错误:

org.apache.spark.shuffle.FetchFailedException: failed to allocate 16777216 byte(s) of direct memory (used: 4294967296, max: 4294967296)

即使在设置时:

--conf "spark.executor.extraJavaOptions-XX:MaxDirectMemorySize=4G" \

没有解决。

【问题讨论】:

  • 我观察到的是:它在第二次加入时已经失败。我可以将第一个和第二个连接移动为广播连接。它工作得很好。对于第三和第四个 - 我仍然需要找到解决方案
  • 将每个步骤写入磁盘(连接后的每个中间结果)时,它工作得很好。但这似乎是一个相当老套的解决方案,会产生额外的 IO
  • 我也尝试广播第 3 次和第 4 次加入。在缓存的内存中,它的大小约为 11G。不幸的是,不知何故,我找不到合适的广播它。所以现在我需要求助于写入磁盘。然而,事实证明,这也不是在所有情况下都可靠。

标签: apache-spark apache-spark-sql jvm directmemory


【解决方案1】:

似乎飞行中的方块太多了。尝试使用较小的 spark.reducer.maxBlocksInFlightPerAddress 值。参考看看这个JIRA

引用文字:

对于启用了外部随机播放的配置,我们观察到,如果一个非常大的不。块从远程主机获取,这会使 NM 承受额外的压力并可能使其崩溃。此更改引入了配置 spark.reducer.maxBlocksInFlightPerAddress ,以限制数量。从给定的远程地址获取地图输出的数量。此处应用的更改适用于两种情况 - 启用和禁用外部随机播放时。

【讨论】:

  • 非常有趣。但即使设置 `--conf spark.shuffle.service=true \` 错误仍然存​​在。
  • 你使用的是什么版本的 spark?
  • 2.3.2 (HDP 3.1)
  • spark.reducer.maxBlocksInFlightPerAddress 设置为?
  • 我现在可以确认,这确实解决了我的问题!现在原始连接工作正常,没有任何异常,没有实现中间步骤!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2017-12-07
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多