【spark】java类在spark中的传递,scala object在spark中的传递

记录一个比较典型的问题,先讲一下背景,有这么一个用java写的类

java 复制代码
public class JavaClass0 implements Serializable {
	private static String name;

    public static JavaClass0 getName(String str) {
        if (name == null) {
			name=str;
		}
        return name;
    }
    ...
}

然后在spark中使用的时候:

scala 复制代码
//driver端
JavaClass0.getName("张三")//得到张三
JavaClass0.getName("李四")//得到张三

df.foreachPartition{//executor端
	m=>
	JavaClass0.getName("王五")//得到王五
	JavaClass0.getName("钱六")//得到王五
}

原因:

scala的object对应的就是java的静态成员,可以反过来理解java的所有静态成员可被抽取成伴生对象(虽然现实中是scala最终编译成java)。以上面的JavaClass0 例子可理解为等价的scala代码为:

scala 复制代码
class JavaClass0 {
  ...
}

//伴生对象
object JavaClass0 {
	private var name:String = null
	 getName(str:String) {
        if (name == null) {
			name=str
		}
        return name;
    }
}

可以看到,JavaClass0并没有被传到executor中,而是重新初始化了一遍。事实也是如此。

Objects, as singletons, are never shipped to executors. There initialized locally, whenever objects is accessed for the first time.

object是不会被传递到executor的,他们在首次被访问的时候,在executor本地做初始化。只要executor的jvm不消亡,就不会再次初始化。

参考

Sharing objects in Spark
Spark Object (singleton) serialization on executors
Java中static作用及用法详解

相关推荐
1104.北光c°4 分钟前
【黑马点评项目笔记 | 优惠券秒杀篇】构建高并发秒杀系统
java·开发语言·数据库·redis·笔记·spring·nosql
ruleslol6 分钟前
普通流(Stream<T>)和原始类型特化流(IntStream, LongStream, DoubleStream)的区别
java
隐退山林6 分钟前
JavaEE初阶:文件操作和IO
java·java-ee
2501_907136827 分钟前
PDF增效工具 Quite imposing plus6
java·开发语言
Jaxson Lin11 分钟前
Java编程进阶:智能仿真无人机项目3.0
java·笔记·无人机
是阿楷啊12 分钟前
Java求职面试实录:互联网大厂场景技术点解析
java·redis·websocket·spring·互联网·大厂面试·支付系统
_周游21 分钟前
Java8 API文档搜索引擎_3.搜索模块(实现细节)
java·搜索引擎·intellij-idea
人道领域25 分钟前
SSM从入门到入土(Spring Bean实例化与依赖注入全解析)
java·开发语言·spring boot·后端
B站计算机毕业设计超人28 分钟前
计算机毕业设计hadoop+spark+hive共享单车预测系统 共享单车数据可视化分析 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·hadoop·python·深度学习·spark·毕业设计·课程设计
B站计算机毕业设计超人29 分钟前
计算机毕业设计Python+Spark+Hadoop+Hive微博舆情分析 微博情感分析可视化 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·hadoop·爬虫·python·spark·cnn·课程设计