Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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.io.NotSerializableException:org.apache.spark.SparkContext序列化堆栈:-对象不可序列化_Java_Apache Spark_Serialization - Fatal编程技术网

java.io.NotSerializableException:org.apache.spark.SparkContext序列化堆栈:-对象不可序列化

java.io.NotSerializableException:org.apache.spark.SparkContext序列化堆栈:-对象不可序列化,java,apache-spark,serialization,Java,Apache Spark,Serialization,该错误可在火花壳中重现。 基本上,我用一个方法定义一个类来生成RDD,然后对RDD执行一个映射操作,该操作会生成序列化错误 如果我没有这个方法,只有执行该方法步骤的语句,那么一切都正常 这里的代码可以在spark shell中运行,我定义了一个类,然后实例化了这个类 首先是进口 import java.nio.file.{Files} import java.io._ import org.apache.spark.SparkContext import org.apache.spark.rdd

该错误可在火花壳中重现。 基本上,我用一个方法定义一个类来生成RDD,然后对RDD执行一个映射操作,该操作会生成序列化错误

如果我没有这个方法,只有执行该方法步骤的语句,那么一切都正常

这里的代码可以在spark shell中运行,我定义了一个类,然后实例化了这个类

首先是进口

import java.nio.file.{Files}
import java.io._
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import scala.io.Source
import scala.collection.mutable.ArrayBuffer
下面是一个类,该类具有一个方法和一个映射,该映射具有匿名函数,用于计算字符串中的分隔符

class DataValidation(datasetPath: String, datasetName: String, separator:    
String, encoding: String, sc: SparkContext) extends Serializable {

// open file and load distribute... and try playing around with it...
// RDD data declaration, reading dataset on RDD without header

var dataset = datasetPath + "//" + datasetName + ".csv"

def textfile_encoding(datasetIn: String, encodingIn: String) : RDD[String] = {
var characters = ArrayBuffer[String]()
    for (line <- Source.fromFile(dataset, encoding).getLines()) {
         characters += line
    }
sc.parallelize(characters)

}
val rdd = this.textfile_encoding(dataset,encoding)
val separatorCount = rdd.map(_.count(_ == separator.charAt(0))) //error here
println("here")
}
我得到的错误是

Caused by: java.io.NotSerializableException: org.apache.spark.SparkContext
Serialization stack:
    - object not serializable (class: org.apache.spark.SparkContext, value: org.apache.spark.SparkContext@2aa98145)
    - field (class: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation, name: sc, type: class org.apache.spark.SparkContext)
    - object (class $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation, $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation@3d93cd9c)
    - field (class: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation$$anonfun$1, name: $outer, type: class $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation)
    - object (class $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation$$anonfun$1, <function1>)
    at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
    at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)
    at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:81)
    at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:312)
    ... 87 more
原因:java.io.notserializableeexception:org.apache.spark.SparkContext
序列化堆栈:
-对象不可序列化(类:org.apache.spark.SparkContext,值:org.apache.spark)。SparkContext@2aa98145)
-字段(类:$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation,名称:sc,类型:class org.apache.spark.SparkContext)
-对象(类$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$DataValidation,$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation@3d93cd9c)
-字段(类:$iwC$$iwC$$iwC$$iwC$$iwC$$DataValidation$$anonfun$1,名称:$outer,类型:类$iwC$$iwC$$iwC$$iwC$$DataValidation)
-对象(类$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$数据验证$$anonfun$1,)
位于org.apache.spark.serializer.SerializationDebugger$.ImproveeException(SerializationDebugger.scala:40)
位于org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)
位于org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:81)
位于org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:312)
... 87多
请注意以下行为

  • 如果我在类中更改一条语句,如下所示,则一切正常

    val-separatorCount=rdd.map(0.count(0==';'))

  • 如果我内联方法,即只执行方法中的语句,而没有方法,那么一切都可以正常工作


  • 我现在解决了这个问题

    因为我在映射函数中使用了分隔符,所以尝试对整个类进行序列化。但是,无法序列化方法U编码,从而导致错误

    所以,我将这个方法移动到一个单独的类中,并在外部实例化它,然后将它传递给这个类

    现在可以了

    当你遇到这个问题时,我认为有三种解决方案:-

  • 做我所做的。将方法移动到其他类
  • 编写自己的闭包/序列化。(还不知道怎么做)
  • 预先序列化有问题的方法(不知道如何)
  • 问候

    阿默尔

    Caused by: java.io.NotSerializableException: org.apache.spark.SparkContext
    Serialization stack:
        - object not serializable (class: org.apache.spark.SparkContext, value: org.apache.spark.SparkContext@2aa98145)
        - field (class: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation, name: sc, type: class org.apache.spark.SparkContext)
        - object (class $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation, $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation@3d93cd9c)
        - field (class: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation$$anonfun$1, name: $outer, type: class $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation)
        - object (class $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$DataValidation$$anonfun$1, <function1>)
        at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
        at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)
        at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:81)
        at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:312)
        ... 87 more