標籤:

較新版本的spark中,那些shuffle數據塊如何緩存?

請問目前在較新版本的spark中,當需要shuffle時,那些shuffle數據塊是只能存儲在磁碟中呢,還是可以利用tachyon內存文件系統來傳輸呢?


在目前的 Spark 實現中,shuffle block 一定是落地到磁碟的,無法像普通 RDD 那樣 cache 到本地內存或 Tachyon 中。想將 shuffle block cache 到內存中,應該主要是為了提速,但事實上並沒有什麼必要。

首先,內存 cache 發揮作用的前提是被 cache 的數據會被反覆使用。使用越頻繁,相對來說收益越高。而 shuffle block 只有在下游 task 失敗,進行容錯恢復時才有重用機會,頻次很低。值得注意的是,在不 cache 的情況下,針對同一個含 shuffle 的 RDD 執行多個 action,並不會重用 shuffle 結果。Shuffle block 是按 job ID + task ID + attempt ID 標識的,每個 action 都對應於一個獨立的 job,因此無法重用。這裡或許是 Spark 的一個可改進點。

其次,從數據量上說,如果執行的是需要 shuffle 大數據量的 Spark job,內存容量不夠,無論如何都需要落盤;如果執行的是小數據量的 Spark job,雖然 shuffle block 會落盤,但仍然還在 OS cache 內,而 shuffle block 一般都是在生成之後短時間內即被下游 task 取走,所以大部分情況下仍然還是內存訪問。

最後,將 shuffle block cache 在內存中的確有一個潛在好處,就是有機會直接在內存中保存原始的 Java 對象而避免序列化開銷。但這個問題在新近的 Spark 版本中也有了比較好的解決方案。Tungsten project 中引入的 UnsafeRow 格式統一了內存和磁碟表示,已經最小化了序列化成本。


推薦閱讀:

怎樣理解spark中的partition和block的關係?
什麼是 Spark?
還有必要學習Hadoop 么?
Apache Spark 中的 RangePartitioner 是如何實現數據採樣的?
矽谷之路54:深入淺出Spark(七)如何排序100TB

TAG:Spark |