java - 在同一个 JVM 中运行多个 Spark 任务有什么好处?

标签 java scala performance apache-spark jvm

不同的来源(例如 12 )声称 Spark 可以受益于在同一个 JVM 中运行多个任务。但他们没有解释原因。

这些好处是什么?

最佳答案

如前所述,广播变量是一回事。

另一个是并发问题。看一下这段代码:

var counter = 0
var rdd = sc.parallelize(data)

rdd.foreach(x => counter += x)

println(counter)

结果可能会有所不同,具体取决于是在本地执行还是在部署在集群(具有不同 JVM)上的 Spark 上执行。在后一种情况下,parallelize 方法在执行器之间拆分计算。计算闭包(每个节点执行其任务所需的环境),这意味着每个执行者都会收到一份 counter。每个执行者都看到自己的变量副本,因此计算结果为 0,因为没有一个执行者引用了正确的对象。另一方面,在一个 JVM 中,counter 对每个 worker 都是可见的。

当然有一种方法可以避免这种情况 - 使用 Acumulators ( see here )。

最后但并非最不重要的一点是,当将 RDD 持久化在内存中时(默认 cache 方法存储级别为 MEMORY_ONLY),它将在单个内存中可见虚拟机。这也可以通过使用 OFF_HEAP 来克服(这在 2.4.0 中是实验性的)。更多 here .

关于java - 在同一个 JVM 中运行多个 Spark 任务有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47641025/

相关文章:

eclipse - scala eclipse IDE 够稳定吗?

c# - C#高效的日志备份程序

mysql - 在这种情况下我应该使用面向对象的方法来设计数据库表吗

java - 获取表数据并保存到数据库 - SQLEXception 一般错误

scala - 如何使用IntelliJ Idea创建SBT项目?

java - 无法从 <util :properties> 获取 spring context.getBean()

scala - 如果编译时所有类型都被删除,Scala 如何进行类型匹配?

javascript - 使用 JS Date 对象以毫秒为单位获取当前时间的最快最轻的方法

java - 是否可以使用 php 或 java 获取硬盘大小?

java - 将 XSL 样式表嵌入 XML