簡體   English   中英

Spark 數據集編碼器:kryo() 與 bean()

[英]Spark dataset encoders: kryo() vs bean()

在 Spark 中處理數據集時,我們需要指定用於序列化和反序列化對象的編碼器。 我們可以選擇使用Encoders.bean(Class<T>)Encoders.kryo(Class<T>)

這些有什么不同,使用一種與另一種的性能影響是什么?

出於多種原因,始終建議使用 Kryo 序列化到 Java 序列化。 其中一些在下面。

  • Kryo 序列化比 Java 序列化更快。
  • Kryo 序列化使用更少的內存占用,尤其是在您可能需要Cache()Persist() 這在像Shuffling這樣的階段非常有用。
  • 盡管 Kryo 支持緩存和改組,但在持久化到磁盤期間不支持。
  • saveAsObjectFile上RDD和objectFile方法上SparkContext僅支持Java序列。
  • 您在數據集中處理的自定義數據類型越多,處理它們的復雜性就越高。 因此,通常最好的做法是使用像 Kryo 這樣的統一序列化。
  • Java 的序列化框架效率低下是出了名的,消耗過多的 CPU、RAM 和大小,無法成為合適的大規模序列化​​格式。
  • Java 序列化需要在序列化對象時存儲完全限定的類名。但是,Kryo 允許您通過保存/注冊類sparkConf.registerKryoClasses(Array( classOf[A], classOf[B], ...))sparkConf.set("spark.kryo.registrator", "MyKryoRegistrator") 這節省了大量空間並避免了不必要的元數據。

bean()javaSerialization()之間的區別在於javaSerialization()使用通用 java 序列化來序列化T類型的對象。 此編碼器將T映射到單個字節數組(二進制)字段。 其中 bean 為T類型的 Java Bean 創建了一個編碼器。 它們都使用 Java 序列化,唯一的區別是它們如何將對象表示為字節。

從文檔中引用

JavaSerialization 效率極低,只能作為最后的手段使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM