广播加入超过阈值,返回内存错误

解决一个Apache火花OutOfMemorySparkException错误发生在使用BroadcastHashJoin超过BroadcastJoinThreshold表。

写的sandeep.chandran

去年发表在:2022年5月23日

问题

你正试图加入两个大表,将所选列从第一个表和第二个表的所有列。

尽管总大小超过设定的限制spark.sql.autoBroadcastJoinThreshold,BroadcastHashJoin使用和Apache返回一个火花OutOfMemorySparkException错误。

org.apache.spark.sql.execution。OutOfMemorySparkException: Size of broadcasted table far exceeds estimates and exceeds limit of spark.driver.maxResultSize=1073741824. You can disable broadcasts for this query using set spark.sql.autoBroadcastJoinThreshold=-1

导致

这是由于火花的规模估计量的限制。

如果估计的大小DataFrames小于之一autoBroadcastJoinThreshold,火花可能使用BroadcastHashJoin执行连接。如果没有足够的可用节点资源适应广播DataFrame、你的工作失败由于内存错误。

解决方案

有三种不同的方法来缓解这个问题。

  • 使用分析表(AWS|Azure)收集细节和计算统计数据对DataFrames之前加入。
  • 缓存表(AWS|Azure)你是广播。
    1. 运行解释在你加入命令返回的物理方案。
      % sql解释(<加入命令>)
    2. 检查身体的计划。如果广播加入回报BuildLeft缓存表左侧。如果广播加入回报BuildRight缓存表右侧。
  • 在砖运行时的7.0及以上,设置连接类型SortMergeJoin启用了连接提示。
这篇文章有用吗?