如何配置具有SparkConfig
和SparkContext
的执行者的Java(或Scala)代码量?我经常看到2个执行者。看起来spark.default.parallelism
不起作用,并且是关于不同的东西。
我只需要将执行程序的数量设置为等于群集大小,但总是只有2个。我知道我的簇大小。如果这很重要,我会在YARN上运行。
答案 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根据运行的作业的处理和内存要求来决定执行程序的数量的方法。
我觉得第二选择比第一选择更好,并且被广泛使用。
希望这会有所帮助。