[英]How to set amount of Spark executors?
我如何从 Java(或 Scala)代码中配置具有SparkConfig
和SparkContext
的执行SparkContext
? 我经常看到 2 个执行者。 看起来spark.default.parallelism
不起作用并且是关于不同的东西。
我只需要将执行程序的数量设置为等于集群大小,但始终只有 2 个。 我知道我的集群大小。 如果这很重要,我会在 YARN 上运行。
您还可以通过在 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 上有足够的内核。
好的,我知道了。 执行程序的数量实际上不是 Spark 属性本身,而是用于在 YARN 上放置作业的驱动程序。 因此,当我使用 SparkSubmit 类作为驱动程序时,它具有适当的--num-executors
参数,这正是我所需要的。
更新:
对于某些工作,我不再遵循SparkSubmit
方法。 我不能主要针对 Spark 作业只是应用程序组件之一(甚至是可选的)的应用程序执行此操作。 对于这些情况,我使用附加到集群配置的spark-defaults.conf
和其中的spark.executor.instances
属性。 这种方法更通用,允许我根据集群(开发人员工作站、登台、生产)适当地平衡资源。
在 Spark 2.0+ 版本中
使用 spark 会话变量动态设置执行程序的数量(从程序内)
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 根据运行作业的处理和内存要求来决定分配执行程序的数量。
我觉得第二个选项比第一个选项效果更好,并且被广泛使用。
希望这会有所帮助。
我们的实验室在 Yarn 上运行 Spark 并在 hdfs 上运行数据时遇到了类似的问题,但是无论我尝试了上述哪种解决方案,我都无法将 Spark 执行程序的数量增加到两个以上。
结果发现数据集太小(小于 128 MB 的 hdfs 块大小),并且由于 hadoop 的默认数据复制启发式,只存在于两个数据节点(我的集群中的 1 个主节点,7 个数据节点)上。
一旦我和我的实验室伙伴有了更多的文件(和更大的文件)并且数据分布在所有节点上,我们就可以设置 Spark 执行程序的数量,最终看到--num-executors
和完成时间之间的反比关系。
希望这可以帮助处于类似情况的其他人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.