我的Spark应用程序从JDBC数据库中读取数据集,并通过转换对其进行设置,并将其持久化以用于分支计算。
该应用程序在具有3个执行程序的YARN群集上执行。我发现从数据库中创建了我的缓存数据集3次(在每个执行器上)。 Spark不使用缓存的RDD。
我想通过使用缓存来消除多余的读取。
我创建了一个Hello World示例来重现该问题:
object UseAnotherExecutorCache {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName(getClass.getSimpleName)
val sc = new SparkContext(conf)
val rddCached = sc.parallelize(Seq(1, 2, 3), numSlices = 1)
.map(number => {
println(s"====== Process number $number ======")
number * 2
})
.persist(StorageLevel.MEMORY_AND_DISK)
assert(rddCached.count == 3)
assert(rddCached.sum == 12)
}
}
提交命令:
spark-submit --master yarn --deploy-mode cluster --num-executors 2 .....
我在执行程序日志中看到并行执行和映射操作在两个执行程序上执行。我希望第二个执行程序将从第一个执行程序使用缓存的RDD。
我的期望正确吗? Spark是否与其他执行者共享缓存的RDD?