我们如何针对Spark作业的不同阶段优化CPU /核心/执行程序?

时间:2017-09-14 01:14:43

标签: performance apache-spark distributed-computing

如下图所示:

enter image description here

我的Spark工作有三个阶段:

0. groupBy
1. repartition
2. collect

第0阶段和第1阶段非常轻量级,但第2阶段非常占用CPU。

是否可以针对一个Spark作业的不同阶段进行不同的配置?

我想过将这个Spark作业分成两个子作业,但是这就违背了使用Spark的目的,它将所有中间结果存储在内存中。这也将大大延长我们的工作时间。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

不,它无法在运行时更改火花配置。请参阅SparkConf的{​​{3}}:

  

请注意,一旦SparkConf对象传递给Spark,它就会被克隆,用户不能再修改它。 Spark不支持在运行时修改配置。

但是,如果中间没有其他操作,我猜您不需要在repartition之前执行collectrepartition将在节点上移动数据,如果您想要将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。