Apache Spark:如何强制使用一定数量的内核?

时间:2016-09-29 08:38:42

标签: azure apache-spark

我想在纱线模式下使用一定数量的核心运行spark-shell。

我使用的命令如下

spark-shell --num-executors 25 --executor-cores 4 --executor-memory 1G \
--driver-memory 1G --conf spark.yarn.executor.memoryOverhead=2048 --master yarn \
--conf spark.driver.maxResultSize=10G  \
--conf spark.serializer=org.apache.spark.serializer.KyroSerializer \
-i input.scala

input.scala看起来像这样

import java.io.ByteArrayInputStream

// Plaintext sum on 10M rows
def aggrMapPlain(iter: Iterator[Long]): Iterator[Long] = {
   var res = 0L
while (iter.hasNext) {
    val cur = iter.next
    res = res + cur
}
List[Long](res).iterator
 }

val pathin_plain = <some file>

val rdd0 = sc.sequenceFile[Int, Long](pathin_plain)
val plain_table = rdd0.map(x => x._2).cache
plain_table.count

0 to 200 foreach { i =>
    println("Plain - 10M rows - Run "+i+":")
    plain_table.mapPartitions(aggrMapPlain).reduce((x,y)=>x+y)
   }

执行此操作时,Spark UI首先达到大约40个核心,然后稳定在26个核心。

根据this的推荐,我在yarn-site.xml

中更改了以下内容
<property>                                                                                                          
       <name>yarn.nodemanager.resource.cpu-vcores</name>                                                                 
        <value>101</value>
</property>

<property>                                                                                                          
    <name>yarn.scheduler.maximum-allocation-vcores</name>                                                             
   <value>101</value>                                                                                                
 </property>

<property>                                                                                                          
      <name>yarn.scheduler.maximum-allocation-mb</name>                                                                 
       <value>102400</value>                                                                                             
</property>

<property>                                                                                                          
    <name>yarn.nodemanager.resource.memory-mb</name>                                                                  
    <value>102400</value>                                                                                             
</property>  

但我还是不能强迫火花使用100个核心,这是我需要的,因为我正在对早期的测试进行基准测试。

我正在使用Apache Spark 1.6.1。 群集上的每个节点(包括驱动程序)都有16个内核和112GB内存。 它们位于Azure(hdinsight群集)上。 2个驱动程序节点+ 7个工作节点。

1 个答案:

答案 0 :(得分:0)

我不熟悉Azure,但我猜YARN是YARN,所以你应该确保你有

yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
capacity-scheduler.xml中的

(参见this类似的问答)