dev*_*v ツ 3 kryo apache-spark apache-spark-dataset apache-spark-encoders
我正在使用 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
}
Run Code Online (Sandbox Code Playgroud)
火花示例:
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();
Run Code Online (Sandbox Code Playgroud)
我在 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
Run Code Online (Sandbox Code Playgroud)
几个问题:
Kryo 序列化 RDD 的大小是否应该小于 Java 序列化 RDD,而不是大于两倍大小?
我也尝试过MEMORY_ONLY_SER()模式和 RDD 大小是相同的。RDD 作为序列化 Java 对象,应将每个分区存储为一个字节数组。持久化 RDD 的大小不应该小于反序列化 RDD 的大小吗?
创建数据集时添加 Kryo 和 bean 编码器到底在做什么?
我可以重命名持久化的 RDD 以提高可读性吗?
kryo序列化RDD的大小不应该小于Java序列化RDD而不是大于两倍大小吗?
如果您曾经使用过 Java 序列化(或 RDD),情况确实如此。但这里的情况并非如此。应用时使用Java序列化Encoders.javaSerialization,与使用二进制序列化相同Encoders.kryo。
二进制序列化器获取整个对象,使用通用序列化工具对其进行序列化,并将生成的字节数组存储为单个DataFrame列。结果对于优化器来说是不透明的(没有真正的存储优化,因为 blob 压缩得不好),并且只能与函数(“强类型”API)一起使用。
Encoders.bean是一头完全不同又极为相似的野兽Encoders.product。它利用类的结构,并反映在模式中。由于它对各个字段进行编码,因此可以使用标准 Spark 方法有效地压缩列。因此,存储内存要求较低。
与 Spark Encoders 密切相关:何时使用 beans()
| 归档时间: |
|
| 查看次数: |
2696 次 |
| 最近记录: |