Кодеры набора данных Spark: kryo() против bean()

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

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

1 ответ

Решение

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

  • Сериализация Kryo быстрее, чем Сериализация Java.
  • Kryo Serialization использует меньше памяти, особенно в тех случаях, когда вам может понадобиться Cache() а также Persist(), Это очень полезно на таких этапах, как Shuffling,
  • Хотя Kryo поддерживается для кэширования и перетасовки, он не поддерживается во время сохранения на диске.
  • saveAsObjectFile на СДР и 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 крайне неэффективна и должна использоваться только в качестве последнего средства.

Другие вопросы по тегам