web-dev-qa-db-fra.com

Boosting spark.yarn.executor.memoryOverhead

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.

10
masta-g3

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é.

9
masta-g3

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...

9
Pat