Java Spark上的任务不可序列化
我有一个这样的转变:Java Spark上的任务不可序列化,java,scala,serialization,Java,Scala,Serialization,我有一个这样的转变: JavaRDD<Tuple2<String, Long>> mappedRdd = myRDD.values().map( new Function<Pageview, Tuple2<String, Long>>() { @Override public Tuple2<String, Long> call(Pageview pageview) throws Exception {
JavaRDD<Tuple2<String, Long>> mappedRdd = myRDD.values().map(
new Function<Pageview, Tuple2<String, Long>>() {
@Override
public Tuple2<String, Long> call(Pageview pageview) throws Exception {
String key = pageview.getUrl().toString();
Long value = getDay(pageview.getTimestamp());
return new Tuple2<>(key, value);
}
});
Class[] c = new Class[1];
c[0] = Pageview.class;
sparkConf.registerKryoClasses(c);
线程“main”org.apache.spark.SparkException中的异常:任务未完成
可序列化于
org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:166)
在
org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:158)
位于org.apache.spark.SparkContext.clean(SparkContext.scala:1623)
org.apache.spark.rdd.rdd.map(rdd.scala:286)位于
org.apache.spark.api.java.JavaRDDLike$class.map(JavaRDDLike.scala:89)
在
org.apache.spark.api.java.AbstractJavaRDDLike.map(JavaRDDLike.scala:46)
在
org.apache.gora.tutorial.log.ExampleSpark.run(ExampleSpark.java:100)
在
org.apache.gora.tutorial.log.ExampleSpark.main(ExampleSpark.java:53)
原因:java.io.NotSerializableException:
org.apache.gora.tutorial.log.ExampleSpark序列化堆栈:
-对象不可序列化(类:org.apache.gora.tutorial.log.ExampleSpark,值:
org.apache.gora.tutorial.log。ExampleSpark@1a2b4497)
-字段(类:org.apache.gora.tutorial.log.ExampleSpark$1,名称:this$0,类型:class org.apache.gora.tutorial.log.ExampleSpark)
-对象(类org.apache.gora.tutorial.log.ExampleSpark$1,org.apache.gora.tutorial.log.ExampleSpark$1@4ab2775d)
-字段(类:org.apache.spark.api.java.javapairdd$$anonfun$toscala函数$1,
名称:fun$1,类型:interface
org.apache.spark.api.java.function.function)
-对象(类org.apache.spark.api.java.javapairdd$$anonfun$toscala函数$1,
)在
org.apache.spark.serializer.SerializationDebugger$.ImproveeException(SerializationDebugger.scala:38)
在
org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)
在
org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:80)
在
org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:164)
... 还有7个
调试代码时,我看到调用了JavaSerializer.scala
,即使有一个名为KryoSerializer
的类
ps1:我不想使用Java序列化程序,但在Pageview
实现Serializer
并不能解决问题
PS 2:这并不能解决问题:
...
//String key = pageview.getUrl().toString();
//Long value = getDay(pageview.getTimestamp());
String key = "Dummy";
Long value = 1L;
return new Tuple2<>(key, value);
...
。。。
//String key=pageview.getUrl().toString();
//Long value=getDay(pageview.getTimestamp());
String key=“Dummy”;
长值=1L;
返回新的Tuple2(键,值);
...
我在Java代码中多次遇到这个问题。虽然我使用的是Java序列化,但我会使包含该代码的类可序列化,或者如果您不想这样做,我会使该函数成为该类的静态成员
下面是一个解决方案的代码片段
public class Test {
private static Function s = new Function<Pageview, Tuple2<String, Long>>() {
@Override
public Tuple2<String, Long> call(Pageview pageview) throws Exception {
String key = pageview.getUrl().toString();
Long value = getDay(pageview.getTimestamp());
return new Tuple2<>(key, value);
}
};
}
公共类测试{
私有静态函数s=新函数(){
@凌驾
公共元组2调用(Pageview Pageview)引发异常{
String key=pageview.getUrl().toString();
Long value=getDay(pageview.getTimestamp());
返回新的Tuple2(键,值);
}
};
}
类位于外部包中(不是内部类)。你能解释一下把函数作为静态成员是什么意思吗?@kamaci更新了代码片段。在工作中,我们通常会执行上述操作,或者使返回函数实例的方法成为静态的。另外,我提到的类是包含代码片段的类,而不是Pageview类。它可以工作!在这个版本中是否使用Kryo序列化?还有,什么改变了,它开始工作了?@kamaci正在阅读另一篇关于Java序列化的文章。您更改为静态的函数对象将不会被序列化,这就是它工作的原因。在类(如Pageview)上使用Kryo序列化应该很好。您的问题是无法序列化函数对象。我想这会解决你的问题,因为我已经遇到过无数次了。所以,使用Kyro序列化似乎是更方便的处理方法。我接受你的回答。另一方面,如何使我的类Kyro序列化?