2017-01-15 60 views
3

我對spill to diskshuffle write感到困惑。使用默認的Sort shuffle管理器,我們使用appendOnlyMap來聚合和合並分區記錄,對嗎?然後,當執行內存填滿,我們開始整理地圖,它溢出到磁盤,然後清理映射下一個溢出(如果發生),我的問題是:泄漏到磁盤並​​洗牌寫火花

  • 是什麼盤溢出的區別並隨機寫入?它們主要包括在本地文件系統上創建文件並記錄。

  • 承認是不同的,所以溢出記錄被排序,因爲它們是通過地圖傳遞的,而不是隨機寫入記錄因爲它們沒有從地圖傳遞。

  • 我有這樣的想法,即溢出文件的總大小應該等於Shuffle寫入的大小,也許我錯過了一些東西,請幫助理解該階段。

謝謝。

喬治

回答

6

spill to diskshuffle write是兩回事

spill to disk - 從主機RAM 數據移動到主機磁盤 - 使用時,有你的機器上沒有足夠的內存,並放置的一部分它的內存爲磁盤

http://spark.apache.org/faq.html

我是否需要數據到f它在內存中使用Spark?

號星火的運營商數據溢出到磁盤,如果它不適合在內存中, 允許它在任何大小的數據很好地運行。同樣,不適合內存的高速緩存數據集 要麼溢出到磁盤,要麼根據RDD的存儲級別確定需要時重新計算。

shuffle write - 從執行人(S)到另一個執行器(一個或多個)數據移動 - 用於當數據需要執行器之間移動(例如,由於JOIN,GROUPBY等)

更多的數據可以在這裏找到:

邊緣案例可能有助於清除該問題:

  • 你有10個執行人
  • 與每個執行人100GB RAM
  • 數據大小爲1280MB,並且被劃分爲10個分區
  • 每個執行人擁有128MB的數據。

假設數據持有一個密鑰,執行groupByKey,會將所有數據放入一個分區。 Shuffle size將是9 * 128MB(9個執行人將他們的數據轉移到最後的執行者),而不會有任何spill to disk執行人的RAM和100GB僅數據

的1GB關於AppendOnlyMap

作爲寫入AppendOnlyMap代碼(見上文) - 該功能是 用於 優化的簡單的開哈希表的一個低一級執行追加只使用情況下,當鍵被永遠不會被刪除,但該值 每個鍵可能會改變。

兩個不同的模塊使用相同的低級函數的事實並不意味着這些函數在高級別相關。

+0

但是,如果溢出不會發生,這意味着聚合記錄不會從appendOnlyMap傳遞?這樣他們將被排序? – Giorgio

+0

如果沒有發生溢出到磁盤,這意味着執行程序可以將整個數據保存在RAM中(請參閱我的答案中的邊界案例) – Yaron

+0

因此appendOnlyMap只用於溢出?溢出的文件包含稍後要洗牌的記錄,或者僅僅是用於不能保留在RAM中的細化的對象?我仍然認爲這是相關的,因爲我認爲每條記錄都必須從appendOnlyMap傳遞出來,請澄清一下,謝謝 – Giorgio