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