如下图所示:
我的Spark工作有三个阶段:
0. groupBy
1. repartition
2. collect
第0阶段和第1阶段非常轻量级,但第2阶段非常占用CPU。
是否可以针对一个Spark作业的不同阶段进行不同的配置?
我想过将这个Spark作业分成两个子作业,但是这就违背了使用Spark的目的,它将所有中间结果存储在内存中。这也将大大延长我们的工作时间。
有什么想法吗?
答案 0 :(得分:1)
不,它无法在运行时更改火花配置。请参阅SparkConf
的{{3}}:
请注意,一旦SparkConf对象传递给Spark,它就会被克隆,用户不能再修改它。 Spark不支持在运行时修改配置。
但是,如果中间没有其他操作,我猜您不需要在repartition
之前执行collect
。 repartition
将在节点上移动数据,如果您想要将collect
它们放到驱动程序节点上,那么这是不必要的。
答案 1 :(得分:0)
我赞同Shaido的观点。但是希望在这里包含Spark 2.x带有一些称为动态资源分配的东西。
https://spark.apache.org/docs/latest/job-scheduling.html#dynamic-resource-allocation
在较高的层面上,Spark应该在执行者不再使用时放弃执行者,并在需要时获得执行者。
这意味着应用程序可以动态更改值,而不是使用spark.executor.instances
spark.executor.instances与spark.dynamicAllocation.enabled不兼容。如果同时指定了spark.dynamicAllocation.enabled和spark.executor.instances,则动态分配将关闭,并使用指定数量的spark.executor.instances。