繁体   English   中英

如何设置 Spark 执行程序的数量?

[英]How to set amount of Spark executors?

我如何从 Java(或 Scala)代码中配置具有SparkConfigSparkContext的执行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM