Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark&x2B;使用亚马逊&x27;s";“最大化资源分配”;设置未使用所有核心/V核心_Apache Spark_Yarn_Emr_Amazon Emr_Elastic Map Reduce - Fatal编程技术网

Apache spark Spark&x2B;使用亚马逊&x27;s";“最大化资源分配”;设置未使用所有核心/V核心

Apache spark Spark&x2B;使用亚马逊&x27;s";“最大化资源分配”;设置未使用所有核心/V核心,apache-spark,yarn,emr,amazon-emr,elastic-map-reduce,Apache Spark,Yarn,Emr,Amazon Emr,Elastic Map Reduce,我正在使用Amazon特有的maximizeResourceAllocation标志为Spark运行一个EMR集群(版本EMR-4.2.0)。根据这些文档,“此选项计算核心节点组中节点上的执行器可用的最大计算和内存资源,并使用此信息设置相应的spark默认设置” 我正在为工作节点使用m3.2xlarge实例运行集群。我使用一个m3.xlarge作为纱线主控器,这是我能让它运行的最小的m3实例,因为它没有太多功能 情况是这样的:当我运行Spark作业时,每个执行器请求的内核数是8。(我只是在配置了

我正在使用Amazon特有的
maximizeResourceAllocation
标志为Spark运行一个EMR集群(版本EMR-4.2.0)。根据这些文档,“此选项计算核心节点组中节点上的执行器可用的最大计算和内存资源,并使用此信息设置相应的spark默认设置”

我正在为工作节点使用m3.2xlarge实例运行集群。我使用一个m3.xlarge作为纱线主控器,这是我能让它运行的最小的m3实例,因为它没有太多功能

情况是这样的:当我运行Spark作业时,每个执行器请求的内核数是8。(我只是在配置了
“Thread.scheduler.capacity.resource calculator”:“org.apache.hadoop.Thread.util.resource.DominantResourceCalculator”
之后才得到这个结果,它实际上不在文档中,但我离题了)。这似乎是有道理的,因为根据m3.2xlarge有8个“vCPU”。但是,在实际实例本身上,在
/etc/hadoop/conf/warn site.xml
中,每个节点都配置为将
warn.nodemanager.resource.cpu vcores
设置为
16
。我(猜测)认为这一定是由于超读或者其他一些硬件的幻想

所以问题是这样的:当我使用
maximizeResourceAllocation
时,我得到了Amazon实例类型拥有的“vCPU”数量,这似乎只是Thread在节点上运行的已配置“vCore”数量的一半;因此,执行器仅使用实例上实际计算资源的一半


这是亚马逊电子病历中的一个错误吗?其他人也有同样的问题吗?是否还有其他我缺少的神奇的未记录配置?

使用此设置,每个实例上应该有1个执行器(主实例除外),每个执行器有8个内核和大约30GB的RAM

http://:8088/上的Spark UI是否未显示该分配


我不确定该设置与该页面上提到的另一个“启用执行器的动态分配”相比是否真的有很多价值。这可以让Spark管理一个作业的实例数,如果你启动一个任务,每个执行器有2个CPU核和3G的RAM,那么对于EMR的实例大小,你将获得相当好的CPU与内存的比率。

好的,经过大量实验,我能够找到问题所在。我将在这里报告我的发现,以帮助人们避免未来的挫折感

  • 虽然所要求的8芯与纱线知道的16芯之间存在差异,但这似乎没有什么区别。纱线没有使用cgroup或任何花哨的东西来限制执行器实际可以使用多少cpu
  • 执行器上的“核心”实际上有点用词不当。它实际上是执行者在任何时候愿意运行多少并发任务;本质上归结为有多少线程在每个执行器上执行“工作”
  • 当设置了
    maximizeResourceAllocation
    时,当您运行Spark程序时,它会将属性
    Spark.default.parallelism
    设置为创建时集群中所有非主实例的实例核心数(或“vCPU”)即使在正常情况下,这也可能太小;我听说建议将此设置为运行作业所需的内核数的4倍。这将有助于确保在任何给定阶段都有足够的可用任务,使所有执行器上的CPU保持忙碌
  • 当您有来自不同spark程序的不同运行的数据时,您的数据(RDD或拼花格式或其他格式)很可能使用不同数量的分区保存。运行Spark程序时,请确保在加载时或在执行CPU密集型任务之前重新分配数据。由于您可以在运行时访问
    spark.default.parallelism
    设置,因此可以方便地将其重新分区
TL;DR

  • maximizeResourceAllocation
    几乎可以正确地为您执行所有操作,除了
  • 您可能希望显式地将
    spark.default.parallelism
    设置为您希望作业在每个“步骤”(在EMR中说)/“应用程序”(在纱线中说)的基础上运行的实例核心数的4倍,即每次都设置它
  • 确保在您的程序中对数据进行了适当的分区(即需要多个分区),以允许Spark对其进行适当的并行化

  • 在EMR版本3.x中,此maximizeResourceAllocation是通过一个参考表实现的:

    它由shell脚本使用:
    最大化spark默认配置
    ,在同一个repo中,您可以看看它们是如何实现的

    也许在新的EMR版本4中,这个参考表有点错误。。。我相信您可以在EMR的EC2实例中找到所有这些AWS脚本,应该位于/usr/lib/spark或/opt/AWS或类似的位置

    无论如何,至少,您可以在EMR 4中为此编写自己的
    引导操作
    脚本,并使用正确的参考表,类似于EMR 3.x中的实现

    此外,由于我们将使用STUPS基础设施,因此值得一看Spark的STUPS设备:

    部署spark群集时,您可以通过设置senza参数
    DefaultCores
    来明确指定核心数

    与EMR相比,该设备的一些亮点包括:

    能够与t2实例类型一起使用,可根据其他STUPS设备等角色自动伸缩

    使用zookeeper,您可以轻松地在HA模式下部署集群,因此主节点上没有SPOF,EMR中的HA模式目前仍不可用