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

文章讨论了Java类中的静态成员在Spark中的行为,指出Scala的object相当于是Java的静态成员。当在Spark中使用时,由于singleton对象不会被传递给executor,而是在首次访问时在executor本地初始化,导致在executor上看到的是每次都重新创建的实例。

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

public class JavaClass0 implements Serializable {
	private static String name;

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

然后在spark中使用的时候:

//driver端
JavaClass0.getName("张三")//得到张三
JavaClass0.getName("李四")//得到张三

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

原因:
scala的object对应的就是java的静态成员,可以反过来理解java的所有静态成员可被抽取成伴生对象(虽然现实中是scala最终编译成java)。以上面的JavaClass0 例子可理解为等价的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作用及用法详解

### 配置 IntelliJ IDEA 的 Scala 和 Apache Spark 开发环境 #### 1. 安装 IntelliJ IDEA 首先,下载并安装 **IntelliJ IDEA**。推荐使用最新版本(如 IntelliJ IDEA 2024.3)以获得更好的兼容性和功能支持[^3]。 #### 2. 安装 Scala 插件 打开 IntelliJ IDEA,进入 **Settings (File -> Settings)**,选择 **Plugins**。在搜索栏中输入 "Scala",然后点击右侧的 **Install** 按钮进行在线安装。如果网络受限,也可以通过本地插件包手动安装[^2]。 #### 3. 安装 JDK 确保系统已安装 **Java Development Kit (JDK)**。如果没有安装,可以在 C 盘新建一个名为 `java` 的文件夹,并将 JDK 安装到该目录。安装完成后,配置 JDK 环境变量,以便系统能够正确识别 Java 运行环境[^3]。 #### 4. 下载并安装 Scala SDK 访问 [Scala 官方网站](https://www.scala-lang.org/download/all.html),根据操作系统选择合适的版本进行下载并安装。对于 Windows 用户,可以直接运行安装程序,按照提示完成安装步骤[^2]。 #### 5. 创建 Scala 工程 在 IntelliJ IDEA 中创建一个新的 **Scala 工程**。选择 **Maven** 作为项目型,并指定 Scala SDK 路径。如果是第一次创建工程,SDK 可能尚未存在,可以通过在线下载或手动选择已安装的 Scala SDK 来完成配置。 ##### 示例代码 创建一个简单的 Scala 程序来测试开发环境是否正常工作: ```scala object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") // 输出 Hello World } } ``` #### 6. 添加 Spark 依赖项 打开项目的 `build.sbt` 文件,添加以下 **Spark 依赖项**。确保使用的 Scala 版本与 Spark 兼容(例如 Scala 2.11.12 和 Spark 2.3.4)[^1]。 ```sbt name := "LzScalaSparkTest" version := "0.1" scalaVersion := "2.11.12" // public version configuration val sparkVersion = "2.3.4" // https://mvnrepository.com/artifact/org.apache.spark // spark dependencies libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % sparkVersion, "org.apache.spark" %% "spark-sql" % sparkVersion ) ``` #### 7. 同步项目 保存 `build.sbt` 文件后,IntelliJ IDEA 会自动提示同步项目。点击同步按钮,等待依赖项下载和构建完成。这一步可能会需要一些时间,具体取决于网络速度和项目规模。 #### 8. 编写并运行 Spark 程序 创建一个新的 Scala ,并编写一个简单的 Spark 程序来验证环境配置是否成功。例如: ```scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext object SparkWordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Word Count") val sc = new SparkContext(conf) val textFile = sc.textFile("input.txt") // 输入文件路径 val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("output") // 输出文件路径 sc.stop() } } ``` #### 9. 测试环境 准备一个简单的文本文件 `input.txt`,内容如下: ``` hello world hello scala hello spark ``` 运行上述 Spark 程序,检查输出目录 `output` 是否生成了正确的结果。如果一切正常,说明 IntelliJ IDEA 的 ScalaSpark 开发环境已经成功搭建。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值