我不认为其他答案是完全正确的 . RDDs are indeed serializable,所以这不是导致任务失败的原因 .

Spark是一个分布式计算引擎,它的主要抽象是一个弹性分布式数据集( RDD ),可以看作是一个分布式集合 . 基本上,RDD的元素在集群的节点之间进行分区,但Spark将其从用户抽象出来,让用户与RDD(集合)进行交互,就好像它是本地的一样 .

不要涉及太多细节,但是当你在RDD( map , flatMap , filter 和其他)上运行不同的转换时,你的转换代码(闭包)是:

在驱动程序节点上序列化,

发送到集群中的相应节点,

反序列化,

并最终在节点上执行

您当然可以在本地运行(如您的示例所示),但所有这些阶段(除了通过网络传输)仍然会发生 . [这使您可以在部署到 生产环境 之前捕获任何错误]

在第二种情况下会发生的情况是,您正在调用一个方法,该方法在map函数内部的 testing 类中定义 . Spark看到了这一点,并且由于方法无法自行序列化,因此Spark会尝试序列化整个 testing 类,以便代码在另一个JVM中执行时仍然可以工作 . 你有两种可能性:

要么使类测试可序列化,所以Spark可以序列化整个类:

import org.apache.spark.{SparkContext,SparkConf}

object Spark {

val ctx = new SparkContext(new SparkConf().setAppName("test").setMaster("local[*]"))

}

object NOTworking extends App {

new Test().doIT

}

class Test extends java.io.Serializable {

val rddList = Spark.ctx.parallelize(List(1,2,3))

def doIT() = {

val after = rddList.map(someFunc)

after.collect().foreach(println)

}

def someFunc(a: Int) = a + 1

}

或者您使用 someFunc 函数而不是方法(函数是Scala中的对象),以便Spark能够序列化它:

import org.apache.spark.{SparkContext,SparkConf}

object Spark {

val ctx = new SparkContext(new SparkConf().setAppName("test").setMaster("local[*]"))

}

object NOTworking extends App {

new Test().doIT

}

class Test {

val rddList = Spark.ctx.parallelize(List(1,2,3))

def doIT() = {

val after = rddList.map(someFunc)

after.collect().foreach(println)

}

val someFunc = (a: Int) => a + 1

}

作为旁注,您可以将 rddList.map(someFunc(_)) 重写为 rddList.map(someFunc) ,它们完全相同 . 通常,第二种是优选的,因为它不那么冗长和清晰 .

编辑(2015-03-15):SPARK-5307介绍 SerializationDebugger 和Spark 1.3.0是第一个使用它的版本 . 它添加了NotSerializableException的序列化路径 . 遇到NotSerializableException时,调试器访问对象图以查找无法序列化的对象的路径,并构造信息以帮助用户查找对象 .

在OP的情况下,这是打印到stdout的内容:

Serialization stack:

- object not serializable (class: testing, value: testing@2dfe2f00)

- field (class: testing$$anonfun$1, name: $outer, type: class testing)

- object (class testing$$anonfun$1, )

java调用闭包对象_任务不可序列化:java.io.NotSerializableException仅在类而不是对象上调用闭包外的函数时...相关推荐

  1. js 序列化内置对象_内置序列化技术

    js 序列化内置对象 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指 ...

  2. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组

    本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...

  3. javaweb调用python算法_请教怎么用java远程调用python? 多谢

    请问如何用java远程调用python? 谢谢! 本帖最后由 blackkettle 于 2015-05-07 13:00:41 编辑 比如有一台机器 A上安装了python, 另一台机器B要用jav ...

  4. java序列化和反序列化对象_java中的序列化与反序列化,还包括将多个对象序列化到一个文件中...

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...

  5. java 调用其他构造函数_我如何在Java中调用另一个构造函数?

    是的,这是可能的: public class Foo { private int x; public Foo() { this(1); } public Foo(int x) { this.x = x ...

  6. java 找出调用的方法_如何找到用Java调用给定方法的所有方法?

    小编典典 为了分析字节码,我建议使用ASM.给定要分析的类列表,可以使访问者找到您感兴趣的方法调用.下面是一个分析jar文件中类的实现. 请注意,ASM使用带有'/'而不是'.的internalNam ...

  7. java json 嵌套解析_我们如何解析Java中的嵌套JSON对象?

    该JSON是一种轻量级的,基于文本和语言无关的数据交换格式.JSON可以表示两种结构化类型,如对象和数组.甲JSONArray可以从一个字符串解析文本以产生向量样的对象.我们可以使用JSONArray ...

  8. java list e 查找_源码(04) -- java.util.ListE

    java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...

  9. java 基础 笔试题_非常全面的java基础笔试题

    1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...

  10. 李兴华java视频在线观看_李兴华Java开发实战经典视频教程_IT教程网

    资源名称:李兴华Java开发实战经典视频教程 资源目录: [IT教程网]010201_[第2章:简单Java程序]_简单Java程序 [IT教程网]010301_[第3章:Java基础程序设计]_Ja ...

最新文章

  1. 范道馨晟宾馆还不错!
  2. Android推送进阶课程学习笔记
  3. A-Frame.js 学习文档翻译(一)实体
  4. php在函数内使用全局变量
  5. jsp 记录1 bs/cs
  6. 英文单词 hard
  7. 发布CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008)和架构实例源码Demo
  8. mysql sql优化
  9. 机器学习实战——AdaBoost
  10. ESFramework介绍之(28)―― Udp组件
  11. eclipse搭建springmvc
  12. TZOJ 数据结构期末历年题目
  13. 创建属于自己的OneNote插件
  14. 电信移动中兴B860AV2.1-1.1T-1.2系列晶晨S905L芯片-刷机固件包
  15. 程序员如何告别肩颈疲劳
  16. 基于遥感影像的变化检测数据集
  17. BI神器Power Query(4)-- PQ导入动态名称定义的表格
  18. element-ui 回到顶部组件el-backtop
  19. 7种抓包工具详细介绍
  20. 毕业设计-基于 MATLAB 的车牌识别系统设计

热门文章

  1. 精华阅读第 13 期 |常见的八种导致 APP 内存泄漏的问题
  2. Jstack查看耗CPU的线程
  3. Windows2008R2的NFS
  4. 推荐8个很酷很有用的 HTML5 应用程序
  5. procedures
  6. MySQL查询语句格式总结
  7. Aspose.Excel模板输出中名称管理器的使用
  8. raid及mdadm命令之一(含shell显示字体颜色等)
  9. keras小程序(一),用cnn做分类
  10. Form 表单提交参数