[英]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 方法有效地壓縮列。 因此較低的存儲內存要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.