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

相关推荐
大数据CLUB3 小时前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
hdsoft_huge3 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
雨白4 小时前
Java 多线程指南:从基础用法到线程安全
android·java
Hungry_Shark4 小时前
IDEA版本控制管理之使用Gitee
java·gitee·intellij-idea
赛姐在努力.4 小时前
《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
java·intellij-idea
猎板PCB黄浩4 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造
ZzzK,4 小时前
JAVA虚拟机(JVM)
java·linux·jvm
西红柿维生素4 小时前
JVM相关总结
java·jvm·算法
计算机编程小央姐4 小时前
跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
大数据·hadoop·信息可视化·spark·django·课程设计·食物
coderxiaohan5 小时前
【C++】类和对象1
java·开发语言·c++