Utilisation des configurations Spark lorsque vous exécutez des EMR tâches sans serveur - Amazon EMR

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation des configurations Spark lorsque vous exécutez des EMR tâches sans serveur

Vous pouvez exécuter des tâches Spark sur une application dont le type paramètre est défini surSPARK. Les tâches doivent être compatibles avec la version de Spark compatible avec la version de EMR lancement d'Amazon. Par exemple, lorsque vous exécutez des tâches avec Amazon EMR version 6.6.0, celles-ci doivent être compatibles avec Apache Spark 3.2.0. Pour plus d'informations sur les versions de l'application pour chaque version, consultezVersions de lancement d'Amazon EMR Serverless.

Paramètres de la tâche Spark

Lorsque vous utilisez le StartJobRunAPIpour exécuter une tâche Spark, vous pouvez spécifier les paramètres suivants.

Rôle d'exécution de la tâche Spark

Utilisez executionRoleArnpour spécifier le ARN IAM rôle que votre application utilise pour exécuter les tâches Spark. Ce rôle doit contenir les autorisations suivantes :

  • Lisez à partir de compartiments S3 ou d'autres sources de données où résident vos données

  • Lisez à partir de compartiments ou de préfixes S3 où réside votre PySpark script ou fichier JAR

  • Écrivez dans les compartiments S3 où vous avez l'intention d'écrire votre sortie finale

  • Écrire des journaux dans un compartiment ou un préfixe S3 qui spécifie S3MonitoringConfiguration

  • Accès aux KMS clés si vous utilisez des KMS clés pour chiffrer les données de votre compartiment S3

  • Accès au catalogue de données AWS Glue si vous utilisez Spark SQL

Si votre tâche Spark lit ou écrit des données depuis ou vers d'autres sources de données, spécifiez les autorisations appropriées pour ce IAM rôle. Si vous n'accordez pas ces autorisations au IAM rôle, la tâche risque d'échouer. Pour plus d’informations, consultez Rôles d'exécution des tâches pour Amazon EMR Serverless et Stockage des journaux.

Paramètre du pilote de tâche Spark

jobDriverÀ utiliser pour fournir des informations sur la tâche. Le paramètre du pilote de tâche n'accepte qu'une seule valeur pour le type de tâche que vous souhaitez exécuter. Pour une tâche Spark, la valeur du paramètre estsparkSubmit. Vous pouvez utiliser ce type de tâche pour exécuter Scala, Java PySpark, SparkR et toute autre tâche prise en charge via Spark submit. Les tâches Spark ont les paramètres suivants :

  • sparkSubmitParameters— Il s'agit des paramètres Spark supplémentaires que vous souhaitez envoyer à la tâche. Utilisez ce paramètre pour remplacer les propriétés Spark par défaut, telles que la mémoire du pilote ou le nombre d'exécuteurs, telles que celles définies dans les arguments --conf or--class.

  • entryPointArguments— Il s'agit d'un tableau d'arguments que vous souhaitez transmettre à votre fichier principal JAR ou à votre fichier Python. Vous devez gérer la lecture de ces paramètres à l'aide de votre code entrypoint. Séparez chaque argument du tableau par une virgule.

  • entryPoint— Il s'agit de la référence dans Amazon S3 au fichier principal JAR ou au fichier Python que vous souhaitez exécuter. Si vous utilisez un Scala ou un JavaJAR, spécifiez la classe d'entrée principale dans l'--classargument SparkSubmitParameters using the.

Pour plus d'informations, consultez la rubrique Lancement d'applications à l'aide de spark-submit.

Paramètre de remplacement de la configuration Spark

configurationOverridesÀ utiliser pour remplacer les propriétés de configuration au niveau de la surveillance et au niveau de l'application. Ce paramètre accepte un JSON objet contenant les deux champs suivants :

  • monitoringConfiguration‐ Utilisez ce champ pour spécifier l'Amazon S3 URL (s3MonitoringConfiguration) où vous souhaitez que la tâche EMR sans serveur stocke les journaux de votre tâche Spark. Assurez-vous d'avoir créé ce compartiment dans le même compartiment Compte AWS que celui qui héberge votre application et dans celui Région AWS où votre tâche est exécutée.

  • applicationConfiguration— Pour remplacer les configurations par défaut des applications, vous pouvez fournir un objet de configuration dans ce champ. Vous pouvez utiliser une syntaxe abrégée pour fournir la configuration ou vous pouvez faire référence à l'objet de configuration dans un JSON fichier. Les objets de configuration sont composés d'une classification, de propriétés et de configurations imbriquées en option. Les propriétés sont les paramètres que vous souhaitez remplacer dans ce fichier. Vous pouvez définir plusieurs classifications pour plusieurs applications dans un seul JSON objet.

    Note

    Les classifications de configuration disponibles varient en fonction de la version EMR Serverless spécifique. Par exemple, les classifications pour Log4j personnalisées ne spark-executor-log4j2 sont disponibles qu'avec les versions 6.8.0 spark-driver-log4j2 et supérieures.

