Apache spark 火花纺纱机的性能问题

Apache spark 火花纺纱机的性能问题,apache-spark,yarn,Apache Spark,Yarn,我们正试图在纱线上运行火花束。我们有一些性能问题,尤其是与独立模式相比 我们有一个由5个节点组成的集群,每个节点都有16GB的RAM和8个核心。我们已在warn-site.xml中将容器的最小大小配置为3GB,最大大小配置为14GB。将作业提交给纱线集群时,我们提供的执行器数量=10,执行器内存=14 GB。根据我的理解,我们的工作应该分配4个14GB的容器。但spark UI仅显示3个容器,每个容器的容量为7.2GB 我们无法确保集装箱编号和分配给它的资源。与独立模式相比,这会导致性能下降 你

我们正试图在纱线上运行火花束。我们有一些性能问题,尤其是与独立模式相比

我们有一个由5个节点组成的集群,每个节点都有16GB的RAM和8个核心。我们已在warn-site.xml中将容器的最小大小配置为3GB,最大大小配置为14GB。将作业提交给纱线集群时,我们提供的执行器数量=10,执行器内存=14 GB。根据我的理解,我们的工作应该分配4个14GB的容器。但spark 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  
讨论结束后,我更改了我的warn-site.xml文件以及spark submit命令

以下是新的warn-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>
有了这个,我可以在每台机器上获得6个内核,但每个节点的内存使用量仍然在5G左右。我已附上SPARKUI和htop的屏幕截图。

  • 使用warn-site.xml检查
    warn.nodemanager.resource.memory mb
    的设置是否正确。据我所知,您的集群应该设置为14GB。此设置负责让纱线知道在该特定节点上可以使用多少内存
  • 如果此设置正确,并且有5台服务器运行Thread NodeManager,则作业提交命令错误。首先,
    --num executors
    是将在集群上启动以执行的纱线容器的数量。您指定了10个容器,每个容器具有14GB RAM,但集群上没有这么多资源!其次,指定
    --master warn cluster
    ,这意味着Spark驱动程序将在需要单独容器的warn应用程序主程序内部运行
  • 在我看来,它显示了3个容器,因为在集群中的5个节点中,只有4个节点运行Thread NodeManager+您请求为每个容器分配14GB,因此Thread首先启动Application Master,然后轮询NM以获取可用资源,并查看它只能启动3个容器。关于堆大小,您可以看到,启动Spark后,找到它的JVM容器并查看它们的启动参数-您应该在一行中有许多-Xmx标志-一个正确,一个错误,您应该在配置文件(Hadoop或Spark)中找到它的来源
  • 在向群集提交应用程序之前,使用相同的设置启动spark shell(将
    纱线群集
    替换为
    纱线客户端
    ),并检查其启动方式,检查WebUI和JVM启动情况
  • 您在SparkUI中看到的内存(7.2GB)是spark.storage.memoryFraction,默认为0.6。至于您丢失的执行者,您应该查看纱线资源管理器日志

    仅仅因为纱线“认为”它有70GB(14GBx5),并不意味着在运行时集群上有70GB可用空间。您可能正在运行其他消耗内存的Hadoop组件(hive、HBase、flume、solr或您自己的应用程序等)。因此,纱线在运行时所做的决策是基于当前可用的数据,而您只有52GB(3x14GB)可用。顺便说一下,GB数字是近似值,因为它实际上是按每GB 1024MB计算的……所以您将看到小数


    使用或top查看每个节点上还有哪些正在使用内存

    我的{warn.nodemanager.resource.memory mb}是15GB,因为我们留给操作系统进程1GB,并允许nodemangaer分配其他15GB。我将我的提交呼叫修改为此--主纱线集群--num executors 5--executor memory 13gI怀疑与NM本身一起运行DataNode,因此在我看来15GB太多了,我不会超过14GB。我可以确定在创建容器期间/之后容器分配的RAM量是多少吗?我试图查看资源管理器的日志,但无法确定它的确切条目。我们的集群不是一个生产集群,也不是一个繁忙的集群,因此,如果我们能够确保spark获得它所能获得的所有RAM,那就没问题了@sietse Au这是否意味着spark容器获得了所需的内存,但只报告该部分?因为在我们的独立实现中,会报告整个内存。登录到Thread NM机器,运行
    ps-ef | grep java | more
    并找到Spark executor容器,查看
    -Xmx
    参数事实上不是0.6。它是“安全内存”的0.6,也就是整个堆的0.9,所以默认情况下它是JVM堆的0.54,而当我们这样做时,14GB实际上不是14GB,而是14GB+内存。但他不是这样问的,对吗?
    $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