如何使用 Spark 独立集群在工作节点上管理多个执行程序?

How multiple executors are managed on the worker nodes with a Spark standalone cluster?

到目前为止,我只在 Hadoop 集群上使用 Spark,并使用 YARN 作为资源管理器。在那种类型的集群中,我确切地知道 运行 有多少执行者以及资源管理是如何工作的。但是,知道我正在尝试使用独立的 Spark Cluster,我有点困惑。不对的地方指正一下。

this article开始,默认情况下,工作节点使用节点的所有内存减去 1 GB。但我知道通过使用 SPARK_WORKER_MEMORY,我们可以使用更少的内存。例如,如果节点的总内存为 32 GB,但我指定为 16 GB,那么 Spark worker 不会在该节点上使用超过 16 GB 的内存吗?

但是执行者呢?让我们说如果我想 运行 每个节点 2 个执行程序,我可以通过在 spark-submit 期间将执行程序内存指定为 SPARK_WORKER_MEMORY 的一半来做到这一点,如果我想 运行 每个节点 4 个执行程序,通过将执行程序内存指定为 SPARK_WORKER_MEMORY?

的四分之一

如果是这样,我认为除了执行程序内存之外,我还必须正确指定执行程序内核。例如,如果我想 运行 4 个 executors 在一个 worker 上,我必须将 executor cores 指定为 SPARK_WORKER_CORES 的四分之一?如果我指定一个更大的数字会发生什么?我的意思是,如果我将执行程序内存指定为 SPARK_WORKER_MEMORY 的四分之一,但执行程序内核仅为 SPARK_WORKER_CORES 的一半?在那种情况下,我会在该节点上获得 2 或 4 个执行程序 运行ning 吗?

根据我的经验,这是控制执行程序、内核和内存数量的最佳方式。

  • 核心数:您可以设置所有执行器的核心总数和每个执行器的核心数

  • 内存:执行器内存单独

    --总执行器核心数 12 --执行器核心数 2 --执行器内存 6G

    这会给你 6 个执行器和每个执行器 2 cores/6G,所以你总共需要 12 个内核和 36G

  • 您可以使用

    设置驱动内存

    --驱动内存2G

所以,我自己对 Spark Standalone 集群进行了一些试验,这就是我注意到的。

  1. 我的直觉是,通过调整执行器内核,多个执行器可以 运行 在一个 worker 中,这确实是正确的。比方说,您的工作人员有 16 个核心。现在,如果您为执行程序指定 8 个核心,Spark 将为每个工作程序 运行 2 个执行程序。

  2. 一个worker里面有多少executor运行也取决于你指定的executor内存。例如,如果 worker 内存为 24 GB,并且您希望每个 worker 运行 2 个执行程序,则不能将执行程序内存指定为超过 12 GB。

  3. 通过指定可选参数--memory 的值或更改SPARK_WORKER_MEMORY 的值,可以在启动slave 时限制worker 的内存。同核数(--cores/SPARK_WORKER_CORES).

如果您希望能够在 Standalone Spark 集群上 运行 多个作业,您可以在执行 spark-submit 时使用 spark.cores.max 配置 属性。比如像这样。

spark-submit <other parameters> --conf="spark.cores.max=16" <other parameters>

因此,如果您的独立 Spark 集群总共允许 64 个内核,而您只为您的程序提供 16 个内核,则其他 Spark 作业可以使用剩余的 48 个内核。