2016-06-29 29 views
4

我试图在EMR上运行(py)Spark作业来处理大量数据。目前,我的工作与以下错误消息失败:Boosting spark.yarn.executor.memoryOverhead

Reason: Container killed by YARN for exceeding memory limits. 
5.5 GB of 5.5 GB physical memory used. 
Consider boosting spark.yarn.executor.memoryOverhead. 

所以我google'd如何做到这一点,并发现我应该沿着spark.yarn.executor.memoryOverhead参数与--conf标志传递。我做这样说:

aws emr add-steps\ 
--cluster-id %s\ 
--profile EMR\ 
--region us-west-2\ 
--steps Name=Spark,Jar=command-runner.jar,\ 
Args=[\ 
/usr/lib/spark/bin/spark-submit,\ 
--deploy-mode,client,\ 
/home/hadoop/%s,\ 
--executor-memory,100g,\ 
--num-executors,3,\ 
--total-executor-cores,1,\ 
--conf,'spark.python.worker.memory=1200m',\ 
--conf,'spark.yarn.executor.memoryOverhead=15300',\ 
],ActionOnFailure=CONTINUE" % (cluster_id,script_name)\ 

但是,当我重新运行该作业它不断给我同样的错误消息,与5.5 GB of 5.5 GB physical memory used,这意味着我的记忆没有增加..对我是什么任何提示做错了?

编辑

这里是我最初如何创建群集的详细信息:

aws emr create-cluster\ 
--name "Spark"\ 
--release-label emr-4.7.0\ 
--applications Name=Spark\ 
--bootstrap-action Path=s3://emr-code-matgreen/bootstraps/install_python_modules.sh\ 
--ec2-attributes KeyName=EMR2,InstanceProfile=EMR_EC2_DefaultRole\ 
--log-uri s3://emr-logs-zerex\ 
--instance-type r3.xlarge\ 
--instance-count 4\ 
--profile EMR\ 
--service-role EMR_DefaultRole\ 
--region us-west-2' 

感谢。

+0

你检查了工作的日志? –

+0

是@Koffee,那是我从中得到错误信息的地方。当它试图执行一个SparkSQL语句,它将数据按大量变量进行分组然后进行聚合(即“按名称从表组中选择名称,最小(数字)”)时,它会失败。我在这里复制了更详细的日志部分:http://pastebin.com/KVrbDkHu –

+0

您使用哪个实例? m3.xlarge?我认为'--total-executor-cores'参数只能在独立模式下由Spark使用,而不能在Yarn中使用。 –

回答

4

几个小时后,我找到了解决这个问题的办法。创建集群时,我需要对下列标志传递作为参数:

--configurations file://./sparkConfig.json\ 

与含有JSON文件:

[ 
    { 
     "Classification": "spark-defaults", 
     "Properties": { 
     "spark.executor.memory": "10G" 
     } 
    } 
    ] 

这使我通过使用以增加memoryOverhead在下一步骤我最初发布的参数。

5

如果您登录到EMR节点并希望进一步更改Spark的默认设置而不处理AWSCLI工具,则可以将一行添加到spark-defaults.conf文件。 Spark位于EMR的/ etc目录中。用户可以通过导航到或编辑/etc/spark/conf/spark-defaults.conf

直接访问文件。因此,在这种情况下,我们会将spark.yarn.executor.memoryOverhead附加到spark-defaults文件的末尾。该文件的末尾看起来非常相似,该实施例中:

spark.driver.memory    1024M 
spark.executor.memory   4305M 
spark.default.parallelism  8 
spark.logConf     true 
spark.executorEnv.PYTHONPATH  /usr/lib/spark/python 
spark.driver.maxResultSize  0 
spark.worker.timeout    600 
spark.storage.blockManagerSlaveTimeoutMs 600000 
spark.executorEnv.PYTHONHASHSEED 0 
spark.akka.timeout    600 
spark.sql.shuffle.partitions  300 
spark.yarn.executor.memoryOverhead 1000M 

类似地,堆大小可以与--executor-memory=xg标志或spark.executor.memory property来控制。

希望这有助于...

相关问题