对 spark 使用 kryo 序列化的问题
Issue on using kryo serialization for spark
我正在改造现有的包使其在spark上运行,为了在第三方工具中序列化class,我使用了以下代码:
SparkConf conf = new SparkConf().setAppName("my.app.spark").setMaster("local").set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").set("spark.kryo.registrationRequired", "true");
try {
conf.registerKryoClasses(new Class<?>[]{
Class.forName("my.thirdparty.classes"),
Class.forName("my.thirdparty.classes2")
});
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JavaSparkContext context = new JavaSparkContext(conf);
List<File> txtFiles = new ArrayList<File>();
for(File file: input.listFiles(filter)) {
txtFiles.add(file);
}
JavaRDD<File> distText = context.parallelize(txtFiles);
distText.foreach(
new VoidFunction<File>()
{ public void call(File file) {
processFile(file);
}});
context.close();
当我使用以下命令提交时:
spark-submit --class "mypackage.RunWithSpark" --master yarn --driver-memory 6g mypackage.jar
我收到如下错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.SparkConf.registerKryoClasses([Ljava/lang/Class;)Lorg/apache/spark/SparkConf;
...
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:292)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
我是 Spark 的新手,你能帮忙吗?
谢谢
Spark 1.2.0 新增方法org.apache.spark.SparkConf.registerKryoClasses
。您的集群仅运行 Spark 1.0.0,因此出现错误。
您应该将集群升级到 1.6.1,或者在您的程序中切换到 Spark 1.0.0 并使用版本 1.0.0 API 注册 Kryo 类。规则始终是 link 您的程序使用与集群相同版本的 Spark,否则您会遇到各种问题。
我正在改造现有的包使其在spark上运行,为了在第三方工具中序列化class,我使用了以下代码:
SparkConf conf = new SparkConf().setAppName("my.app.spark").setMaster("local").set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").set("spark.kryo.registrationRequired", "true");
try {
conf.registerKryoClasses(new Class<?>[]{
Class.forName("my.thirdparty.classes"),
Class.forName("my.thirdparty.classes2")
});
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JavaSparkContext context = new JavaSparkContext(conf);
List<File> txtFiles = new ArrayList<File>();
for(File file: input.listFiles(filter)) {
txtFiles.add(file);
}
JavaRDD<File> distText = context.parallelize(txtFiles);
distText.foreach(
new VoidFunction<File>()
{ public void call(File file) {
processFile(file);
}});
context.close();
当我使用以下命令提交时: spark-submit --class "mypackage.RunWithSpark" --master yarn --driver-memory 6g mypackage.jar
我收到如下错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.SparkConf.registerKryoClasses([Ljava/lang/Class;)Lorg/apache/spark/SparkConf;
...
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:292)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
我是 Spark 的新手,你能帮忙吗?
谢谢
Spark 1.2.0 新增方法org.apache.spark.SparkConf.registerKryoClasses
。您的集群仅运行 Spark 1.0.0,因此出现错误。
您应该将集群升级到 1.6.1,或者在您的程序中切换到 Spark 1.0.0 并使用版本 1.0.0 API 注册 Kryo 类。规则始终是 link 您的程序使用与集群相同版本的 Spark,否则您会遇到各种问题。