Кодеры набора данных Spark: kryo () против bean () - PullRequest
0 голосов
/ 15 мая 2018

При работе с наборами данных в Spark нам необходимо указать кодировщики для сериализации и десериализации объектов.У нас есть возможность использовать Encoders.bean(Class<T>) или Encoders.kryo(Class<T>).

Чем они отличаются и как это влияет на производительность использования одного против другого?

1 Ответ

0 голосов
/ 15 мая 2018

Всегда рекомендуется использовать сериализацию Kryo для сериализации Java по многим причинам. Некоторые из них ниже.

  • Сериализация Kryo быстрее, чем Сериализация Java.
  • Kryo Serialization использует меньше памяти, особенно в тех случаях, когда вам может понадобиться Cache() и Persist(). Это очень полезно на таких этапах, как Shuffling.
  • Хотя Kryo поддерживается для кэширования и перетасовки, он не поддерживается во время сохранения на диске.
  • saveAsObjectFile для RDD и метод objectFile для SparkContext поддерживает только сериализацию Java.
  • Чем больше пользовательских типов данных вы обрабатываете в своих наборах данных, тем сложнее обрабатывать их. Поэтому обычно рекомендуется использовать унифицированную сериализацию, например, Kryo.
  • Инфраструктура Java-сериализации, как известно, неэффективна, потребляя слишком много ЦП, ОЗУ и размера, чтобы быть подходящим форматом крупномасштабной сериализации.
  • Сериализация Java должна хранить полные имена классов при сериализации объектов. Но Kryo позволяет избежать этого, сохраняя / регистрируя классы sparkConf.registerKryoClasses(Array( classOf[A], classOf[B], ...)) или sparkConf.set("spark.kryo.registrator", "MyKryoRegistrator"). Это экономит много места и позволяет избежать ненужных метаданных.

Разница между bean() и javaSerialization() заключается в том, что javaSerialization сериализует объекты типа T, используя общую сериализацию Java. Этот кодер отображает T в однобайтовое (двоичное) поле массива. Где as bean создает кодировщик для Java Bean типа T. Оба они используют сериализацию Java, единственное отличие состоит в том, как они представляют объекты в байтах.

Цитирование из документации

JavaSerialization крайне неэффективна и должна использоваться только как последнее прибежище.

...