Вопрос относительно кодеров kryo и java в наборах данных - PullRequest
0 голосов
/ 04 января 2019

Я использую Spark 2.4 и ссылаюсь на https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence

Класс EJB:

public class EmployeeBean implements Serializable {

    private Long id;
    private String name;
    private Long salary;
    private Integer age;

    // getters and setters

}

Spark Пример:

    SparkSession spark = SparkSession.builder().master("local[4]").appName("play-with-spark").getOrCreate();

    List<EmployeeBean> employees1 = populateEmployees(1, 1_000_000);

    Dataset<EmployeeBean> ds1 = spark.createDataset(employees1, Encoders.kryo(EmployeeBean.class));
    Dataset<EmployeeBean> ds2 = spark.createDataset(employees1, Encoders.bean(EmployeeBean.class));

    ds1.persist(StorageLevel.MEMORY_ONLY());
    long ds1Count = ds1.count();

    ds2.persist(StorageLevel.MEMORY_ONLY());
    long ds2Count = ds2.count();

Я искал хранилище в SparkВеб-интерфейс.Полезная часть -

ID  RDD Name                                           Size in Memory   
2   LocalTableScan [value#0]                           56.5 MB  
13  LocalTableScan [age#6, id#7L, name#8, salary#9L]   23.3 MB

Несколько вопросов:

  • Разве размер сериализованного RDD Kryo не должен быть меньше, чем Java RDD, сериализированного RDD, а не большечем двойной размер?

  • Я также пробовал режим MEMORY_ONLY_SER() и размер RDD одинаковы.СДР как сериализованные объекты Java должны храниться в виде одного байтового массива на раздел.Разве размер сохраняемых СДР не должен быть меньше десериализованных?

  • Что именно делает добавление Kryo и bean-кодировщиков при создании набора данных?

  • Можно ли переименовать сохраненные RDD для лучшей читаемости?

1 Ответ

0 голосов
/ 04 января 2019

Разве размер RDD, сериализованного в крио, не должен быть меньше размера RDD, сериализованного в Java, а не более чем в два раза?это важно).Однако это не тот случай.Сериализация Java используется, когда вы применяете Encoders.javaSerialization, который, так же как и Encoders.kryo, использует двоичную сериализацию.

Двоичные сериализаторы берут весь объект, сериализуют его, используя универсальные инструменты сериализации, исохранить полученный байтовый массив как один столбец DataFrame.Результат непрозрачен для оптимизатора (без реальной оптимизации хранилища, поскольку большие двоичные объекты плохо сжимаются) и может использоваться только с функционалом («строго типизированный» API).

Encoders.bean - это совершенно другой зверьочень похожий Encoders.product.Он использует структуру класса и отражается в схеме.Поскольку он кодирует отдельные поля, столбцы могут быть эффективно сжаты с использованием стандартных методов Spark.Отсюда и более низкие требования к памяти.

Тесно связан с Spark Encoders: когда использовать bean-компоненты ()

...