首页 > 代码库 > Spark任务调度executors分配问题 in yarn

Spark任务调度executors分配问题 in yarn

红色留着继续思考。 

问题背景:

     CCSWYB ,在云平台上模拟shell流程,在各个节点上分配fvcom计算任务。

 Spark程序流程:

    从HDFS中读取tasklist.txt(每一行对应一个任务) 经过一些操作过后生成一个JavaPairRDD ,记作data,对data执行foreach操作,函数内执行shell脚本启动任务。可以正常执行任务。

 集群:

    四个i5机器,hadoop2.3.0 + spark 1.0.0 + jdk1.7.0_60

问题:

    任务数目从2 - 20 左右,总是在两个节点上执行。太费时间了,每个fvcom计算任务最少要执行15分钟,最多要执行3个小时,如果只在两个节点上跑,不如最开始的流程了。

    要让节点尽量分配均匀。最起码要有3个节点在跑任务。如果放在更大的集群上跑任务,如果还是在两个节点上跑。。。。。。。

以下过程中tasklist有8个任务。

Solve

  Step1. 发现执行过程中,每个stage只有2个task(默认启动2个worker) => 分片数目太少,手动分片repartition() or partitionBy() or parllism() ,让每个任务一个分片。

    分片虽然多了,但是还是只在两个节点上跑任务。而且每个节点上的任务是批处理形式一个一个的执行的。

    期间注意到application中只在两个节点上缓存了RDD,想到是不是数据量太小了。 ====> 准备增大任务列表尝试(未完成)

  Step2. 寻找有没有手动指定节点数执行任务。找了好多资料,发现在spark/conf/spark-env.sh中有一相关的一些变量。

    # - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)

    # - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).    

    # - SPARK_WORKER_CORES, to set the number of cores to use on this machine
    # - SPARK_WORKER_INSTANCES, to set the number of worker processes per node

    尝试测试一下指定一下上述变量,让SPARK_EXECUTOR_INSTANCES=8(后来发现每个节点对应着一个这个值,每个节点上启动这些数量worker) , SPARK_EXECUTOR_CORES = 1 , SPARK_WORKER_CORES = 1 , SPARK_WORKER_INSTANCES = 1 ;

   并且在提交命令中指定 --num-executors 8 ,

  发现还是只在两个节点上运行任务,但是这次每个节点上同时运行了多个任务。几乎所有任务都同时开始执行了,但是负载不是很平衡,有时候任务均分,有时候3/5分。

  这里为什么这几个变量没有用呢? 会不会被程序中的覆盖掉了。 需要再去了解一下。  

 

        考虑了计算能力,我觉着每个节点运行四个任务是没问题的。但是如果任务量增大的话,每个节点可能同时跑更多个任务了。那这样势必造成任务长时间执行不完。

  Step3.  思考到底是谁来分配资源,是spark还是yarn,看了一些spark会议的pdf,没有找到答案。

      yarn分配资源的想法曾想过,本准备spark没有办法了去查一下yarn的分配问题。(The key)

         问了别人一些想法,开始考虑        yarn分配资源的情况    和   不使用yarn,使用spark standlone模式   这两种方案。

      感觉后一种更好,但是暂时没试。

      找到了一些资料,在yarn资源调度过程中,把cpu也作为了一个资源来分配(很粗糙的方式),把每个节点对应一个虚拟cpu数目(yarn.nodemanager.resource.cpu-vcores),根据请求分配虚拟cpu的数目,并提供了每个task可以申请的最大最小参数。

    而每个节点的虚拟cpu数目 为8个

<property>    <description>Number of CPU cores that can be allocated     for containers.</description>    <name>yarn.nodemanager.resource.cpu-vcores</name>    <value>8</value>  </property> <property>    <description>The minimum allocation for every container request at the RM,    in terms of virtual CPU cores. Requests lower than this won‘t take effect,    and the specified value will get allocated the minimum.</description>    <name>yarn.scheduler.minimum-allocation-vcores</name>    <value>1</value>  </property>  <property>    <description>The maximum allocation for every container request at the RM,    in terms of virtual CPU cores. Requests higher than this won‘t take effect,    and will get capped to this value.</description>    <name>yarn.scheduler.maximum-allocation-vcores</name>    <value>32</value>  </property>

 

在spark中,默认为每个task分配一个cpu, 

只在2个节点上运行的原因有些明了了。

于是 设置了每个节点的yarn.nodemanager.resource.cpu-vcores为2 ,其实可以设置为4,但是为了测试程序,暂时设置为2,

重新提交任务,终于在第三个节点上运行了。

勉强算是解决了,但是还有好多问题,比如任务分配不均匀等。 有时候一些节点会分配更多的任务。

 

还需要继续改进,

理想状态,如果节点数目少的,就各个节点均分;如果多的话,根据实际计算能力,让每个节点先执行一定数目(各个节点cpu核数)的任务,运行完之后再继续执行剩余的任务。

不要让单个节点负载过大。

感觉应该可以通过适当设置来完成。 设置每个机器的运算虚拟cpu数,每个task需要的cpu数,初始时启动worker数目,spark中executo的调度方法等等。

   还有问题: worker和executor有什么区别和联系?

 

如果还有改进, 继续来更新。

 

还是很多理解的不透彻。 

暂时考虑的资源分配可能是 nodemanager 分配给spark ,spark 继续分配。 还要去看一些文档才明白。

还有spark中,找到了一篇文章 。讲了 executor的资源调度问题,提到了 SpreadOut分配策略 。 可以参考一下,还未细看,

在spark user list中的提问,还没人回答, http://apache-spark-user-list.1001560.n3.nabble.com/task-in-every-nodes-td12740.html 自己倒先回复了,希望有人提出更好的做法。

还有一些其他的资源,留在这里。

 Apache Spark 的设计与实现    https://github.com/JerryLead/SparkInternals/tree/master/markdown   

董的博客              http://dongxicheng.org/

      

Spark任务调度executors分配问题 in yarn