Serialization 升级到Spark 2.0时出现Kryo注册问题
我正在将一个应用程序从Spark 1.6.2升级到Spark 2.0.2。这个问题与火花没有严格的关系。Spark 1.6.2包括Kryo 2.21。Spark 2.0.2包括Kryo 3.0.3 应用程序在HDFS上存储一些用Kryo序列化的数据。为了节省空间,Kryo注册被强制执行。当一个类向Kryo注册时,它会获得一个顺序ID,该ID用于以wire格式表示该类,而不是完整的类名。当我们注册一个新类时,我们总是把它放在末尾,所以它会得到一个未使用的ID。我们也从不从注册中删除一个类。(如果一个类被删除,我们在它的位置注册一个占位符来保留ID。)这样,ID是稳定的,一个版本的应用程序可以读取以前版本编写的数据 事实证明,Kryo使用相同的注册机制在其构造函数中注册基本类。在Kryo2.21中,它注册了9个基本类,因此第一个用户注册的类获得ID 9。但是Kryo2.22和更高版本注册了10个基本类。()这意味着用户注册的类从ID 10开始 升级到Spark 2.0.2后,我们如何继续加载旧数据Serialization 升级到Spark 2.0时出现Kryo注册问题,serialization,apache-spark,kryo,Serialization,Apache Spark,Kryo,我正在将一个应用程序从Spark 1.6.2升级到Spark 2.0.2。这个问题与火花没有严格的关系。Spark 1.6.2包括Kryo 2.21。Spark 2.0.2包括Kryo 3.0.3 应用程序在HDFS上存储一些用Kryo序列化的数据。为了节省空间,Kryo注册被强制执行。当一个类向Kryo注册时,它会获得一个顺序ID,该ID用于以wire格式表示该类,而不是完整的类名。当我们注册一个新类时,我们总是把它放在末尾,所以它会得到一个未使用的ID。我们也从不从注册中删除一个类。(如果一
(如果我们的第一个用户注册的类是一个不推荐使用的类,那就太好了。但它不是。它是
scala.Tuple2[\uu,\u]
)实际上有一个Kryo.register(class type,int id)
方法,可以用来显式地指定一个id。id
参数的注释说明:
id:必须大于等于0。更小的ID序列化效率更高。默认情况下,ID0-8用于基本类型和String
,但这些IDs可以重新调整用途
注释是错误的,因为2.22:ID9现在也默认使用。但事实上,它可以重新调整用途
kryo.register(classOf[Tuple2[_, _]], 9)
正常的顺序注册适用于其余的类。显式ID只对第一个类是必需的。Kryo怎么能从2.21更改为2.22?雪上加霜的是,他们的变更日志将每个版本的序列化兼容性都列为“是”。但是变更日志从2.22开始。好的,解决方法还不错。我觉得我在那里太戏剧化了。