Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 升级到Spark 2.0时出现Kryo注册问题_Serialization_Apache Spark_Kryo - Fatal编程技术网

Serialization 升级到Spark 2.0时出现Kryo注册问题

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。我们也从不从注册中删除一个类。(如果一

我正在将一个应用程序从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后,我们如何继续加载旧数据


(如果我们的第一个用户注册的类是一个不推荐使用的类,那就太好了。但它不是。它是
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开始。好的,解决方法还不错。我觉得我在那里太戏剧化了。