2017-05-13 57 views
1

我無法在任何地方發現RDD內部如何執行重新分配?我知道你可以在RDD上調用重新分區方法來增加分區的數量,但是如何在內部執行它?Spark內部 - 重新分區是否加載內存中的所有分區?

假設,最初有5個分區並且他們有 -

  • 第一分區 - 100個元件
  • 第二分區 - 200個元件
  • 第三分區 - 500個元件
  • 第四分區 - 5000個元素
  • 第5個分區--200個元素

部分分區傾斜,因爲它們是從HBase加載的,並且HBase中的數據未正確醃製,導致某些區域服務器的條目太多。

在這種情況下,當我們重新分區到10時,它會先加載所有分區,然後再進行混洗來創建10分區?如果完整的數據不能被加載到內存中,即所有分區不能一次加載到內存中呢?如果Spark不將所有分區加載到內存中,那麼它如何知道計數以及它如何確保將數據正確分區爲10個分區。

回答

1

從我所瞭解的,repartition肯定會觸發shuffle。從Job Logical Plan文檔以下可以說有關repartition

- for each partition, every record is assigned a key which is an increasing number. 
    - hash(key) leads to a uniform records distribution on all different partitions. 

如果Spark不能所有的數據加載到memory然後memory issue將被拋出。因此,Spark的默認處理全部在memory中完成,即,應該總是有足夠的存儲器用於您的數據
Persist選項可以用來告訴sparkspilldisk你的數據,如果沒有足夠的內存。
Jacek Laskowski也解釋了重新分區。
Understanding your Apache Spark Application Through Visualization應足以讓你測試,並通過自己知道。