Всегда рекомендуется использовать сериализацию 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 крайне неэффективна и должна использоваться только как
последнее прибежище.