Apache spark 关于数据集中kryo和java编码器的问题

Apache spark 关于数据集中kryo和java编码器的问题,apache-spark,apache-spark-dataset,kryo,apache-spark-encoders,Apache Spark,Apache Spark Dataset,Kryo,Apache Spark Encoders,我正在使用Spark 2.4并参考 Bean类: 公共类EmployeeBean实现可序列化{ 私人长id; 私有字符串名称; 私人长期工资; 私人整数年龄; //接球手和接球手 } 例如: SparkSession spark=SparkSession.builder().master(“local[4]”).appName(“play with spark”).getOrCreate(); 列出员工1=人口员工(1,1,000); Dataset ds1=spark.createData

我正在使用Spark 2.4并参考

Bean类:

公共类EmployeeBean实现可序列化{
私人长id;
私有字符串名称;
私人长期工资;
私人整数年龄;
//接球手和接球手
}
例如:

SparkSession spark=SparkSession.builder().master(“local[4]”).appName(“play with spark”).getOrCreate();
列出员工1=人口员工(1,1,000);
Dataset ds1=spark.createDataset(employees1,Encoders.kryo(EmployeeBean.class));
Dataset ds2=spark.createDataset(employees1,Encoders.bean(EmployeeBean.class));
ds1.persist(StorageLevel.MEMORY_ONLY());
长ds1Count=ds1.count();
ds2.persist(仅限StorageLevel.MEMORY_());
长ds2Count=ds2.count();
我在Spark Web UI中查找存储。有用部分-

ID RDD名称在内存中的大小
2个LocalTableScan[value#0]56.5 MB
13 LocalTableScan[age#6,id#7L,name#8,salary#9L]233MB
几个问题:

  • Kryo序列化RDD的大小不应该小于Java序列化RDD,而应该大于两倍吗

  • 我还尝试了
    MEMORY\u ONLY\u SER()
    模式和RDD大小相同。作为序列化Java对象的RDD应该存储为每个分区一个字节数组。持久化RDD的大小不应该小于反序列化RDD吗

  • 在创建数据集时,添加Kryo和bean编码器到底在做什么

  • 我可以重命名持久化RDD以提高可读性吗

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

如果您曾经使用过Java序列化(或者RDD),那将是正确的。然而,这里的情况并非如此。Java序列化在应用时使用,与编码器一样,kryo使用二进制序列化

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

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

密切相关