当前位置: 首页 > 知识库问答 >
问题:

火花Scala编程为不可序列化的对象和功能

姜嘉良
2023-03-14

当我运行Spark Scala程序时,有一个“Task not serializable”异常

  • Spark RDD是不可串行化类型(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的对象。

你能帮我吗?我如何处理不可序列化的类?

共有2个答案

沈枫涟
2023-03-14

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

如果您从代码中调用任何类的方法;Spark将需要序列化包含该方法的整个类。绕过的方法可以是以下任何一种

上官恩
2023-03-14

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

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

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

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

 类似资料:
  • 有没有关于为什么整个对象B需要序列化的想法? 关于“对象不可序列化”的异常:

  • 首先,我使用的是scala 2.10.4,上面的例子是在Spark 1.6中运行的(尽管我怀疑Spark与此有关,但这只是一个序列化问题)。 所以我的问题是:假设我有一个trait,它由两个类实现,比如说和。现在,我有一个泛型特征,它由一组类扩展,其中一个类位于的子类型之上,例如(这里我保留了Spark对RDD的概念,但一旦序列化,它实际上可能是另一个类;不管实际情况如何,它都只是一个结果): 现

  • 我的spark任务是在运行时抛出不可序列化的任务。谁能告诉我我做错了什么吗? 以下是stacktrace:

  • 我正在遵循scala对象序列化的基本示例。但是,当运行下面的单元测试时 我有个例外: org.scalatest.assertions$assertionshelper java.io.NotSerializableException:在java.io.ObjectOutputStream.WriteObject0(ObjectOutputStream.java:1184)在java.io.Obj

  • 将现有应用程序从Spark 1.6移动到Spark 2.2*(最终)会导致错误“org.apache.spark.SparkExctive:任务不可序列化”。我过于简化了我的代码,以演示同样的错误。代码查询拼花文件以返回以下数据类型:“org.apache.spark.sql.数据集[org.apache.spark.sql.行]”我应用一个函数来提取字符串和整数,返回字符串。一个固有的问题与Sp

  • 我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,