2016-07-27 85 views
1

我有一個計劃採取產生,並會運行類似數據幀排序依據Spark中

Select Col1, Col2... 
    orderBy(ColX) limit(N) 

但是一個數據幀,當我收集結束的數據,我覺得這是造成驅動程序到OOM,如果我拿足夠大的頂部N

另一種觀察是,如果我只是做排序和頂部,這個問題不會發生。所以這種情況只有在排序和排名同時出現時纔會發生。

我想知道爲什麼會發生?特別是,這兩種轉換組合下面真正發生了什麼? Spark如何通過排序和限制來評估查詢,以及下面的相應執行計劃是什麼?

也只是好奇的火花處理排序和DataFrame和RDD之間的頂部不同?

編輯, 對不起,我不是故意的收集, 我原來只是意味着,當我打電話的任何行動兌現的數據,不管它是否被收集(或任何動作將數據發送回驅動程序)或不(所以,問題絕對不是在輸出尺寸)

+0

我建議你在你的問題中添加代碼。對於OOM錯誤通常是驅動程序方面。但沒有真正的代碼很難說。 –

回答

1

雖然目前尚不清楚爲什麼這種失敗,在這個特殊的情況下,有多個問題,你可能會遇到:

  • 當您使用limit它只是把所有數據在一個分區上,無論多大的n是。所以雖然沒有明確地收集它幾乎一樣糟糕。
  • 最重要的是,orderBy需要一個完整的隨機範圍劃分,當數據分佈偏斜時會導致不同的問題。
  • 最後,當collect結果可能大於驅動程序上可用的內存量時。

如果你collect無論如何你沒有太多可以改善的地方。在一天結束時驅動程序的內存將是一個限制因素,但仍有一些可能的改進:

  • 首先不要使用limit
  • collect替換爲toLocalIterator
  • 兼用orderBy |>rdd |>zipWithIndex |>filter或者如果值的精確的數字不是硬性要求filter數據直接基於近似的分佈,如圖中Saving a spark dataframe in multiple parts without repartitioning(火花2.0.0+有方便的方法approxQuantile) 。