emr-5.4.0(Spark执行器内存分配问题)

时间:2017-04-23 03:43:10

标签: apache-spark amazon-emr

我创建了一个spark集群(学习如此没有创建高内存cpu集群),其中包含1个主节点和2个Core,使用以下配置运行执行程序

Master:Running1m4.large(2 Core,8GB) 核心:Running2c4.large(2核,3.5 GB) Hive 2.1.1,Pig 0.16.0,Hue 3.11.0,Spark 2.1.0,Sqoop 1.4.6,HBase 1.3.0

运行pyspark时会出现以下错误  所需的执行程序内存(1024 + 384 MB)高于此群集的最大阈值(896 MB)!请检查'yarn.scheduler.maximum-allocation-mb'和/或'yarn.nodemanager.resource.memory-mb'的值。

在尝试增加yarn-site.xml配置之前,很想知道为什么当master拥有8GB且工作节点各有3.5GB时,EMR仅占用896MB的限制。

资源管理器URL(对于master- http://master-public-dns-name:8088/)显示1.75 GB,其中vm的内存为8GB。 hbase或其他sws会占用太多内存吗?

如果有人遇到类似问题,请分享您的见解,为什么EMR设置的默认值较低。谢谢!

2 个答案:

答案 0 :(得分:1)

它不是EMR的属性,而是YARN,它是在EMR上运行的资源管理器。

我对YARN的个人看法是,它真正构建用于管理长时间运行的集群,这些集群不断地接收必须同时运行的各种作业。在这些情况下,YARN只为每个作业分配一小部分可用内存是有意义的。

不幸的是,当谈到特定用途的集群时(例如:“我只是启动集群运行我的工作并再次终止集群”)这些YARN默认值只是烦人的,你必须配置一堆为了让YARN最佳地利用您的资源。但是在EMR上运行这是我们现在所困扰的事情,所以人们必须忍受......

答案 1 :(得分:1)

  

在尝试增加yarn-site.xml配置之前,很想明白   为什么当主人拥有8GB和工人时,EMR只占896MB的限制   节点每个3.5GB。

如果您使用纱线群集模式运行火花作业(您可能正在使用它),则执行程序将在核心上运行,而主程序将不会使用内存。

现在,虽然你的CORE EC2实例(c4.large)有3.75 GB可用,但EMR配置YARN不要使用所有这些内存来运行YARN容器或spark执行器。这是因为你必须为其他永久守护进程留下足够的内存(比如HDFS的datanode,YARN的节点管理器,EMR自己的守护进程等......基于你提供的应用程序)

EMR确实发布了为此页面上的所有实例类型设置的默认YARN配置:http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hadoop-task-config.html

c4.large

Configuration Option    Default Value   
mapreduce.map.java.opts -Xmx717m    
mapreduce.map.memory.mb 896
yarn.scheduler.maximum-allocation-mb    1792
yarn.nodemanager.resource.memory-mb 1792

因此,yarn.nodemanager.resource.memory-mb = 1792,这意味着1792 MB是将分配给具有3.75实际内存的核心节点上的YARN容器的物理内存。另外,请检查spark-defaults.xml,其中EMR具有spark执行程序内存的某些默认值。这些是默认设置,当然您可以在使用EMR配置API启动集群之前更改这些设置。但请记住,如果您为YARN容器配置内存,则可能会使其他一些进程挨饿。

鉴于了解YARN配置以及SPARK如何与YARN交互非常重要。

https://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml http://spark.apache.org/docs/latest/running-on-yarn.html http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/