簡體   English   中英

關於數據集中 kryo 和 java 編碼器的問題

[英]Question regarding kryo and java encoders in datasets

我正在使用 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 的大小不應該小於反序列化的嗎?

  • 在創建數據集時添加 Kryo 和 bean 編碼器到底在做什么?

  • 我可以重命名持久化的 RDD 以獲得更好的可讀性嗎?

kryo 序列化 RDD 的大小不應該小於 Java 序列化 RDD 而不是兩倍以上嗎?

如果您曾經使用過 Java 序列化(或就此而言的 RDD),那將是正確的。 然而,這里的情況並非如此。 當您應用Encoders.javaSerialization時使用 Java 序列化,它與Encoders.kryo ,使用二進制序列化。

二進制序列化器獲取整個對象,使用通用序列化工具對其進行序列化,並將生成的字節數組存儲為單個DataFrame列。 結果對於優化器來說是不透明的(沒有真正的存儲優化,因為 blob 不能很好地壓縮),並且只能用於函數式(“強類型”API)。

Encoders.bean是一個完全不同的野獸,與Encoders.product非常相似。 它利用類的結構,並反映在模式中。 因為它對單個字段進行編碼,所以可以使用標准 Spark 方法有效地壓縮列。 因此較低的存儲內存要求。

Spark 編碼器密切相關:何時使用 beans()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM