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

时间:2014-10-02 19:34:09

标签: java scala cluster-computing apache-spark yarn

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

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

4 个答案:

答案 0 :(得分:20)

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

更新:

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

答案 1 :(得分:16)

您也可以通过在SparkConf对象上设置参数“spark.executor.instances”和“spark.executor.cores”来以编程方式执行此操作。

示例:

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

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

答案 2 :(得分:2)

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

证明数据集太小(小于128 MB的hdfs块大小),并且由于hadoop的默认数据复制试探性,仅存在于两个数据节点(1个主节点,我的集群中的7个数据节点)上。

一旦我和我们的同事拥有更多的文件(和更大的文件)并且数据分散在所有节点上,我们就可以设置Spark执行程序的数量,最后看到--num-executors与时间之间存在反比关系完成。

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

答案 3 :(得分:1)

在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根据运行的作业的处理和内存要求来决定执行程序的数量的方法。

我觉得第二选择比第一选择更好,并且被广泛使用。

希望这会有所帮助。