1.使用序列化的持久化級別
除了對多次使用的RDD進行持久化操作之外桐臊,還可以進一步優(yōu)化其性能。因為很有可能伤提,RDD的數(shù)據(jù)是持久化到內(nèi)存认烁,或者磁盤中的。那么舶沛,此時稽穆,如果內(nèi)存大小不是特別充足,完全可以使用序列化的持久化級別柱彻,比如MEMORY_ONLY_SER、MEMORY_AND_DISK_SER等哟楷。使用RDD.persist(StorageLevel.MEMORY_ONLY_SER)這樣的語法即可否灾。
這樣的話,將數(shù)據(jù)序列化之后惩阶,再持久化扣汪,可以大大減小對內(nèi)存的消耗。此外崭别,數(shù)據(jù)量小了之后,如果要寫入磁盤舞痰,那么磁盤io性能消耗也比較小诀姚。
對RDD持久化序列化后,RDD的每個partition的數(shù)據(jù),都是序列化為一個巨大的字節(jié)數(shù)組论衍。這樣,對于內(nèi)存的消耗就小的多了炬丸。但是唯一的缺點就是,獲取RDD數(shù)據(jù)時焕阿,需要對其進行反序列化,會增大其性能開銷暮屡。
因此毅桃,對于序列化的持久化級別,還可以進一步優(yōu)化莺掠,也就是說读宙,使用Kryo序列化類庫,這樣结闸,可以獲得更快的序列化速度桦锄,并且占用更小的內(nèi)存空間。但是要記住帕棉,如果RDD的元素(RDD<T>的泛型類型)饼记,是自定義類型的話,在Kryo中提前注冊自定義類型具则。