0

我正在使用以下命令运行存储在 AWS EMR 集群(1 个主节点和 2 个从属节点,每个具有 8GB RAM 和 4 个内核)上的主节点上的 pyspark 代码 -

spark-submit --master yarn --deploy-mode cluster --jars /home/hadoop/mysql-connector-java-5.1.45/mysql-connector-java-5.1.45-bin.jar --driver-class-path /home/hadoop/mysql-connector-java-5.1.45/mysql-connector-java-5.1.45.jar --conf spark.executor.extraClassPath=/home/hadoop/mysql-connector-java-5.1.45/mysql-connector-java-5.1.45.jar --driver-memory 2g --executor-cores 3 --num-executors 3 --executor-memory 5g mysql_spark.py

我注意到两件事:

  1. 我通过 SSH 连接到从属节点,我注意到其中一个从属节点根本没有被使用(为此使用了 htop)。附上截图。这就是它的样子。我的spark-submit命令有问题吗? 2个从节点截图
  1. 在提交申请之前,主节点的 8GB 内存中的 6.54GB 已经在使用中(再次使用了 htop)。没有其他应用程序正在运行。为什么会这样?
4

2 回答 2

1

首先,您使用了 --deploy-mode ,cluster这意味着不计算主节点,并且仅考虑核心/任务节点的资源并有资格启动 spark 执行器/驱动程序。

client单击此处了解有关部署模式和cluster部署模式之间差异的更多信息。

第二:检查实例类型的配置以yarn.scheduler.maximum-allocation-mb获取可以分配给驱动程序/执行程序的最大可用内存。

第三:Sizing 例如,如果 c5.xlarge 类型的 core/task 节点 yarn.scheduler.maximum-allocation-mb = 6144 每个节点可以启动单个 executor 5.5 GB (--executor-memory = 5g + 10% memoryOverhead by默认)。一个驱动程序(2GB)将在单个节点上启动,另一个节点将启动一个执行程序。

建议:要么划分 6144 / 2,使得每个节点可以启动 2 个执行器,一个节点将启动 1 个执行器和驱动器(1 个驱动器 + 3 个执行器)。

于 2020-07-06T18:54:45.110 回答
0

您已指定--num-executors 3,因此总共将有 4 个执行者(1 个驱动程序 + 3 个)

因此,对于每个工作节点,您有 4 个 vCore 和 8GB 内存。

根据您的配置 -

  • 驱动程序将使用 1 个 vCore 和 2GB 内存。
  • 每个执行程序将使用 3 个 vCore 和 5GB 内存。

因此,查看您的配置,您的程序应该同时使用两个工作节点。因为一个节点不足以容纳所有资源。


我会建议请去检查

  1. 纱线用户界面http://<master-ip>:8088
  2. Spark 历史服务器 UIhttp://<master-ip>:18080

查看这些执行器在哪个节点中启动(每个执行器将与节点 IP 相关联)以及它们有多少。您可以通过导航到该特定作业来检查。
还可以从 Spark UI 验证每个执行程序使用了多少内存和 CPU。

于 2020-07-06T12:34:41.120 回答