Кодировщики наборов данных Spark: kryo () vs bean ()

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

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


person Abhay Dubey    schedule 15.05.2018    source источник


Ответы (1)


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

  • Kryo Serialization быстрее, чем Java Serialization.
  • Kryo Serialization использует меньше памяти, особенно в тех случаях, когда вам может понадобиться Cache() и Persist(). Это очень полезно на таких этапах, как Shuffling.
  • Хотя Kryo поддерживает кэширование и перемешивание, он не поддерживается во время сохранения на диске.
  • saveAsObjectFile на RDD и objectFile метод на SparkContext поддерживает только сериализацию java.
  • Чем больше настраиваемых типов данных вы обрабатываете в своих наборах данных, тем сложнее их обрабатывать. Поэтому обычно лучше всего использовать унифицированную сериализацию, такую ​​как Kryo.
  • Фреймворк сериализации Java заведомо неэффективен, потребляет слишком много ресурсов ЦП, ОЗУ и размера, чтобы быть подходящим крупномасштабным форматом сериализации.
  • При сериализации объектов в Java Serialization необходимо сохранять полные имена классов, но 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 крайне неэффективен и должен использоваться только в крайнем случае.

person wandermonk    schedule 15.05.2018
comment
Спасибо за быстрый ответ и подробные сведения. Здесь вы сравнили сериализацию java с kryo. Если мы посмотрим на кодировщики, их три - javaSerialization (), kryo () и bean (). Мой вопрос заключался в том, чтобы сравнить kryo () и bean (). По вашему мнению, когда вы говорите о сериализации Java, о какой из них вы имели в виду? И использует ли bean () сериализацию Java? Если да, в чем разница между bean () и javaSerialization ()? - person Abhay Dubey; 16.05.2018
comment
Большое спасибо за разъяснения. По сути, мы можем сказать, что по умолчанию следует использовать kryo (). - person Abhay Dubey; 16.05.2018