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

Hat*_*tak 4 java memory-management apache-spark apache-spark-dataset apache-spark-encoders

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

基本上,在使用 s 时,使用 beans 相对于 Kryo 序列化有哪些优缺点Encoder?有任何性能改进吗?Dataset除了使用 SER 选项进行缓存之外,还有其他方法可以压缩缓存吗?

作为记录,我发现了一个类似的主题来处理两者之间的比较。然而,它没有详细讨论这个比较。

zer*_*323 5

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

Encoders.bean当您比较使用和创建的模式时,这种差异就变得很明显Encoders.kryo

为什么这有关系?

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

那么什么时候使用kryo Encoder呢?一般来说,当其他方法都不起作用时。就我个人而言,我会完全避免它进行数据序列化。我能想到的唯一真正有用的应用程序是聚合缓冲区的序列化(例如检查如何在 Spark SQL 中查找分组向量列的平均值?)。