如何设置 Spark 执行器的数量?

Posted

技术标签:

【中文标题】如何设置 Spark 执行器的数量?【英文标题】:How to set amount of Spark executors? 【发布时间】:2014-11-27 21:08:23 【问题描述】:

如何从 Java(或 Scala)代码中配置具有 SparkConfigSparkContext 的执行程序数量?我经常看到 2 个执行者。看起来spark.default.parallelism 不起作用并且是关于不同的东西。

我只需要将执行器的数量设置为等于集群大小,但始终只有 2 个。我知道我的集群大小。如果这很重要,我会在 YARN 上运行。

【问题讨论】:

【参考方案1】:

好的,知道了。 executors 的数量实际上并不是 Spark 属性本身,而是用于在 YARN 上放置作业的驱动程序。因此,当我使用 SparkSubmit 类作为驱动程序时,它具有适当的 --num-executors 参数,这正是我所需要的。

更新:

对于某些工作,我不再遵循SparkSubmit 方法。我不能主要针对 Spark 作业只是应用程序组件之一(甚至是可选的)的应用程序。对于这些情况,我使用附加到集群配置的spark-defaults.conf 和其中的spark.executor.instances 属性。这种方法更加通用,允许我根据集群(开发人员工作站、登台、生产)适当地平衡资源。

【讨论】:

属性spark.default.parallelism 用于join、reduceByKey、groupBy等reduce操作。【参考方案2】:

您也可以通过在 SparkConf 对象上设置参数“spark.executor.instances”和“spark.executor.cores”以编程方式完成。

例子:

SparkConf conf = new SparkConf()
      // 4 executor per instance of each worker 
      .set("spark.executor.instances", "4")
      // 5 cores on each executor
      .set("spark.executor.cores", "5");

第二个参数仅适用于 YARN 和独立模式。它允许应用程序在同一个 worker 上运行多个 executor,前提是该 worker 上有足够的核心。

【讨论】:

【参考方案3】:

在 Spark 2.0+ 版本中

使用 spark session 变量动态设置执行器的数量(从程序中)

spark.conf.set("spark.executor.instances", 4)
spark.conf.set("spark.executor.cores", 4)

在上述情况下,在任何给定时间最多将执行 16 个任务。

其他选项是执行器的动态分配,如下所示 -

spark.conf.set("spark.dynamicAllocation.enabled", "true")
spark.conf.set("spark.executor.cores", 4)
spark.conf.set("spark.dynamicAllocation.minExecutors","1")
spark.conf.set("spark.dynamicAllocation.maxExecutors","5")

这是您可以让 spark 根据运行作业的处理和内存要求来决定分配执行器的数量。

我觉得第二个选项比第一个选项效果更好,并且被广泛使用。

希望这会有所帮助。

【讨论】:

【参考方案4】:

在我的实验室中,我们在使用 hdfs 上的数据运行 Spark on Yarn 时遇到了类似的问题,但无论我尝试了上述哪种解决方案,我都无法将 Spark 执行器的数量增加到两个以上。

结果数据集太小(小于 128 MB 的 hdfs 块大小),并且由于 hadoop 的默认数据复制启发式算法,仅存在于两个数据节点(我的集群中的 1 个主节点,7 个数据节点)上。

一旦我和我的实验室伙伴有更多的文件(和更大的文件)并且数据分布在所有节点上,我们可以设置 Spark 执行器的数量,最后看到 --num-executors 和完成时间之间的反比关系.

希望这可以帮助处于类似情况的其他人。

【讨论】:

以上是关于如何设置 Spark 执行器的数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spark结构化流媒体应用程序中优化执行程序实例的数量?

Spark 与执行者和核心数量的关系

如何使火花同时运行作业中的所有任务?

手动指定火花执行器的数量

Spark:如何指定持有 RDD 的 executor 数量?

Spark 独立数量执行器/核心控制