2017-03-07 80 views
2

我在獨立模式下運行Spark 2.0,並且我是唯一一個在羣集中提交作業的人。Spark如何驅逐緩存分區?

假設我有一個帶有100個分區的RDD,並且總共只有10個分區適合內存。

我們還假設分配的執行內存是足夠的並且不會干涉存儲內存。

假設我迭代該RDD中的數據。

rdd.persist() // MEMORY_ONLY 

for (_ <- 0 until 10) { 
    rdd.map(...).reduce(...) 
} 

rdd.unpersist() 

對於每次迭代,持續存在的前10個分區總是在內存中,直到rdd.unpersist()

回答

0

我想我找到了答案,所以我要回答我自己的問題。

驅逐政策似乎在MemoryStore類。這是source code

似乎條目不會被驅逐到相同RDD中的條目。

2

現在我知道Spark正在使用LRU(最近使用較少)逐出策略作爲默認RDD分區。他們正在努力增加新的策略。 https://issues.apache.org/jira/browse/SPARK-14289

該策略刪除最近使用較少的元素當元素放入緩存或從緩存中檢索元素時,上次使用的時間戳更新。

我想你會在你的記憶中總是有10個分區,但哪些存儲在內存中,哪些會被驅逐取決於他們的使用。根據Apache的FAQ:

同樣,不適合在內存中緩存數據集或者在需要時濺出 到磁盤或重新計算上的蒼蠅,由 RDD的存儲水平確定。

因此,如果其他分區溢出到磁盤或在運行中重新計算,它取決於您的配置。重新計算是默認設置,並不總是最有效的選項。您可以將數據集的存儲級別設置爲MEMORY_AND_DISK以避免這種情況。

+0

謝謝。根據我的理解和您所包含的JIRA鏈接,LRU主要涉及不同的RDD被緩存。在這裏,我想知道單個RDD的數據分區不能完全包含在內存中的情況。 – Russell

+0

根據我的理解,如果您有單個RDD或多個RDD,則相同的技術適用於這些方面。 –

+0

JIRA鏈接中的評論困擾了我。 「默認的RDD驅逐策略是LRU(具有不會替換屬於相同RDD的另一個塊(如當前創建分區)的附加規則)」。我多挖了一點,我相信分區不會被驅逐到相同RDD中的其他分區。感謝指針! – Russell