矽谷之路 48: 深入淺出Spark(五)數據怎麼存
我們知道Spark優先使用內存存儲RDD,那麼設置多大內存空間比較合適呢?比較推薦的是使用75%內存,但是內存大小受到數據存儲方式和序列化方式的影響。
一般存儲數據有兩種方法,一種是把數據存儲為語言可以理解的方式,比如Java的object,這種方式佔用的空間大,但是讀取速度快;另一種是序列化之後存儲為二進位,這種方法佔用的空間小,但是使用的時候需要進行反序列化,速度慢。
t當我們緩存一個RDD時,默認是緩存在內存里,而且沒有序列化,這樣使用起來速度很快。如果內存不夠用了,可以考慮將數據序列化,這樣比較節省空間,但是犧牲了時間。
如果還是不夠就只能放一些到硬碟里。
由於數據是有可能丟失的,所以有時數據需要保存多份,Spark里也可以指定保存副本的數目。
如果JVM掛了裡面的RDD都會丟失,所以可以考慮存在外部Tachyon里。這樣做的另一個好處是Tachyon是跨平台的,你的數據可以存在不同的地方,由Tachyon提供統一介面訪問,非常方便。
下表是Spark支持的多種組合方式:
我們使用Spark就是希望它運行速度快,回顧一下之前講過的程序運行時間和計算時間、數據移動時間、任務調度時間成正比,和程序並行度成反比。所以追求速度的話還是盡量將數據寫在內存里,不夠就序列化,盡量減少硬碟的讀寫。而且儘管數據會丟失,但是很多時候其實重新計算比保存很多副本效率更高。
t如果我們有8GB內存,Spark是如何分配的呢?一般來說有60%給了緩存,20%用來shuffle,還有20%是用戶程序使用,但是這個比例可以根據需要進行調整。
本文整理作者:Mengying Tian,查看完整視頻:http://www.bittiger.io/classes
更多內容,請訪問:BitTiger.io, 掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」
推薦閱讀:
※Spark從1.4.x升級到1.6的喜人效果
※矽谷之路57:深入淺出Spark(八)如何處理實時數據
※深入淺出Spark(三)什麼是Standalone
※[譯]打造大數據產品:Shiny的Spark之旅
※矽谷之路54:深入淺出Spark(七)如何排序100TB
TAG:Spark |