我正在使用 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()
mode 和 RDDs 大小是一样的。作为序列化 Java 对象的 RDD 应存储为每个分区一个字节数组。持久化 RDD 的大小不应该小于反序列化的吗?在创建数据集时添加 Kryo 和 bean 编码器到底在做什么?
我可以重命名持久化的 RDD 以获得更好的可读性吗?