J'essaie d'exécuter un travail (py) Spark sur EMR qui traitera une grande quantité de données. Actuellement, mon travail échoue avec le message d'erreur suivant:
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.
J'ai donc cherché sur Google comment procéder, et j'ai constaté que je devais passer le spark.yarn.executor.memoryOverhead
paramètre avec l'indicateur --conf. Je le fais de cette façon:
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)\
Mais quand je relance le travail, il me donne toujours le même message d'erreur, avec le 5.5 GB of 5.5 GB physical memory used
, ce qui implique que ma mémoire n'a pas augmenté .. des indices sur ce que je fais mal?
MODIFIER
Voici des détails sur la façon dont j'ai initialement créé le cluster:
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'
Merci.
Après quelques heures, j'ai trouvé la solution à ce problème. Lors de la création du cluster, je devais transmettre le drapeau suivant comme paramètre:
--configurations file://./sparkConfig.json\
Avec le fichier JSON contenant:
[
{
"Classification": "spark-defaults",
"Properties": {
"spark.executor.memory": "10G"
}
}
]
Cela me permet d'augmenter le memoryOverhead à l'étape suivante en utilisant le paramètre que j'ai initialement publié.
Si vous êtes connecté à un nœud EMR et souhaitez modifier davantage les paramètres par défaut de Spark sans utiliser les outils AWSCLI, vous pouvez ajouter une ligne au spark-defaults.conf
fichier. Spark est situé dans le répertoire/etc d'EMR. Les utilisateurs peuvent accéder directement au fichier en naviguant ou en éditant /etc/spark/conf/spark-defaults.conf
Donc, dans ce cas, nous ajouterions spark.yarn.executor.memoryOverhead
à la fin du fichier spark-defaults. La fin du fichier ressemble beaucoup à cet exemple:
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
De même, la taille du tas peut être contrôlée avec le --executor-memory=xg
drapeau ou le spark.executor.memory property
.
J'espère que cela t'aides...