欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

spark性能優(yōu)化之使用高性能序列化類庫(kù)

      如果使用序列化技術(shù),在執(zhí)行序列化操作的時(shí)候很慢或者是序列化之后的數(shù)據(jù)量還是很大,那么會(huì)讓分布式應(yīng)用程序性能下降很多,spark自身就會(huì)在一些地方對(duì)數(shù)據(jù)進(jìn)行序列化,比如shuffle寫磁盤,還有就是如果我們算子函數(shù)使用了外部數(shù)據(jù),(比如Java內(nèi)置類型,或者自定義類型)那么也需要讓其可序列化。

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司是一家服務(wù)多年做網(wǎng)站建設(shè)策劃設(shè)計(jì)制作的公司,為廣大用戶提供了成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),廣告投放平臺(tái),成都做網(wǎng)站選創(chuàng)新互聯(lián)建站,貼合企業(yè)需求,高性價(jià)比,滿足客戶不同層次的需求一站式服務(wù)歡迎致電。

     默認(rèn),spark使用了Java自身提供的序列化機(jī)制,基于objectoutputStream和objectinputstream,因?yàn)檫@種方式是Java原生提供的,很方便使用。但是Java序列化機(jī)制性能并不高,速度比較慢,序列化后的數(shù)據(jù)還是比較大,只要你的類實(shí)現(xiàn)了Serializable接口,那么都是可以序列化的。

    spark支持使用Kryo類型來(lái)進(jìn)行序列化,比Java序列化機(jī)制更快,而且序列化后的數(shù)據(jù)量更小。Kryo序列化機(jī)制之所以不是默認(rèn)序列化機(jī)制的原因是,有些類型雖然實(shí)現(xiàn)了Seriralizable接口,但是它也不一定能夠進(jìn)行序列化;此外,如果你要得到最佳的性能,Kryo還要求你在Spark應(yīng)用程序中,對(duì)所有你需要序列化的類型都進(jìn)行注冊(cè)。  

     如果要使用Kryo序列化機(jī)制,首先要用SparkConf設(shè)置一個(gè)參數(shù),使用new SparkConf().set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")即可,即將Spark的序列化器設(shè)置為KryoSerializer。這樣,Spark在內(nèi)部的一些操作,比如Shuffle,進(jìn)行序列化時(shí),就會(huì)使用Kryo類庫(kù)進(jìn)行高性能、快速、更低內(nèi)存占用量的序列化了。

    使用Kryo時(shí),它要求是需要序列化的類,是要預(yù)先進(jìn)行注冊(cè)的,以獲得最佳性能——如果不注冊(cè)的話,那么Kryo必須時(shí)刻保存類型的全限定名,反而占用不少內(nèi)存。Spark默認(rèn)是對(duì)Scala中常用的類型自動(dòng)注冊(cè)了Kryo的,都在AllScalaRegistry類中。

     但是,比如自己的算子中,使用了外部的自定義類型的對(duì)象,那么還是需要將其進(jìn)行注冊(cè)。

(實(shí)際上,下面的寫法是錯(cuò)誤的,因?yàn)閏ounter不是共享的,所以累加的功能是無(wú)法實(shí)現(xiàn)的)

val counter = new Counter();

val numbers = sc.parallelize(Array(1, 2, 3, 4, 5))

numbers.foreach(num => counter.add(num));

   如果要注冊(cè)自定義的類型,那么就使用如下的代碼,即可:

Scala版本:

val conf = new SparkConf().setMaster(...).setAppName(...)

conf.registerKryoClasses(Array(classOf[Counter] ))

val sc = new SparkContext(conf)

Java版本:

SparkConf conf = new SparkConf().setMaster(...).setAppName(...)

conf.registerKryoClasses(Counter.class)

JavaSparkContext sc = new JavaSparkContext(conf)

優(yōu)化Kryo類庫(kù)的使用

1、優(yōu)化緩存大小

如果注冊(cè)的要序列化的自定義的類型,本身特別大,比如包含了超過(guò)100個(gè)field。那么就會(huì)導(dǎo)致要序列化的對(duì)象過(guò)大。此時(shí)就需要對(duì)Kryo本身進(jìn)行優(yōu)化。因?yàn)镵ryo內(nèi)部的緩存可能不夠存放那么大的class對(duì)象。此時(shí)就需要調(diào)用SparkConf.set()方法,設(shè)置spark.kryoserializer.buffer.mb參數(shù)的值,將其調(diào)大。

默認(rèn)情況下它的值是2,就是說(shuō)最大能緩存2M的對(duì)象,然后進(jìn)行序列化。可以在必要時(shí)將其調(diào)大。比如設(shè)置為10。

2、預(yù)先注冊(cè)自定義類型

雖然不注冊(cè)自定義類型,Kryo類庫(kù)也能正常工作,但是那樣的話,對(duì)于它要序列化的每個(gè)對(duì)象,都會(huì)保存一份它的全限定類名。此時(shí)反而會(huì)耗費(fèi)大量?jī)?nèi)存。因此通常都建議預(yù)先注冊(cè)號(hào)要序列化的自定義的類。

在什么場(chǎng)景下使用Kryo序列化類庫(kù)

    首先,這里討論的都是Spark的一些普通的場(chǎng)景,一些特殊的場(chǎng)景,比如RDD的持久化

     那么,這里針對(duì)的Kryo序列化類庫(kù)的使用場(chǎng)景,就是算子函數(shù)使用到了外部的大數(shù)據(jù)的情況。比如說(shuō)吧,我們?cè)谕獠慷x了一個(gè)封裝了應(yīng)用所有配置的對(duì)象,比如自定義了一個(gè)MyConfiguration對(duì)象,里面包含了100m的數(shù)據(jù)。然后,在算子函數(shù)里面,使用到了這個(gè)外部的大對(duì)象。

    此時(shí)呢,如果默認(rèn)情況下,讓Spark用java序列化機(jī)制來(lái)序列化這種外部的大對(duì)象,那么就會(huì)導(dǎo)致,序列化速度緩慢,并且序列化以后的數(shù)據(jù)還是比較大,比較占用內(nèi)存空間。

因此,在這種情況下,比較適合,切換到Kryo序列化類庫(kù),來(lái)對(duì)外部的大對(duì)象進(jìn)行序列化操作。一是,序列化速度會(huì)變快;二是,會(huì)減少序列化后的數(shù)據(jù)占用的內(nèi)存空間。

網(wǎng)站名稱:spark性能優(yōu)化之使用高性能序列化類庫(kù)
當(dāng)前URL:http://chinadenli.net/article44/jgjghe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)響應(yīng)式網(wǎng)站GoogleChatGPT網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)