【问题标题】:Question regarding kryo and java encoders in datasets关于数据集中 kryo 和 java 编码器的问题
【发布时间】:2019-05-30 17:54:13
【问题描述】:

我正在使用 Spark 2.4 并参考 https://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-persistence

豆类:

public class EmployeeBean implements Serializable {

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

    // getters and setters

}

火花示例:

    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 Web UI 中寻找存储。有用的部分 -

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

几个问题:

  • Kryo 序列化 RDD 的大小是否应该小于 Java 序列化 RDD 而不是大于两倍?

  • 我也试过MEMORY_ONLY_SER()模式和RDDs大小是一样的。作为序列化 Java 对象的 RDD 应存储为每个分区一个字节数组。持久化 RDD 的大小不应该小于反序列化的吗?

  • 在创建 Dataset 时添加 Kryo 和 bean 编码器到底在做什么?

  • 我可以重命名持久化 RDD 以获得更好的可读性吗?

【问题讨论】:

    标签: apache-spark apache-spark-dataset kryo apache-spark-encoders


    【解决方案1】:

    kryo 序列化 RDD 的大小不应该小于 Java 序列化 RDD 而不是大于两倍吗?

    如果您曾经使用过 Java 序列化(或就此而言的 RDD),那将是正确的。然而,这里不是这样。申请Encoders.javaSerialization时使用Java序列化,与Encoders.kryo一样,使用二进制序列化。

    二进制序列化器获取整个对象,使用通用序列化工具对其进行序列化,并将生成的字节数组存储为单个 DataFrame 列。结果对于优化器来说是不透明的(没有真正的存储优化,因为 blob 不能很好地压缩),并且只能用于函数式(“强类型”API)。

    Encoders.bean 是一个完全不同的野兽,与Encoders.product 非常相似。它利用类的结构,并反映在模式中。因为它对单个字段进行编码,所以可以使用标准 Spark 方法有效地压缩列。因此存储内存要求较低。

    Spark Encoders: when to use beans()密切相关

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 2018-10-25
      • 2018-10-04
      • 2016-11-25
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多