当前位置: 首页 > 知识库问答 >
问题:

Apache Spark驱动程序内存、执行程序内存、驱动程序内存开销和执行程序内存开销对作业成功运行的影响

蓝宜
2023-03-14

我正在对YARN上的Spark作业进行一些内存调优,我注意到不同的设置会给出不同的结果,并影响Spark作业运行的结果。但是,我很困惑,不明白为什么会这样,如果有人能给我一些指导和解释,我会很感激。

我将提供一些背景资料和张贴我的问题和描述案例,我已经经历了他们在下面。

我的环境设置如下:

  • 存储器20G,每个节点20个vCore(共3个节点)
  • Hadoop 2.6.0
  • 火花1.4.0

我的代码对RDD进行递归过滤,使其更小(将示例作为算法的一部分删除),然后执行mapToPair和Collection以收集结果并将其保存在列表中。

>

  • 为什么会抛出不同的错误,而作业在第一种情况和第二种情况之间运行得更长(对于第二种情况),而只增加了执行器内存?这两个错误有什么联系吗?

    第三个和第四个例子都成功了,我知道这是因为我给了更多的记忆,解决了记忆问题。然而,在第三种情况下,

    spark.driver.memory+spark.YARN.driver.memoryadhorize=YARN将创建JVM的内存

    但对于第四种情况,

    spark.driver.memory+spark.YARN.driver.memoryadhorize=YARN将创建JVM的内存

    =2+(driverMemory*0.07,最小384M)=2g+0.524g=2.524g

    /bin/spark-submit--class<类名>--master yarn-cluster--驱动程序-内存7G--executor-memory 3G--num-executors3--executor-cores1--jars

    如果我使用相同的驱动程序内存但更高的执行器内存运行程序,那么作业运行的时间会比第一种情况长(大约3-4分钟),然后它会遇到与之前不同的错误,即容器请求/使用的内存超过允许的内存,并因此被终止。虽然我觉得很奇怪,因为执行器内存增加了,而且出现了这个错误,而不是第一种情况下的错误。

    /bin/spark-submit--class<类名>--master yarn-cluster-驱动程序-内存11g--executor-memory 1g--num-executors3--executor-cores1--jars

    任何驱动程序内存大于10G的设置都将导致作业能够成功运行。

    /bin/spark-submit--class<类名>--主纱-集群--驱动程序--内存2g--执行器--内存1g--conf spark.yarn.executor.memoryoverhead=1024--conf spark.yarn.driver.memoryoverhead=1024--num-执行器3--执行器-核心1--jars 文件>

    该作业将在此设置下成功运行(驱动程序内存2G,执行程序内存1G,但会增加驱动程序内存开销(1G)和执行程序内存开销(1G)。

    任何帮助都将被感激,并将真正帮助我了解火花。提前道谢。

  • 共有1个答案

    黄泰宁
    2023-03-14

    你所有的箱子都用

    --executor-cores 1
    

    最好的做法是超过1。不要超过5。根据我们的经验和Spark开发者的推荐。

    例如。http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/:

    A rough guess is that at most five tasks per executor 
    can achieve full write throughput, so it’s good to keep 
    the number of cores per executor below that number
    

    http://spark.apache.org/docs/latest/programming-guide.html#shared-variables

     类似资料:
    • 我是Spark的初学者,我正在运行我的应用程序,从文本文件中读取14KB的数据,执行一些转换和操作(收集、收集AsMap),并将数据保存到数据库 我在我的macbook上本地运行它,内存为16G,有8个逻辑核。 Java最大堆设置为12G。 这是我用来运行应用程序的命令。 bin/spark-submit-class com . myapp . application-master local[*

    • 我正在通过阅读高性能Spark来学习如何配置Spark应用程序,其中提到的一句话让我感到困惑: 根据我的经验,设置Spark驱动程序内存的良好启发式方法只是不会导致驱动程序内存错误的最低可能值,即为执行程序提供最大可能的资源。 我的理解是驱动程序存在于它自己的节点中,而执行程序独立存在于工作节点上。我本以为我可以最大限度地利用驱动程序内存,而不必担心它会影响执行程序。 这本书的建议是真的吗?如果是

    • 我是否正确理解了客户端模式的文档? 客户端模式与驱动程序在应用程序主程序中运行的集群模式相反? 在客户端模式下,驱动程序和应用程序主程序是独立的进程,因此+必须小于计算机的内存? 在客户端模式下,驱动程序内存不包括在应用程序主内存设置中吗?

    • null null 为了进行简单的开发,我使用在独立集群模式下(8个工作者、20个内核、45.3G内存)执行了我的Python代码。现在我想为性能调优设置执行器内存或驱动程序内存。 在Spark文档中,执行器内存的定义是 每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512M、2G)。

    • 我在一个单独的Docker中运行spark-master和spark-worker。 我能看见他们在跑 PS-EF grep火花根3477 3441 0 1 05?00:04:17/usr/lib/jvm/java-1.8-openjdk/jre/bin/java-cp/usr/local/spark/conf/:/usr/local/spark/jars/*-xmx1g org.apache.s

    • 我使用了Spark 2.1.1,并升级到了最新版本2.4.4。我从Spark UI观察到驱动程序内存在不断增加,在长时间运行之后,我出现了以下错误:java。lang.OutOfMemoryError:超出GC开销限制 在Spark 2.1.1中,驱动程序内存消耗(存储内存选项卡)极低,在运行ContextCleaner和BlockManager后,内存正在减少。 此外,我测试了Spark版本2.