亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spark性能優化之使用高性能序列化類庫

發布時間:2020-07-06 21:14:02 來源:網絡 閱讀:1569 作者:惡魔蘇醒ing 欄目:大數據

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

     默認,spark使用了Java自身提供的序列化機制,基于objectoutputStream和objectinputstream,因為這種方式是Java原生提供的,很方便使用。但是Java序列化機制性能并不高,速度比較慢,序列化后的數據還是比較大,只要你的類實現了Serializable接口,那么都是可以序列化的。

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

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

    使用Kryo時,它要求是需要序列化的類,是要預先進行注冊的,以獲得最佳性能——如果不注冊的話,那么Kryo必須時刻保存類型的全限定名,反而占用不少內存。Spark默認是對Scala中常用的類型自動注冊了Kryo的,都在AllScalaRegistry類中。

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

(實際上,下面的寫法是錯誤的,因為counter不是共享的,所以累加的功能是無法實現的)

val counter = new Counter();

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

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

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


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)

優化Kryo類庫的使用

1、優化緩存大小

如果注冊的要序列化的自定義的類型,本身特別大,比如包含了超過100個field。那么就會導致要序列化的對象過大。此時就需要對Kryo本身進行優化。因為Kryo內部的緩存可能不夠存放那么大的class對象。此時就需要調用SparkConf.set()方法,設置spark.kryoserializer.buffer.mb參數的值,將其調大。

默認情況下它的值是2,就是說最大能緩存2M的對象,然后進行序列化。可以在必要時將其調大。比如設置為10。

2、預先注冊自定義類型

雖然不注冊自定義類型,Kryo類庫也能正常工作,但是那樣的話,對于它要序列化的每個對象,都會保存一份它的全限定類名。此時反而會耗費大量內存。因此通常都建議預先注冊號要序列化的自定義的類。

在什么場景下使用Kryo序列化類庫

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

     那么,這里針對的Kryo序列化類庫的使用場景,就是算子函數使用到了外部的大數據的情況。比如說吧,我們在外部定義了一個封裝了應用所有配置的對象,比如自定義了一個MyConfiguration對象,里面包含了100m的數據。然后,在算子函數里面,使用到了這個外部的大對象。

    此時呢,如果默認情況下,讓Spark用java序列化機制來序列化這種外部的大對象,那么就會導致,序列化速度緩慢,并且序列化以后的數據還是比較大,比較占用內存空間。

因此,在這種情況下,比較適合,切換到Kryo序列化類庫,來對外部的大對象進行序列化操作。一是,序列化速度會變快;二是,會減少序列化后的數據占用的內存空間。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

城固县| 长兴县| 鲁山县| 新丰县| 渝北区| 郓城县| 台北县| 通海县| 潜江市| 洛川县| 乌兰浩特市| 电白县| 河北区| 塔河县| 邹平县| 江城| 云和县| 弋阳县| 铜梁县| 华蓥市| 沐川县| 忻城县| 甘洛县| 孝感市| 夏邑县| 绍兴县| 宣武区| 景洪市| 昌图县| 思南县| 蒙城县| 元江| 原阳县| 清原| 广昌县| 靖州| 喀喇沁旗| 榆林市| 报价| 屏南县| 同心县|