我正在使用以下命令运行存储在 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
我注意到两件事:
- 我通过 SSH 连接到从属节点,我注意到其中一个从属节点根本没有被使用(为此使用 htop)。附上屏幕截图。这就是它自始至终的样子。我的
spark-submit
命令有问题吗? 2 个从节点截图
- 在提交申请之前,6.54GB 的 8GB 主节点 RAM 已经在使用中(再次使用 htop)。没有其他应用程序正在运行。为什么会这样?
首先,您使用了 --deploy-mode 进行cluster
这意味着不计算主节点,并且只考虑核心/任务节点的资源并有资格启动 Spark 执行器/驱动程序。
单击此处了解有关client
和cluster
部署模式之间区别的更多信息。
第二:检查实例类型的配置以获取属性yarn.scheduler.maximum-allocation-mb
哪个是可以分配给驱动程序/执行程序的最大可用内存。
第三:大小调整例如,如果类型为 c5.xlarge 的核心/任务节点 yarn.scheduler.maxum-allocation-mb = 6144 每个节点可以启动单个执行器 5.5 GB(--executor-memory = 5g + 10% 内存默认开销)。一个驱动程序(2GB)将在单个节点上启动,另一个节点将启动单个执行器。
建议:将 6144/2 除以,以便每个节点可以启动 2 个执行程序,一个节点将启动 1 个执行器和驱动程序(1 个驱动程序 + 3 个执行程序)。
您已经指定了--num-executors 3
,因此总共将有 4 个执行器(1 个驱动程序 + 3)
因此,对于每个工作器节点,您有 4 个 vCore 和 8GB 内存。
根据您的配置 -
- 驱动程序将使用 1 个 vCore 和 2GB 内存。
- 每个执行程序将使用 3 个 vCore 和 5GB 内存。
因此,查看您的配置,您的程序应该同时使用两个工作节点。因为一个节点不足以容纳所有资源。
我会建议请去检查
- 纱线用户界面
http://<master-ip>:8088
- Spark 历史记录服务器 UI
http://<master-ip>:18080
查看这些执行器在哪个节点中启动(每个执行程序将与节点 IP 相关联)以及它们的数量。您可以通过导航到该特定作业来检查这一点.
还可以从 Spark UI 验证每个执行程序使用了多少内存和 cpu。