如何设置 Spark 执行器的数量?
Posted
技术标签:
【中文标题】如何设置 Spark 执行器的数量?【英文标题】:How to set amount of Spark executors? 【发布时间】:2014-11-27 21:08:23 【问题描述】:如何从 Java(或 Scala)代码中配置具有 SparkConfig
和 SparkContext
的执行程序数量?我经常看到 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结构化流媒体应用程序中优化执行程序实例的数量?