Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Java Spark上的任务不可序列化_Java_Scala_Serialization - Fatal编程技术网

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序列化?