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

相关推荐
R-sz2 分钟前
UE5.4 打包报错 error C4668 C4067
java·前端·ue5
zhengxianyi5152 分钟前
ruo-vue-pro 启用任务调度模块并新增一个job
java·vue.js·spring boot
Nuopiane4 分钟前
Pal3.Unity开源项目复刻(八)其余
java·服务器·前端
计算机徐师兄13 分钟前
Java基于微信小程序的社区垃圾回收管理系统【附源码、文档说明】
java·微信小程序·社区垃圾回收管理系统·社区垃圾回收管理系统小程序·社区垃圾回收管理微信小程序·社区垃圾回收管理小程序·jav社区垃圾回收管理小程序
zhouping@15 分钟前
Java学习笔记day04
java·笔记·学习
waper9715 分钟前
java项目部署上线,安全扫描问题的解决方案
java·安全·nacos·docker compose
怒放de生命201023 分钟前
IDEA 2025 最新版jrebel 破解
java·ide·intellij-idea
MegaDataFlowers43 分钟前
认识复杂度和简单排序算法
java·算法·排序算法
StackNoOverflow1 小时前
Maven 核心知识整理
java·maven
ekkcole1 小时前
easyexcel2.2.10版本对本地文件指定行或多行样式处理
java·easyexcel