【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作用及用法详解

相关推荐
你住过的屋檐3 分钟前
【Java】虚拟线程详解
java·开发语言
逍遥德5 分钟前
Maven教程.02-基础-pom.xml 使用标签大全
java·后端·maven·软件构建
甲枫叶25 分钟前
【claude热点资讯】Claude Code 更新:手机遥控电脑开发,Remote Control 功能上线
java·人工智能·智能手机·产品经理·ai编程
额,不知道写啥。30 分钟前
P5354 [Ynoi Easy Round 2017] 由乃的 OJ
java·开发语言·算法
让我上个超影吧39 分钟前
消息队列——RabbitMQ(高级)
java·rabbitmq
得物技术1 小时前
Sentinel Java客户端限流原理解析|得物技术
java·后端·架构
PM老周1 小时前
2026年软硬件一体化项目管理软件怎么选?多款工具对比测评
java·安全·硬件工程·团队开发·个人开发
一只大袋鼠1 小时前
并发编程(三):线程快照统计・grep+awk+sort+uniq 实战详解
java·开发语言·多线程·并发编程
unfeeling_2 小时前
Tomcat实验
java·tomcat
zxfBdd2 小时前
Error:scala: No ‘scala-library*.jar‘ in Scala compiler classpath in Scala SDK
大数据·scala·jar