Spark 序列化策略——我应该只使用 Kryo 吗?
Spark Serialization strategy - should I be using Kryo exclusively?
我是 spark 新手。甚至更新到 Kryo。在我的 spark 应用程序中,我使用 kryo 来序列化值对象,但只对包含算法的对象使用 Serializable 接口……原因是我不想用 Kryo 注册每个 class。
我应该只使用 kryo 吗?
混搭是否可以(就像我正在做的那样)?
当您将 spark.serializer
设置为 org.apache.spark.serializer.KryoSerializer
时,RDD 中的所有对象(它不包括闭包*)都使用 Kryo 进行序列化。 Class 注册只是提高性能的一种方式(注册 classes 只需要一个整数 id 而不是完全限定的 class 名称与序列化对象一起存储)。您可以查看 Kryo 文档的 relevant section 了解详细信息。
换句话说,如果您关心性能,您应该注册所有必须在您的程序中序列化的 classes,但无论如何您已经在使用 Kryo。
* 闭包使用标准 Java 序列化进行序列化,Kryo 中的注册不会影响这一点,因此如果要通过闭包传递某些对象,您仍然必须使用 java.io.Serializable
.
我是 spark 新手。甚至更新到 Kryo。在我的 spark 应用程序中,我使用 kryo 来序列化值对象,但只对包含算法的对象使用 Serializable 接口……原因是我不想用 Kryo 注册每个 class。
我应该只使用 kryo 吗? 混搭是否可以(就像我正在做的那样)?
当您将 spark.serializer
设置为 org.apache.spark.serializer.KryoSerializer
时,RDD 中的所有对象(它不包括闭包*)都使用 Kryo 进行序列化。 Class 注册只是提高性能的一种方式(注册 classes 只需要一个整数 id 而不是完全限定的 class 名称与序列化对象一起存储)。您可以查看 Kryo 文档的 relevant section 了解详细信息。
换句话说,如果您关心性能,您应该注册所有必须在您的程序中序列化的 classes,但无论如何您已经在使用 Kryo。
* 闭包使用标准 Java 序列化进行序列化,Kryo 中的注册不会影响这一点,因此如果要通过闭包传递某些对象,您仍然必须使用 java.io.Serializable
.