gpt4 book ai didi

apache-spark - Spark资源未在Amazon EMR上完全分配

转载 作者:行者123 更新时间:2023-12-03 12:13:10 26 4
gpt4 key购买 nike

我正在尝试最大限度地利用集群来完成一个简单的任务。

群集为1 + 2 x m3.xlarge,运行Spark 1.3.1,Hadoop 2.4,Amazon AMI 3.7

该任务读取文本文件的所有行并将其解析为csv。

当我将任务提交为 yarn 群集模式时,得到以下结果之一:

  • 0执行程序:作业无限等待,直到我手动将其杀死为止
  • 1执行程序:仅使用1台机器即可工作的资源利用工作
  • OOM当我没有在驱动程序
  • 上分配足够的内存时

    我期望的是:
  • Spark驱动程序在具有所有可用内存的群集主服务器上运行,外加2个执行器,每个执行器具有9404MB(由install-spark脚本定义)。

  • 有时,当我使用1个执行程序执行“成功”执行时,克隆和重新启动步骤最终将使用0个执行程序执行。

    我使用以下命令创建了集群:
    aws emr --region us-east-1 create-cluster --name "Spark Test"
    --ec2-attributes KeyName=mykey
    --ami-version 3.7.0
    --use-default-roles
    --instance-type m3.xlarge
    --instance-count 3
    --log-uri s3://mybucket/logs/
    --bootstrap-actions Path=s3://support.elasticmapreduce/spark/install-spark,Args=["-x"]
    --steps Name=Sample,Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar,Args=[/home/hadoop/spark/bin/spark-submit,--master,yarn,--deploy-mode,cluster,--class,my.sample.spark.Sample,s3://mybucket/test/sample_2.10-1.0.0-SNAPSHOT-shaded.jar,s3://mybucket/data/],ActionOnFailure=CONTINUE

    有一些步骤变化,包括:

    --driver-memory 8G --driver-cores 4 --num-executors 2

    带-x的install-spark脚本生成以下spark-defaults.conf:
    $ cat spark-defaults.conf
    spark.eventLog.enabled false
    spark.executor.extraJavaOptions -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxHeapFreeRatio=70
    spark.driver.extraJavaOptions -Dspark.driver.log.level=INFO
    spark.executor.instances 2
    spark.executor.cores 4
    spark.executor.memory 9404M
    spark.default.parallelism 8

    更新1

    通过通用的JavaWordCount示例,我得到相同的行为:
    /home/hadoop/spark/bin/spark-submit --verbose --master yarn --deploy-mode cluster --driver-memory 8G --class org.apache.spark.examples.JavaWordCount /home/hadoop/spark/lib/spark-examples-1.3.1-hadoop2.4.0.jar s3://mybucket/data/

    但是,如果我删除了“--driver-memory 8G”,则该任务将分配2个执行程序并正确完成。

    那么,驱动程序内存又如何阻止我的任务来获取执行者呢?

    here所述,是否应在Yarn主容器旁边与群集主节点上一起执行驱动程序?

    如何为我的Spark Job驱动程序分配更多内存? (在哪里收集和发生其他一些有用的操作)

    最佳答案

    最大化群集使用率的解决方案是在EMR上安装spark时忽略'-x'参数,并手动调整执行程序的内存和内核。

    这个post很好地解释了在YARN上运行Spark时如何完成资源分配。

    要记住的一件事是所有执行者必须分配相同的资源!如我们所说,Spark不支持异构执行器。 (目前正在做一些工作来支持GPU,但这是另一个主题)

    因此,为了在分配给驱动程序的最大内存的同时最大化分配给驱动程序的内存,我应该像这样拆分我的节点(此slideshare在第25页提供了不错的屏幕截图):

  • 节点0-主节点( yarn 资源管理器)
  • 节点1-NodeManager(容器(驱动程序)+容器(执行器))
  • 节点2-NodeManager(容器(执行器)+容器(执行器))

  • 注意:另一个选择是从主节点0将 spark-submit--master yarn --deploy-mode client一起使用。是否有任何反例,这是个坏主意?

    在我的示例中,我最多可以有3个执行器,每个执行器2个vcore,每个执行器4736 MB +一个具有相同规格的驱动程序。

    4736内存是由 yarn.nodemanager.resource.memory-mb中定义的 /home/hadoop/conf/yarn-site.xml的值得出的。在m3.xlarge上,将其设置为11520 mb(有关每个实例类型的所有值,请参见 here)。

    然后,我们得到:

    (11520-1024)/ 2(每个节点的执行程序)= 5248 => 5120(按yarn.scheduler.minimum-allocation-mb中的定义向下舍入为256 mb增量)

    7% * 5120 = 367向上舍入为384(内存开销) 将在spark 1.4中变为10%

    5120-384 = 4736

    其他有趣的链接:
  • Apache Spark: setting executor instances does not change the executors
  • Performance issues for spark on YARN
  • http://www.wdong.org/wordpress/blog/2015/01/08/spark-on-yarn-where-have-all-my-memory-gone/
  • 关于apache-spark - Spark资源未在Amazon EMR上完全分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713666/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com