Кодеры набора данных 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 крайне неэффективна и должна использоваться только в качестве последнего средства.