廣播加入超過閾值,返回內存錯誤

解決一個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啟用了連接提示。