java调用闭包对象_任务不可序列化:java.io.NotSerializableException仅在类而不是对象上调用闭包外的函数时...
我不认为其他答案是完全正确的 . 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仅在类而不是对象上调用闭包外的函数时...相关推荐
- js 序列化内置对象_内置序列化技术
js 序列化内置对象 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指 ...
- yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...
- javaweb调用python算法_请教怎么用java远程调用python? 多谢
请问如何用java远程调用python? 谢谢! 本帖最后由 blackkettle 于 2015-05-07 13:00:41 编辑 比如有一台机器 A上安装了python, 另一台机器B要用jav ...
- java序列化和反序列化对象_java中的序列化与反序列化,还包括将多个对象序列化到一个文件中...
package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...
- java 调用其他构造函数_我如何在Java中调用另一个构造函数?
是的,这是可能的: public class Foo { private int x; public Foo() { this(1); } public Foo(int x) { this.x = x ...
- java 找出调用的方法_如何找到用Java调用给定方法的所有方法?
小编典典 为了分析字节码,我建议使用ASM.给定要分析的类列表,可以使访问者找到您感兴趣的方法调用.下面是一个分析jar文件中类的实现. 请注意,ASM使用带有'/'而不是'.的internalNam ...
- java json 嵌套解析_我们如何解析Java中的嵌套JSON对象?
该JSON是一种轻量级的,基于文本和语言无关的数据交换格式.JSON可以表示两种结构化类型,如对象和数组.甲JSONArray可以从一个字符串解析文本以产生向量样的对象.我们可以使用JSONArray ...
- java list e 查找_源码(04) -- java.util.ListE
java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...
- java 基础 笔试题_非常全面的java基础笔试题
1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...
- 李兴华java视频在线观看_李兴华Java开发实战经典视频教程_IT教程网
资源名称:李兴华Java开发实战经典视频教程 资源目录: [IT教程网]010201_[第2章:简单Java程序]_简单Java程序 [IT教程网]010301_[第3章:Java基础程序设计]_Ja ...
最新文章
- 范道馨晟宾馆还不错!
- Android推送进阶课程学习笔记
- A-Frame.js 学习文档翻译(一)实体
- php在函数内使用全局变量
- jsp 记录1 bs/cs
- 英文单词 hard
- 发布CodeBuild.Net代码自动生成器 V2008 2.01(Vs2008)和架构实例源码Demo
- mysql sql优化
- 机器学习实战——AdaBoost
- ESFramework介绍之(28)―― Udp组件
- eclipse搭建springmvc
- TZOJ 数据结构期末历年题目
- 创建属于自己的OneNote插件
- 电信移动中兴B860AV2.1-1.1T-1.2系列晶晨S905L芯片-刷机固件包
- 程序员如何告别肩颈疲劳
- 基于遥感影像的变化检测数据集
- BI神器Power Query(4)-- PQ导入动态名称定义的表格
- element-ui 回到顶部组件el-backtop
- 7种抓包工具详细介绍
- 毕业设计-基于 MATLAB 的车牌识别系统设计