Si vous utilisez la même configuration dans une dérogation d'application et dans les paramètres d'envoi de Spark, les paramètres d'envoi de Spark sont prioritaires. Les configurations sont classées par ordre de priorité comme suit, du plus haut au plus bas :

  • Configuration fournie par EMR Serverless lors de sa création. SparkSession

  • Configuration que vous fournissez dans le cadre sparkSubmitParameters de l'--confargument.

  • La configuration que vous fournissez dans le cadre de votre application remplace lorsque vous démarrez une tâche.

  • Configuration que vous fournissez runtimeConfiguration lors de la création d'une application.

  • Configurations optimisées EMR utilisées par Amazon pour cette version.

  • Configurations open-source par défaut pour l'application.

Pour plus d'informations sur la déclaration de configurations au niveau de l'application et sur le remplacement de configurations lors de l'exécution d'une tâche, consultezConfiguration d'application par défaut pour EMR Serverless.

Optimisation dynamique de l'allocation des ressources

dynamicAllocationOptimizationÀ utiliser pour optimiser l'utilisation des ressources dans EMR Serverless. La définition de cette propriété sur true dans votre classification de configuration Spark indique à EMR Serverless d'optimiser l'allocation des ressources des exécuteurs afin de mieux aligner le taux auquel Spark demande et annule des exécuteurs avec le taux auquel EMR Serverless crée et libère des travailleurs. EMRServerless réutilise ainsi de manière plus optimale les travailleurs d'une étape à l'autre, ce qui permet de réduire les coûts lors de l'exécution de tâches comportant plusieurs étapes tout en maintenant les mêmes performances.

Cette propriété est disponible dans toutes les EMR versions d'Amazon.

Voici un exemple de classification de configuration avecdynamicAllocationOptimization.

[ { "Classification": "spark", "Properties": { "dynamicAllocationOptimization": "true" } } ]

Tenez compte des points suivants si vous utilisez l'optimisation de l'allocation dynamique :

  • Cette optimisation est disponible pour les tâches Spark pour lesquelles vous avez activé l'allocation dynamique des ressources.

  • Pour obtenir le meilleur rapport coût-efficacité, nous vous recommandons de configurer une limite d'échelle supérieure pour les travailleurs en utilisant soit le paramètre au niveau de la tâche, spark.dynamicAllocation.maxExecutors soit le paramètre de capacité maximale au niveau de l'application en fonction de votre charge de travail.

  • Il se peut que vous ne constatiez pas d'amélioration des coûts dans les tâches plus simples. Par exemple, si votre tâche s'exécute sur un petit ensemble de données ou s'exécute en une seule étape, Spark n'a peut-être pas besoin d'un plus grand nombre d'exécuteurs ou de plusieurs événements de dimensionnement.

  • Les tâches comportant une séquence composée d'une grande étape, d'étapes plus petites, puis d'une nouvelle étape de grande envergure peuvent connaître une régression au cours de l'exécution des tâches. Comme le EMR mode Serverless utilise les ressources de manière plus efficace, cela peut entraîner une diminution du nombre de travailleurs disponibles pour les étapes plus importantes, ce qui se traduit par un allongement du temps d'exécution.

Propriétés de la tâche Spark

Le tableau suivant répertorie les propriétés Spark facultatives et leurs valeurs par défaut que vous pouvez remplacer lorsque vous soumettez une tâche Spark.

Clé Description Valeur par défaut
spark.archives Liste d'archives séparées par des virgules que Spark extrait dans le répertoire de travail de chaque exécuteur. Les types de fichiers pris en charge incluent .jar .tar.gz, .tgz et.zip. Pour spécifier le nom du répertoire à extraire, ajoutez-le # après le nom du fichier que vous souhaitez extraire. Par exemple, file.zip#directory. NULL
spark.authenticate Option qui active l'authentification des connexions internes de Spark. TRUE
spark.driver.cores Nombre de cœurs utilisés par le pilote. 4
spark.driver.extraJavaOptions Options Java supplémentaires pour le pilote Spark. NULL
spark.driver.memory La quantité de mémoire utilisée par le pilote. 14 G
spark.dynamicAllocation.enabled Option qui active l'allocation dynamique des ressources. Cette option augmente ou diminue le nombre d'exécuteurs enregistrés auprès de l'application, en fonction de la charge de travail. TRUE
spark.dynamicAllocation.executorIdleTimeout Durée pendant laquelle un exécuteur peut rester inactif avant que Spark ne le supprime. Cela ne s'applique que si vous activez l'allocation dynamique. Années 60
spark.dynamicAllocation.initialExecutors Le nombre initial d'exécuteurs à exécuter si vous activez l'allocation dynamique. 3
spark.dynamicAllocation.maxExecutors Limite supérieure du nombre d'exécuteurs si vous activez l'allocation dynamique.

