您好,登錄后才能下訂單哦!
小編給大家分享一下Spark中如何以序列化方式調優,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在任何分布式應用中序列化都扮演者一個重要的角色。序列化過程非常慢的或者消耗大量字節的序列化格式,都是會巨大的減緩計算速度。通常這是優化spark應用程序的第一件事情。Spark目標是在你的操作中直接便利的使用java類型和性能找到一個平衡點。目前,spark提供兩種序列化的庫:
1.Java serialization:默認情況下,spark使用Java的 ObjectOutputStream框架,序列化對象。可以應用于任何繼承了java.io.Serializable的自創建類。你也可以通過更密切的繼承java.io.Externalizable,來控制你自己的序列化方式的性能。JAVA的序列化雖然靈活,但是通常是非常慢的,同時針對很多類會導致大的序列化格式。
2.Kryo serialization:Spark也可以用 Kryo library (version 2) 來加速序列化。Kryo比java序列化更快,更緊湊(往往搞出10倍),但是并不支持所有的序列化類型,為了達到最佳的性能需要提前注冊你在你的程序中使用的類。
你可以通過使用SparkConf更改spark的序列化方式。這個設置不僅影響到worker間傳輸的Shuffle數據也會序列化準備寫到磁盤的RDD。Kryo不是默認序列化方式的主要原因是需要自定義注冊。我們建議使用它在任何網絡密集型應用程序中。
Spark會自動的包括Kryo,針對大多數通用的scala類。
向Kryo注冊你的類,可以通過registerKryoClasses 方法
val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)
https://github.com/EsotericSoftware/kryo 鏈接文檔描述了更先進的kryo注冊選項,如添加自定義序列化代碼。
如果你的對象非常大,你需要增加spark.kryoserializer.buffer。這個值要大于你要序列化的最大的對象。
最后,如果不向Kyro注冊你的自定義類型,Kyro也會繼續工作,但是他會保存你每個對象的類全名,這非常浪費。
關于spark對Kyro的配置的支持,請參考。
http://spark.apache.org/docs/1.6.0/configuration.html#compression-and-serialization
以上是“Spark中如何以序列化方式調優”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。