廣播連接超過閾值,返回內存不足錯誤

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

寫的sandeep.chandran

最後發布日期:2022年5月23日

問題

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

盡管總大小超過了所設置的限製spark.sql.autoBroadcastJoinThresholdBroadcastHashJoin, Apache Spark返回一個OutOfMemorySparkException錯誤。

org.apache.spark.sql. execute . outofmemorysparkexception: Size of broadcast table far exceeds estimated and exceeds limit of spark.driver.maxResultSize=1073741824。您可以使用set spark.sql.autoBroadcastJoinThreshold=-1來禁用此查詢的廣播

導致

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

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

解決方案

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

  • 使用分析表AWS|Azure),以便在嚐試連接之前收集有關dataframe的詳細信息和計算統計信息。
  • 緩存表(AWS|Azure)你在廣播。
    1. 運行解釋在join命令上返回物理計劃。
      %sql explain()
    2. 回顧實際計劃。如果廣播連接返回BuildLeft,緩存左邊的表。如果廣播連接返回BuildRight,緩存右邊的表。
  • 在Databricks Runtime 7.0及以上版本中,將連接類型設置為SortMergeJoin啟用連接提示。