Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 Scala编程_Java_Scala_Apache Spark_Rdd_Serializable - Fatal编程技术网

Java 不可序列化对象和函数的Spark Scala编程

Java 不可序列化对象和函数的Spark Scala编程,java,scala,apache-spark,rdd,serializable,Java,Scala,Apache Spark,Rdd,Serializable,当我使用运行Spark Scala程序时,出现“任务不可序列化”异常 Spark RDDs属于不可序列化类型(java类) 调用的函数来自不可序列化的类(同样是java类) 我的代码是这样的 object Main{ def main(args : Array(String){ ... var rdd = sc.textFile(filename) .map(line => new NotSerializabl

当我使用运行Spark Scala程序时,出现“任务不可序列化”异常

  • Spark RDDs属于不可序列化类型(java类)
  • 调用的函数来自不可序列化的类(同样是java类)
我的代码是这样的

object Main{
    def main(args : Array(String){
        ...
        var rdd = sc.textFile(filename)
                  .map(line => new NotSerializableJClass(line)).cache() 
        //rdd is RDD[NotSerializableJClass]
        ...
        var test = new NotSerializableJPredicate()
        rdd = rdd.filter(elem => test.test(elem))
        //throws TaskNotSerializable on test Predicate class
    }
}
我注意到我可以用

rdd = rdd.filter(elem => (new NotSerializableJPredicate()).test(elem))
但对于RDD中的对象类,我仍然得到了这个例外。我会以另一种方式,也会以另一种方式,来讨论第二部分,因为我不想创建大量的PredicateClass对象


你能帮我吗?如何继续使用非序列化类?

帮助我避免任务序列化问题的一些一般规则:

如果您正在从代码中调用任何类的方法;Spark需要序列化包含该方法的整个类。方法可以是以下任意一种: a> 在NotSerializableClass中将方法声明为函数变量;因此,与其写: def foo(x:Int)={blah blah}尝试使用val foo=(x:Int)=>{blah blah} 所以spark现在不再需要序列化整个类。 b> 在某些情况下,重构代码以提取单独类中的相关部分可能是一种方法。
c> 将类中作业实际上不需要的对象标记为@transient,并将类标记为可序列化的

RDD必须是可序列化的,因此不能创建不可序列化类的RDD

对于谓词,可以使用mapPartitions编写它

rdd.mapPartitions{
  part => 
    val test = new NotSerializableJPredicate()
    part.filter{elem => test.test(elem)}
   }

MapPartitions将在每个分区上运行一次,因此它允许您在executor上实例化不可序列化的类,但它只需要在每个分区上执行一次,而不是对每个记录执行一次。

NotSerializableClass
第三方类还是应用程序中定义的类?