廣播連接超過閾值,返回內存溢出錯誤

解決當使用broadcastashjoin的表超過BroadcastJoinThreshold時發生的Apache Spark OutOfMemorySparkException錯誤。

寫的sandeep.chandran

最後發布時間:2022年5月23日

問題

您正在嚐試連接兩個大表,投影第一個表中的選定列和第二個表中的所有列。

盡管總尺寸超過了spark.sql.autoBroadcastJoinThresholdBroadcastHashJoin, Apache Spark返回OutOfMemorySparkException錯誤。

org.apache.spark.sql. execute . outofmemorysparkexception:廣播表的大小遠遠超過估計,超過spark.driver.maxResultSize=1073741824的限製。您可以使用set spark.sql.autoBroadcastJoinThreshold=-1來禁用此查詢的廣播

導致

這是由於Spark的大小估計器的限製。

如果其中一個數據幀的估計大小小於autoBroadcastJoinThreshold, Spark可使用BroadcastHashJoin執行連接。如果可用節點沒有足夠的資源來容納廣播DataFrame,則作業將由於內存不足錯誤而失敗。

解決方案

有三種不同的方法可以緩解這個問題。

  • 使用分析表AWS|Azure)以收集有關數據幀的詳細資料及計算統計數字。
  • 緩存表(AWS|Azure)你在廣播。
    1. 運行解釋,以返回物理計劃。
      %sql explain()
    2. 回顧物理計劃。如果廣播連接返回BuildLeft,緩存左邊的表。如果廣播連接返回BuildRight,緩存右側表。
  • 在Databricks Runtime 7.0及以上版本中,將連接類型設置為SortMergeJoin啟用連接提示。