我们正试图在纱线上运行我们的火花簇。与独立模式相比,我们遇到了一些性能问题。
我们有一个包含5个节点的集群,每个节点具有16GB RAM和8个核心。我们在yarn-site.xml中将最小容器大小配置为3GB,最大为14GB。当将作业提交到纱线群集时,我们提供执行者数量= 10,执行者的内存= 14 GB。根据我的理解,我们的工作应该分配4个14GB的容器。但是火花UI只显示了3个容量为7.2GB的容器。
我们无法确保分配给它的容器编号和资源。与独立模式相比,这会导致不利的性能。
你能否指出如何优化纱线性能?
这是我用来提交作业的命令:
$SPARK_HOME/bin/spark-submit --class "MyApp" --master yarn-cluster --num-executors 10 --executor-memory 14g target/scala-2.10/my-application_2.10-1.0.jar
在讨论之后,我改变了我的yarn-site.xml文件以及spark-submit命令。
这是新的yarn-site.xml代码:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hm41</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>14336</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2560</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>13312</value>
</property>
火花提交的新命令是
$SPARK_HOME/bin/spark-submit --class "MyApp" --master yarn-cluster --num-executors 4 --executor-memory 10g --executor-cores 6 target/scala-2.10/my-application_2.10-1.0.jar
有了这个,我可以在每台机器上获得6个核心,但每个节点的内存使用量仍然在5G左右。我附上了SPARKUI和htop的屏幕截图。
答案 0 :(得分:3)
您在SparkUI中看到的内存(7.2GB)是spark.storage.memoryFraction,默认情况下为0.6。至于丢失的执行程序,您应该查看YARN资源管理器日志。
答案 1 :(得分:1)
yarn.nodemanager.resource.memory-mb
是否设置正确。在我对您的群集的理解中,它应该设置为14GB。此设置负责让YARN知道它可以在此特定节点上使用多少内存--num-executors
是将在群集上执行的YARN容器的数量。您指定10个容器,每个容器有14GB RAM,但您的群集上没有这么多资源!其次,指定--master yarn-cluster
,这意味着Spark Driver将在需要单独容器的YARN Application Master内部运行。yarn-cluster
替换为yarn-client
)并检查其启动方式,检查WebUI和JVM是否已启动答案 2 :(得分:0)
仅仅因为YARN“认为”它有70GB(14GBx5),并不意味着在运行时集群上有70GB可用。您可能正在运行消耗内存的其他Hadoop组件(hive,HBase,flume,solr或您自己的应用程序等)。因此,YARN的运行时决定是基于当前可用的 - 并且它只有52GB(3x14GB)可用。顺便说一句,GB数字是近似的,因为它实际上计算为每GB 1024MB ......所以你会看到小数。
使用nmon或top查看每个节点上还有哪些内存使用内存。