Spark:如何利用 spark 独立集群上的所有内核和内存,其中节点的内存大小不同

Spark: How to utilize all cores and memory on spark stand alone cluster, where nodes differs in memory size

如何在下面的 spark 独立集群上利用所有内核和内存:

Node 1: 4cores 8gb memory
Node 2: 4cores 16gb memory

目前我可以分配使用:

A) 8 核和 14 GB 内存通过设置:

.config('spark.executor.memory','7g')
.config('spark.executor.cores', '4')

Cores       |  Memory
----------------------------------
4 (4 Used)  |  15.0 GiB (7.0 GiB Used)  
4 (4 Used)  |  7.0 GiB (7.0 GiB Used)

B) 通过设置使用 6 核和 21gb 内存:

.config('spark.executor.memory','7g')
.config('spark.executor.cores', '2')

Cores       |  Memory
----------------------------------
4 (4 Used)  |  15.0 GiB (14.0 GiB Used) 
4 (2 Used)  |  7.0 GiB (7.0 GiB Used)

预期输出:

 8 cores 21gb of memory:

    Cores       |  Memory
    ----------------------------------
    4 (4 Used)  |  15.0 GiB (14.0 GiB Used) 
    4 (4 Used)  |  7.0 GiB (7.0 GiB Used)

参考:

  • 您有一个大小为两个节点的集群:因此您必须使用像 YARN(恕我直言)这样的资源管理器。否则你的 spark-job 只会在你的本地机器上执行。
  • 使用这个:Running Spark on YARN
  • 示例 B) 显示分配了 4 个内核,但目前只有两个内核用于完成工作。其他两个核心只是无聊无事可做或完成工作

最后答案很简单。我尝试了 YARN,但遇到了与 Standalone 相同的问题。我发现通过在每个节点上的 $SPARK_HOME/conf/spark-env.sh 中设置独立设置的解决方案最终非常简单:

对于节点 1:(4 核 8gb 内存)

SPARK_WORKER_CORES=4
SPARK_WORKER_MEMORY=7g

节点 2:(4 核 16gb 内存)

SPARK_WORKER_CORES=8
SPARK_WORKER_MEMORY=14g

和 运行 带有设置的 spark 应用

.config('spark.executor.memory','7g')
.config('spark.executor.cores', '2')

结果全部8核21gb内存被占用:

 Cores       |  Memory
    ----------------------------------
    8 (8 Used)  |  14.0 GiB (14.0 GiB Used) 
    4 (4 Used)  |  7.0 GiB (7.0 GiB Used)

注意:在YARN中同样可以解决这个问题。 $HADOOP_HOME/etc/hadoop/yarn-site.xml 中的设置需要更改以下参数:

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

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

        <property>
                <name>yarn.scheduler.minimum-allocation-mb</name>
                <value>512</value>
        </property>

         <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>4</value>
        </property>

        <property>
              <name>yarn.scheduler.minimum-allocation-vcores</name>
              <value>1</value>
        </property>

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