spark優(yōu)化高性能序列化類庫_第1頁
spark優(yōu)化高性能序列化類庫_第2頁
spark優(yōu)化高性能序列化類庫_第3頁
spark優(yōu)化高性能序列化類庫_第4頁
spark優(yōu)化高性能序列化類庫_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

北風網(wǎng)項目實戰(zhàn)培訓Spark性能優(yōu)化:高性能序列化類庫講師:中華石杉Spark從入門到精通(案例實戰(zhàn)、高級特性、內核源碼、性能調優(yōu))在任何分布式系統(tǒng)中,序列化都是扮演著一個重要的角色的。如果使用的序列化技術,在執(zhí)行序列化操作的時候很慢,或者是序列化后的數(shù)據(jù)還是很大,那么會讓分布式應用程序的性能下降很多。所以,進行Spark性能優(yōu)化的第一步,就是進行序列化的性能優(yōu)化。Spark自身默認就會在一些地方對數(shù)據(jù)進行序列化,比如Shuffle。還有就是,如果我們的算子函數(shù)使用到了外部的數(shù)據(jù)(比如Java內置類型,或者自定義類型),那么也需要讓其可序列化。而Spark自身對于序列化的便捷性和性能進行了一個取舍和權衡。默認,Spark傾向于序列化的便捷性,使用了Java自身提供的序列化機制——基于ObjectInputStream和ObjectOutputStream的序列化機制。因為這種方式是Java原生提供的,很方便使用。但是問題是,Java序列化機制的性能并不高。序列化的速度相對較慢,而且序列化以后的數(shù)據(jù),還是相對來說比較大,還是比較占用內存空間。因此,如果你的Spark應用程序對內存很敏感,那么,實際上默認的Java序列化機制并不是最好的選擇。數(shù)據(jù)序列化概述Spark實際上提供了兩種序列化機制,它只是默認使用了第一種:1、Java序列化機制:默認情況下,Spark使用Java自身的ObjectInputStream和ObjectOutputStream機制進行對象的序列化。只要你的類實現(xiàn)了Serializable接口,那么都是可以序列化的。而且Java序列化機制是提供了自定義序列化支持的,只要你實現(xiàn)Externalizable接口即可實現(xiàn)自己的更高性能的序列化算法。Java序列化機制的速度比較慢,而且序列化后的數(shù)據(jù)占用的內存空間比較大。2、Kryo序列化機制:Spark也支持使用Kryo類庫來進行序列化。Kryo序列化機制比Java序列化機制更快,而且序列化后的數(shù)據(jù)占用的空間更小,通常比Java序列化的數(shù)據(jù)占用的空間要小10倍。Kryo序列化機制之所以不是默認序列化機制的原因是,有些類型雖然實現(xiàn)了Seriralizable接口,但是它也不一定能夠進行序列化;此外,如果你要得到最佳的性能,Kryo還要求你在Spark應用程序中,對所有你需要序列化的類型都進行注冊。Spark提供的兩種序列化機制如果要使用Kryo序列化機制,首先要用SparkConf設置一個參數(shù),使用newSparkConf().set("spark.serializer","org.apache.spark.serializer.KryoSerializer")即可,即將Spark的序列化器設置為KryoSerializer。這樣,Spark在內部的一些操作,比如Shuffle,進行序列化時,就會使用Kryo類庫進行高性能、快速、更低內存占用量的序列化了。使用Kryo時,它要求是需要序列化的類,是要預先進行注冊的,以獲得最佳性能——如果不注冊的話,那么Kryo必須時刻保存類型的全限定名,反而占用不少內存。Spark默認是對Scala中常用的類型自動注冊了Kryo的,都在AllScalaRegistry類中。但是,比如自己的算子中,使用了外部的自定義類型的對象,那么還是需要將其進行注冊。(實際上,下面的寫法是錯誤的,因為counter不是共享的,所以累加的功能是無法實現(xiàn)的)valcounter=newCounter();valnumbers=sc.parallelize(Array(1,2,3,4,5))numbers.foreach(num=>counter.add(num));如何使用Kryo序列化機制(一)如果要注冊自定義的類型,那么就使用如下的代碼,即可:Scala版本:valconf=newSparkConf().setMaster(...).setAppName(...)conf.registerKryoClasses(Array(classOf[Counter]))valsc=newSparkContext(conf)Java版本:SparkConfconf=newSparkConf().setMaster(...).setAppName(...)conf.registerKryoClasses(Counter.class)JavaSparkContextsc=newJavaSparkContext(conf)如何使用Kryo序列化機制(二)1、優(yōu)化緩存大小如果注冊的要序列化的自定義的類型,本身特別大,比如包含了超過100個field。那么就會導致要序列化的對象過大。此時就需要對Kryo本身進行優(yōu)化。因為Kryo內部的緩存可能不夠存放那么大的class對象。此時就需要調用SparkConf.set()方法,設置spark.kryoserializer.buffer.mb參數(shù)的值,將其調大。默認情況下它的值是2,就是說最大能緩存2M的對象,然后進行序列化。可以在必要時將其調大。比如設置為10。2、預先注冊自定義類型雖然不注冊自定義類型,Kryo類庫也能正常工作,但是那樣的話,對于它要序列化的每個對象,都會保存一份它的全限定類名。此時反而會耗費大量內存。因此通常都建議預先注冊號要序列化的自定義的類。優(yōu)化Kryo類庫的使用首先,這里討論的都是Spark的一些普通的場景,一些特殊的場景,比如RDD的持久化,在后面會講解。這里先不說。那么,這里針對的Kryo序列化類庫的使用場景,就是算子函數(shù)使用到了外部的大數(shù)據(jù)的情況。比如說吧,我們在外部定義了一個封裝了應用所有配置的對象,比如自定義了一個MyConfiguration對象,里面包含了100m的數(shù)據(jù)。然后,在算子函數(shù)里面,使用到了這個外部的大對象。此時呢,如果默認情況下,讓Spark用java序列化機制來序列化這種外部的大對象,那么就會導致,序列化速度緩慢,并且序列

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論