Pour les versions 6.10.0 et supérieures, infinity

Pour les versions 6.9.0 et antérieures, 100

spark.dynamicAllocation.minExecutors Limite inférieure du nombre d'exécuteurs si vous activez l'allocation dynamique. 0
spark.emr-serverless.allocation.batch.size Le nombre de conteneurs à demander dans chaque cycle d'allocation d'exécuteur. Il y a un intervalle d'une seconde entre chaque cycle d'allocation. 20
spark.emr-serverless.driver.disk Le disque du pilote Spark. 20G
spark.emr-serverless.driverEnv.[KEY] Option qui ajoute des variables d'environnement au pilote Spark. NULL
spark.emr-serverless.executor.disk Le disque exécuteur Spark. 20G
spark.emr-serverless.memoryOverheadFactor Définit la surcharge de mémoire à ajouter à la mémoire du conteneur du pilote et de l'exécuteur. 0.1
spark.emr-serverless.driver.disk.type Type de disque connecté au pilote Spark. Standard
spark.emr-serverless.executor.disk.type Type de disque attaché aux exécuteurs Spark. Standard
spark.executor.cores Le nombre de cœurs utilisés par chaque exécuteur. 4
spark.executor.extraJavaOptions Options Java supplémentaires pour l'exécuteur Spark. NULL
spark.executor.instances Nombre de conteneurs d'exécuteurs Spark à allouer. 3
spark.executor.memory La quantité de mémoire utilisée par chaque exécuteur. 14 G
spark.executorEnv.[KEY] Option qui ajoute des variables d'environnement aux exécuteurs Spark. NULL
spark.files Une liste de fichiers séparés par des virgules à placer dans le répertoire de travail de chaque exécuteur. Vous pouvez accéder aux chemins de ces fichiers dans l'exécuteur avecSparkFiles.get(fileName). NULL
spark.hadoop.hive.metastore.client.factory.class La classe d'implémentation du métastore Hive. NULL
spark.jars JAR supplémentaires à ajouter au chemin de classe d'exécution du pilote et des exécuteurs. NULL
spark.network.crypto.enabled Option qui active le RPC chiffrement AES basé sur le chiffrement. Cela inclut le protocole d'authentification ajouté dans Spark 2.2.0. FALSE
spark.sql.warehouse.dir Emplacement par défaut pour les bases de données et les tables gérées. Pour $PWD/spark-warehouse
spark.submit.pyFiles Liste séparée par des .zip virgules .egg de ou de .py fichiers à placer dans les applications PYTHONPATH Python. NULL

Le tableau suivant répertorie les paramètres d'envoi par défaut de Spark.

Clé Description Valeur par défaut
archives Liste d'archives séparées par des virgules que Spark extrait dans le répertoire de travail de chaque exécuteur. NULL
class Classe principale de l'application (pour les applications Java et Scala). NULL
conf Propriété de configuration arbitraire de Spark. NULL
driver-cores Nombre de cœurs utilisés par le pilote. 4
driver-memory La quantité de mémoire utilisée par le pilote. 14 G
executor-cores Le nombre de cœurs utilisés par chaque exécuteur. 4
executor-memory Quantité de mémoire utilisée par l'exécuteur. 14 G
files Liste de fichiers séparés par des virgules à placer dans le répertoire de travail de chaque exécuteur. Vous pouvez accéder aux chemins de ces fichiers dans l'exécuteur avecSparkFiles.get(fileName). NULL
jars Une liste de fichiers jar séparés par des virgules à inclure dans les chemins de classe du pilote et de l'exécuteur. NULL
num-executors Nombre d'exécuteurs à lancer. 3
py-files Une liste séparée par des virgules de .zip.egg, ou de .py fichiers à placer sur les applications PYTHONPATH Python. NULL
verbose Option qui active une sortie de débogage supplémentaire. NULL

Exemples Spark

L'exemple suivant montre comment utiliser le StartJobRun API pour exécuter un script Python. Pour un end-to-end didacticiel utilisant cet exemple, voirCommencer à utiliser Amazon EMR Serverless. Vous trouverez d'autres exemples d'exécution de PySpark tâches et d'ajout de dépendances Python dans le GitHub référentiel EMRServerless Samples.

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py", "entryPointArguments": ["s3://amzn-s3-demo-destination-bucket/wordcount_output"], "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1" } }'

L'exemple suivant montre comment utiliser le StartJobRun API pour exécuter un SparkJAR.

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": ["1"], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1" } }'