問(wèn):
如果我的中間輸出RDD 數(shù)據(jù)大小是2G誉己,但只有1G 的空閑內(nèi)存眉尸,此時(shí)會(huì)怎么樣?
答:
這個(gè)問(wèn)題其實(shí)問(wèn)的 RDD 緩存機(jī)制。我們可以調(diào)用 persist()
或 cache()
方法來(lái)緩存 RDD噪猾。Spark 的緩存是具有容錯(cuò)性的霉祸,如果 RDD 的任意 partition 丟失,將會(huì)自動(dòng)重算袱蜡。
依據(jù)你設(shè)置的 RDD 緩存的 Storage level 的不同丝蹭,產(chǎn)生的行為也是不同的,如下:
- MEMORY_ONLY: 調(diào)用 cache 和 persist 的默認(rèn)值坪蚁,會(huì)盡量多的將你的中間輸出 RDD 的 partitions 放到內(nèi)存奔穿,其余放不下的 partition 會(huì)在使用到的時(shí)候進(jìn)行重算
- MEMORY_AND_DISK: 會(huì)盡量多的將你的中間輸出 RDD 的 partitions 放到內(nèi)存,其余放不下的 partition 會(huì)放到磁盤(pán)
- DISK_ONLY: 將所有 partitions 放到磁盤(pán)
還有一些 Storage level 無(wú)非是序列化或放兩份敏晤,就不一一展開(kāi)了贱田。至于緩存 RDD 時(shí)需要用哪種 storage level,需要視具體情況而定嘴脾,有些情況下重算比從磁盤(pán)加載還快男摧;有些情況下,為了節(jié)省空間可能需要序列化等等
更多不容錯(cuò)過(guò)的 Spark Q&A: Spark Q&A 目錄