Spark编码器:何时使用beans()

时间:2018-07-16 21:22:46

标签: java apache-spark memory-management apache-spark-dataset apache-spark-encoders

在使用Spark的缓存机制时遇到了内存管理问题。我目前正在将Encoder与Kryo配合使用,并且想知道切换到Bean是否可以帮助我减少缓存数据集的大小。

基本上,在使用Encoder时,通过Kryo序列化使用bean的优缺点是什么?是否有任何性能改进?除了使用SER选项进行缓存外,是否有办法压缩缓存的Dataset

作为记录,我发现了一个类似的topic,可以解决两者之间的比较。但是,此比较没有详细介绍。

1 个答案:

答案 0 :(得分:1)

只要有可能。与使用通用二进制序列化并将整个对象存储为不透明blob的通用二进制Encoders不同,Encoders.bean[T]利用对象的结构来提供类特定的存储布局。

当您比较使用Encoders.beanEncoders.kryo创建的架构时,这种区别变得显而易见。

为什么重要?

  • 您可以使用SQL API进行有效的字段访问,而无需进行反序列化并完全支持所有Dataset转换。
  • 通过透明字段序列化,您可以充分利用列式存储,包括内置压缩。

那么什么时候使用kryo Encoder?通常,当没有其他方法起作用时。就个人而言,我将完全避免将其用于数据序列化。我能想到的唯一真正有用的应用程序是聚合缓冲区的序列化(例如检查How to find mean of grouped Vector columns in Spark SQL?)。