spark系列——Executor启动过程分析

前言

本篇文章将以问答的方式对Executor的启动进行分析。

1. executor在什么时候开始启动?

新app的加入和集群资源的变动将调用到Master的schedule方法,这个时候会进行startExecutorsOnWorkers()进行executor的调度和启动。(资源申请的是在 appclient 的 registerApplication 消息中)

2.Executor在worker上启动的条件是什么?

  • cpu cores 的分配:
    1.worker分配给excutor的 cores 大于excutor所需要的最小cores
    2.worker空闲 cores 大于 excutor 所需最小cores
  • worker的空闲内存大于excutor所需要的内存
  • excutor的总数小于 app 设置的最大 excutor 数
  • worker上没有启动 executor 或者 worker 上允许启动多个 executor

3.一个worker上可以启动几个Executor?

  • 当设置了 spark.executor.cores为 Executor 指定了 cores 的时候,一个 worker 可以启动多个 Executor,否则一个 worker 只会为 app 启动一个 executor,但是会为这个 executor 尽可能多的分配 cpu cores。

4.worker 集群启动Executor的规则是怎么样的?

在可用的 Worker 节点中启动 Executor ,在 Worker 节点每次分配资源时,分配给 Executor 所需的最少 CPU 核数(1.4.2之前是每次只分配一个core),该过程是通过多次轮询进行,在分配过程中Worker 节点可能多次分配,如果 该 Worker 节点可以启动多个 Executor ,则每次分配的时候启动新的 Executor 并赋予资源;如 果 Worker 节点只能启动一个 Executor ,则每次分配的时候把资源追加到该 Executor;

  • 如果spark.deploy.spreadOut = false ,会优先使用一个worker的资源,当这个worker资源不够用的时候,才会去下一台worker上进行接下来的资源分配。
  • 如果spark.deploy.spreadOut = true ,则在某一 worker 节点上做完资源分配立即移到下一个 worker 节点进行下一次分配。

直到没有 worker 节点能够没有满足启动Executor 条件或者已经达到应用程序限制。

5.spark 1.4.2 资源分配的一个bug?

在某一集群中有4 个 Worker 节点,每个节点拥有16个 CPU 核数,其中设置了 spark.cores.max = 48spark.executor.cores = 16,如果spark.deploy.spreadOut = true,按照每次分配 1 个CPU 核数,则每个 Worker 节点的 Executor 将分配到 12 个 CPU 核数,就达到了应用限制的最大核数48,但却没有满足executor启动的最小cores 16,所以将没有 Executor 能够启动,参见 SPARK -8881问题说明。而在后续版本中,每次分配 CPU 核数为 Executor 指定的 CPU 核数,如果没有指定默认情况为1,这样在前面的例子中,按照该分配方式将在3 个 Worker 节点中的 Executor 分配16个 CPU 核数,这样就能够正常启动 Executor 。

通过以上几个问题,大概也能了解到 executor 在worker端启动的整个流程了,本文主要是从源码角度挖掘的信息,如有不对的地方,麻烦指出,谢谢!

    原文作者:code_solve
    原文地址: https://www.jianshu.com/p/c17ac7544053
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