Spark性能調(diào)優(yōu)篇四之使用Kryo進(jìn)行序列化操作

????????接著上一篇文章,今天介紹一下通過使用Kryo這個(gè)東東來進(jìn)一步降低網(wǎng)絡(luò)IO的傳輸量和內(nèi)存的占用率。在介紹Kryo之前,接下來我們先來對比一下默認(rèn)的序列化和Kryo方式的序列化的性能(其實(shí)就是序列化后數(shù)據(jù)的體積)。

默認(rèn)的序列化:基于Java語言的Spark程序中,默認(rèn)使用了ObjectInputStream和ObjectOutputStream對對象進(jìn)行序列化操作的。這種默認(rèn)序列化機(jī)制的好處在于,處理起來比較方便;不需要我們手動(dòng)去做什么事情,只是在算子里面使用的變量,必須是實(shí)現(xiàn)Serializable接口的,可序列化即可。

Kryo方式的序列化:Spark支持了Kryo序列化類庫,采用Kryo對數(shù)據(jù)進(jìn)行序列化操作可以大大降低數(shù)據(jù)體積,官方給出的數(shù)據(jù)是采用Kryo進(jìn)行序列化比采用Java默認(rèn)的序列化方式,性能高出后者10倍(官方提供的數(shù)據(jù),沒有正式測試過)。

????????通過以上的對比,相信大家都很期待使用Kryo對數(shù)據(jù)進(jìn)行序列化操作。在使用Kryo之前,我們需要明白在那些地方可以充分發(fā)揮Kryo序列化的作用;否則,即使啟動(dòng)了該功能,但并不能提升Spark作業(yè)的運(yùn)行速度。主要有三個(gè)地方;

1、算子函數(shù)中使用到的外部變量(例如上一篇提到的隨機(jī)抽取數(shù)據(jù)的map)

2、持久化RDD時(shí)進(jìn)行序列化,StorageLevel.MEMORY_ONLY_SER?

3、shuffle階段

????????明確了以上的一些問題之后,我們看看在項(xiàng)目中是怎么的使用的吧。其實(shí)很簡單,通過使用JavaSparkContext對象啟用Kryo對數(shù)據(jù)進(jìn)行序列化

sc.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

sc.registerKryoClasses(new Class[]{CategorySortKey.class}) ? ? ?/*CategorySortKey是一個(gè)例子*/

總結(jié):使用Kryo進(jìn)行數(shù)據(jù)的序列化是不是很簡單;本片文章內(nèi)容較短,在Spark項(xiàng)目中使用這個(gè)特性進(jìn)行作業(yè)的優(yōu)化也能夠提升一定的效率。大家可以試著將其運(yùn)用到自己的項(xiàng)目中去。本文到這里基本接近尾聲,后續(xù)還會不斷更新關(guān)于Spark作業(yè)優(yōu)化的一些其他方式,歡迎關(guān)注。

如需轉(zhuǎn)載,請注明:

z小趙?Spark性能調(diào)優(yōu)篇四之使用Kryo進(jìn)行序列化操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容