我在使用Spark的缓存机制时遇到了内存管理问题。我目前正在将 Encoder
与 Kryo 结合使用,想知道切换到 beans 是否可以帮助我减少缓存数据集的大小。
基本上,在使用 Encoder
时,使用 beans 相对于 Kryo 序列化有何优缺点?有任何性能改进吗?除了使用 SER 选项进行缓存之外,还有其他方法可以压缩缓存的数据集吗?
根据记录,我发现了类似的 topic这解决了两者之间的比较。但是,它没有详细讨论此比较。
最佳答案
只要有可能。与使用通用二进制序列化并将整个对象存储为不透明 blob 的通用二进制 Encoder
不同,Encoders.bean[T]
利用对象的结构来提供特定于类的存储布局。
当您比较使用 Encoders.bean
和 Encoders.kryo
创建的架构时,这种差异就变得很明显。
为什么这很重要?
- 您可以使用 SQL API 进行高效的字段访问,无需反序列化,并且完全支持所有
数据集
转换。 - 通过透明字段序列化,您可以充分利用列式存储,包括内置压缩。
那么什么时候使用kryo
Encoder
?一般来说,当其他方法都不起作用时。就我个人而言,我会完全避免它进行数据序列化。我能想到的唯一真正有用的应用程序是聚合缓冲区的序列化(例如检查 How to find mean of grouped Vector columns in Spark SQL? )。
关于java - Spark编码器: when to use beans(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370288/