小编Pav*_*nov的帖子

了解Spark的闭包及其序列化

免责声明:刚开始玩Spark.

我很难理解着名的"任务不可序列化"的例外,但我的问题与我在SO上看到的有点不同(或者我认为).

我有一个很小的自定义RDD(TestRDD).它有一个字段,用于存储其类未实现Serializable(NonSerializable)的对象.我已经设置了"spark.serializer"配置选项来使用Kryo.但是,当我尝试count()使用RDD时,我得到以下信息:

Caused by: java.io.NotSerializableException: com.complexible.spark.NonSerializable
Serialization stack:
- object not serializable (class: com.test.spark.NonSerializable, value: com.test.spark.NonSerializable@2901e052)
- field (class: com.test.spark.TestRDD, name: mNS, type: class com.test.spark.NonSerializable)
- object (class com.test.spark.TestRDD, TestRDD[1] at RDD at TestRDD.java:28)
- field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
- object (class scala.Tuple2, (TestRDD[1] at RDD at TestRDD.java:28,<function2>))
at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:46)
at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:100)
at org.apache.spark.scheduler.DAGScheduler.submitMissingTasks(DAGScheduler.scala:1009)
at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$submitStage(DAGScheduler.scala:933)
Run Code Online (Sandbox Code Playgroud)

当我查看内部时,DAGScheduler.submitMissingTasks我发现它在我的RDD上使用了闭包序列化程序,这是Java序列化程序,而不是我期望的Kryo序列化程序.我已经读过Kryo有序列化闭包的问题,​​而Spark总是使用Java序列化程序进行闭包,但我不太明白闭包是如何发挥作用的.我在这里所做的就是:

SparkConf conf = new SparkConf()
                         .setAppName("ScanTest") …
Run Code Online (Sandbox Code Playgroud)

java serialization closures apache-spark

17
推荐指数
1
解决办法
3710
查看次数

标签 统计

apache-spark ×1

closures ×1

java ×1

serialization ×1