Configuration de Spark - 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.

Configuration de Spark

Vous pouvez configurer Spark sur Amazon à l'EMRaide de classifications de configuration. Pour plus d'informations sur les classifications de configuration, consultez Configuration des applications.

Les classifications de configuration pour Spark on Amazon EMR sont les suivantes :

  • spark – Définit la propriété maximizeResourceAllocation sur la valeur true ou false. Lorsque c'est vrai, Amazon configure EMR automatiquement les spark-defaults propriétés en fonction de la configuration matérielle du cluster. Pour de plus amples informations, veuillez consulter Utiliser maximizeResourceAllocation.

  • spark-defaults – Définit les valeurs dans le fichier spark-defaults.conf. Pour plus d'informations, consultez Configuration Spark dans la documentation Spark.

  • spark-env – Définit les valeurs dans le fichier spark-env.sh. Pour plus d'informations, consultez Variables d'environnement dans la documentation Spark.

  • spark-hive-site – Définit les valeurs dans le hive-site.xml pour Spark.

  • spark-log4j— (Amazon EMR versions 6.7.x et antérieures) Définit les valeurs dans le log4j.properties fichier. Pour plus d'informations, consultez le fichier log4j.properties.template sur Github.

  • spark-log4j2— (Amazon EMR versions 6.8.0 et supérieures) Définit les valeurs dans le log4j2.properties fichier. Pour plus d'informations, consultez le fichier log4j2.properties.template sur Github.

  • spark-metrics – Définit les valeurs dans le fichier metrics.properties. Pour les paramètres et plus d'informations, consultez le fichier metrics.properties.template sur Github, et Métriques dans la documentation Spark.

Note

Si vous migrez des charges de travail Spark vers Amazon EMR depuis une autre plateforme, nous vous recommandons de tester vos charges de travail avec le Paramètres par défaut de Spark définis par Amazon EMR avant d'ajouter des configurations personnalisées. La plupart des clients constatent une amélioration des performances grâce à nos paramètres par défaut.

Paramètres par défaut de Spark définis par Amazon EMR

Le tableau suivant montre comment Amazon EMR définit les valeurs par défaut spark-defaults qui affectent les applications.

Paramètres par défaut de Spark définis par Amazon EMR
Paramètre Description Valeur par défaut
spark.executor.memory

Quantité de mémoire à utiliser par processus d'exécution. Par exemple, 1g, 2g.

Ce paramètre est déterminé par les types d'instance de noyau et de tâche dans le cluster.

spark.executor.cores

Le nombre de cœurs à utiliser sur chaque exécuteur.

Ce paramètre est déterminé par les types d'instance de noyau et de tâche dans le cluster.

spark.dynamicAllocation.enabled

Lorsque cela est vrai, utilisez l'allocation dynamique des ressources pour augmenter ou réduire le nombre d'exécuteurs enregistrés avec une application en fonction de la charge de travail.

true(avec Amazon EMR 4.4.0 et versions ultérieures)

Note

Le service Spark Shuffle est automatiquement configuré par Amazon. EMR

spark.sql.hive.advancedPartitionPredicatePushdown.enabled

Lorsque c'est vrai, le transfert avancé des prédicats de partition vers le métastore Hive est activé.

true
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled

Pousse vers le bas les filtres startsWith, contains et endsWith dans le métastore Hive.

Note

Glue ne prend pas en charge le push down des prédicats pour startsWith, contains, ou endsWith. Si vous utilisez le métastore Glue et que vous rencontrez des erreurs en raison de l'activation des prédicats pour ces fonctions, définissez cette configuration sur false.

true

Configuration de la collecte des déchets Spark sur Amazon EMR 6.1.0

La définition de configurations personnalisées de collecte des déchets avec spark.driver.extraJavaOptions et spark.executor.extraJavaOptions entraîne un échec du lancement du pilote ou de l'exécuteur avec Amazon EMR 6.1 en raison d'une configuration de collecte des déchets conflictuelle avec Amazon EMR 6.1.0. Pour Amazon EMR 6.1.0, la configuration de collecte des déchets par défaut est définie via spark.driver.defaultJavaOptions etspark.executor.defaultJavaOptions. Cette configuration s'applique uniquement à Amazon EMR 6.1.0. JVMles options non liées à la collecte des déchets, telles que celles permettant de configurer logging (-verbose:class), peuvent toujours être définiesextraJavaOptions. Pour plus d'informations, consultez Propriétés de l'application Spark.

Utiliser maximizeResourceAllocation

Pour configurer vos exécuteurs afin qu'ils utilisent le maximum de ressources possibles sur chaque nœud d'un cluster, définissez maximizeResourceAllocation sur true dans votre classification de configuration spark. maximizeResourceAllocationC'est spécifique à AmazonEMR. Lorsque vous l'activezmaximizeResourceAllocation, Amazon EMR calcule les ressources de calcul et de mémoire maximales disponibles pour un exécuteur sur une instance du groupe d'instances principal. Il définit ensuite les paramètres correspondants spark-defaults en fonction des valeurs maximales calculées.

Amazon EMR calcule les ressources de calcul et de mémoire maximales disponibles pour un exécuteur en fonction d'un type d'instance issu du parc d'instances principal. Étant donné que chaque parc d'instances peut avoir des types et des tailles d'instances différents au sein d'un même parc, la configuration d'exécuteur EMR utilisée par Amazon n'est peut-être pas la meilleure pour vos clusters. Nous vous déconseillons donc d'utiliser les paramètres par défaut lors de l'utilisation d'une allocation de ressources maximale. Configurez des paramètres personnalisés pour vos clusters de flotte d'instances.

Note

Vous ne devez pas utiliser l'maximizeResourceAllocationoption sur des clusters contenant d'autres applications distribuées telles queHBase. Amazon EMR utilise des YARN configurations personnalisées pour les applications distribuées, qui peuvent entrer en conflit avec maximizeResourceAllocation les applications Spark et provoquer leur échec.

Voici un exemple de classification de configuration Spark avec maximizeResourceAllocation défini sur true.

[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
Paramètres configurés dans spark-defaults lorsque maximizeResourceAllocation est activé
Paramètre Description Valeur
spark.default.parallelism Le nombre de partitions par défaut RDDs est renvoyé par des transformations telles que jointure et parallélisation lorsqu'elles ne sont pas définies par l'utilisateur. reduceByKey

2 fois le nombre de CPU cœurs disponibles pour les YARN conteneurs.

spark.driver.memory Quantité de mémoire à utiliser pour le processus du pilote, c'est-à-dire où SparkContext est initialisé. (par exemple, 1 g, 2 g).

Le paramétrage est configuré en fonction des types d'instances dans le cluster. Cependant, étant donné que l'application du pilote Spark peut s'exécuter sur l'instance principale ou sur l'une des instances principales (par exemple, en mode YARN client et en mode cluster, respectivement), elle est définie en fonction du plus petit des types d'instances de ces deux groupes d'instances.

spark.executor.memory Volume de mémoire à utiliser par les processus de l'exécuteur. (par exemple, 1g, 2g)

Le paramétrage est configuré en fonction des types d'instances de noyau et de tâches dans le cluster.

spark.executor.cores Le nombre de cœurs à utiliser sur chaque exécuteur. Le paramétrage est configuré en fonction des types d'instances de noyau et de tâches dans le cluster.
spark.executor.instances Le nombre d'exécuteurs.

Le paramétrage est configuré en fonction des types d'instances de noyau et de tâches dans le cluster. Définissez, sauf si spark.dynamicAllocation.enabled définit explicitement sur true en même temps.

Configuration du comportement de mise hors service du nœud

Avec les EMR versions 5.9.0 et supérieures d'Amazon, Spark on Amazon EMR inclut un ensemble de fonctionnalités permettant de garantir que Spark gère correctement la terminaison des nœuds en raison d'un redimensionnement manuel ou d'une demande de politique de dimensionnement automatique. Amazon EMR implémente un mécanisme de refus d'inscription dans Spark qui repose sur le mécanisme de YARN mise hors service. Ce mécanisme aide à garantir qu'aucune nouvelle tâche n'est planifiée sur un nœud qui est mis hors service, tout en autorisant dans le même temps que les tâches déjà en cours d'exécution se terminent. En outre, il existe des fonctionnalités qui permettent de rétablir les tâches Spark plus rapidement en cas de perte de blocs aléatoires lors de la terminaison d'un nœud. Le processus de recalcul est déclenché plus tôt et optimisé pour un recalcul plus rapide avec moins de tentatives d'étape ; en outre, il est possible d'empêcher l'échec des tâches dû aux défaillances d'extraction provoquées par les blocs aléatoires manquants.

Important

Le spark.decommissioning.timeout.threshold paramètre a été ajouté dans la EMR version 5.11.0 d'Amazon pour améliorer la résilience de Spark lorsque vous utilisez des instances Spot. Dans les versions précédentes, lorsqu'un nœud utilise une instance Spot et que l'instance est terminée en raison du prix de l'offre, Spark peut ne pas gérer correctement la terminaison. Les tâches peuvent échouer et les recalculs aléatoires peuvent nécessiter un temps important. Pour cette raison, nous vous conseillons d'utiliser la version 5.11.0 ou une version ultérieure si vous utilisez des instances Spot.

Paramètres de mise hors service d'un nœud Spark
Paramètre Description Valeur par défaut

spark.blacklist.decommissioning.enabled

Lorsqu'il est défini surtrue, Spark Deny répertorie les nœuds dont l'decommissioningétat est dansYARN. Spark ne planifie pas de nouvelles tâches sur les exécuteurs s'exécutant sur ce nœud. Les tâches déjà en cours d'exécution sont autorisées à se terminer.

true

spark.blacklist.decommissioning.timeout

La durée pendant laquelle un nœud dans l'état decommissioning est sur la liste de refus. Par défaut, cette valeur est définie sur une heure, qui est aussi l'heure par défaut pour yarn.resourcemanager.decommissioning.timeout. Pour s'assurer qu'un nœud est placé sur liste noire pendant toute la période de sa mise hors service, définissez une valeur égale ou supérieure à yarn.resourcemanager.decommissioning.timeout. Une fois le délai de mise hors service expiré, le nœud passe à un decommissioned état et Amazon EMR peut mettre fin à l'instance du nœud. EC2 Si des tâches continuent à s'exécuter après l'expiration du délai, elles sont perdues ou supprimées, puis replanifiées sur les exécuteurs s'exécutant sur d'autres nœuds.

1h

spark.decommissioning.timeout.threshold

Disponible dans la EMR version 5.11.0 ou ultérieure d'Amazon. Indiqué en secondes. Lorsqu'un nœud passe à l'état de mise hors service, si l'hôte le met hors service dans un délai égal ou inférieur à cette valeur, Amazon refuse EMR non seulement d'inscrire le nœud, mais nettoie également l'état hôte (comme spécifié parspark.resourceManager.cleanupExpiredHost) sans attendre que le nœud passe à l'état hors service. Cela permet à Spark de mieux traiter les arrêts d'instances Spot car les instances Spot sont mises hors services dans un délai de 20 secondes, et ce quelle que soit la valeur de yarn.resourcemager.decommissioning.timeout, qui peut ne pas fournir aux autres nœuds suffisamment de temps pour lire les fichiers de lecture aléatoire.

20s

spark.resourceManager.cleanupExpiredHost

Lorsque la valeur est true, Spark annule l'inscription de l'ensemble des données mises en cache et des blocs aléatoires stockés dans les exécuteurs des nœuds qui se trouvent à l'état decommissioned. Le processus de récupération s'en trouve accéléré.

true

spark.stage.attempt.ignoreOnDecommissionFetchFailure

Lorsque la valeur est true, aide à empêcher que les phases Spark n'échouent et n'entraînent l'échec de la tâche en raison du trop grand nombre d'extractions à partir des nœuds mis hors service ayant elles-mêmes échoué. Les extractions défaillantes de blocs aléatoires d'un nœud ayant l'état decommissioned ne sont pas comptabilisées dans le nombre maximal d'extractions défaillantes consécutives.

true

Variable d' ThriftServer environnement Spark

Spark définit la variable d'environnement du port de serveur Thrift Hive, HIVE_SERVER2_THRIFT_PORT, sur 10001.

Modification des paramètres Spark par défaut

Vous modifiez les paramètres par défaut dans spark-defaults.conf à l'aide de la classification de configuration spark-defaults ou du paramètre maximizeResourceAllocation dans la classification de configuration spark.

Les procédures suivantes indiquent comment modifier les paramètres à l'aide de la console CLI or.

Pour créer un cluster avec spark.executor.memory défini sur 2g à l'aide du CLI
  • Créez un cluster avec Spark installé et la valeur spark.executor.memory définie sur 2g, à l'aide de la commande suivante, qui fait référence à un fichier, myConfig.json stocké dans Amazon S3.

    aws emr create-cluster --release-label emr-7.3.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json
    Note

    Les caractères de continuation de ligne Linux (\) sont inclus pour des raisons de lisibilité. Ils peuvent être supprimés ou utilisés dans les commandes Linux. Pour Windows, supprimez-les ou remplacez-les par un caret (^).

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]
Pour créer un cluster avec spark.executor.memory défini sur 2g à l'aide de la console
  1. Accédez à la nouvelle EMR console Amazon et sélectionnez Basculer vers l'ancienne console dans la navigation latérale. Pour plus d'informations sur ce qu'implique le passage à l'ancienne console, consultez la rubrique Utilisation de l'ancienne console.

  2. Choisissez Créer un cluster et Go to advanced options (Aller aux options avancées).

  3. Choisissez Spark.

  4. Sous Edit software settings (Modifier les paramètres logiciels), conservez l'option Enter configuration (Saisir la configuration) et saisissez la configuration suivante :

    classification=spark-defaults,properties=[spark.executor.memory=2G]
  5. Sélectionnez d'autres options, choisissez , puis Create cluster (Créer un cluster).

À régler maximizeResourceAllocation
  • Créez un cluster sur lequel Spark est installé et maximizeResourceAllocation défini sur true en utilisant le AWS CLI, en faisant référence à un fichiermyConfig.json, stocké dans Amazon S3.

    aws emr create-cluster --release-label emr-7.3.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json
    Note

    Les caractères de continuation de ligne Linux (\) sont inclus pour des raisons de lisibilité. Ils peuvent être supprimés ou utilisés dans les commandes Linux. Pour Windows, supprimez-les ou remplacez-les par un caret (^).

    myConfig.json:

    [ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
Note

Avec Amazon EMR version 5.21.0 et versions ultérieures, vous pouvez remplacer les configurations de cluster et spécifier des classifications de configuration supplémentaires pour chaque groupe d'instances d'un cluster en cours d'exécution. Pour ce faire, utilisez la EMR console Amazon, le AWS Command Line Interface (AWS CLI) ou le AWS SDK. Pour plus d'informations, consultez Fourniture d'une configuration pour un groupe d'instances dans un cluster en cours d'exécution.

Migration d'Apache Log4j 1.x vers Log4j 2.x

Les versions 3.2.x et antérieures d'Apache Spark utilisent l'ancien Apache Log4j 1.x et le fichier log4j.properties pour configurer Log4j dans les processus Spark. Les versions 3.3.0 et ultérieures d'Apache Spark utilisent Apache Log4j 2.x et le fichier log4j2.properties pour configurer Log4j dans les processus Spark.

Si vous avez configuré Apache Spark Log4j à l'aide d'une EMR version d'Amazon inférieure à la version 6.8.0, vous devez supprimer l'ancienne classification de spark-log4j configuration et migrer vers la classification de spark-log4j2 configuration et le format de clé avant de pouvoir passer à Amazon EMR 6.8.0 ou version ultérieure. L'ancienne spark-log4j classification entraîne l'échec de la création de clusters avec une ValidationException erreur dans les EMR versions 6.8.0 et ultérieures d'Amazon. Aucun frais ne vous sera facturé en cas de panne liée à l'incompatibilité de Log4j, mais vous devez supprimer la classification de configuration obsolète spark-log4j pour continuer.

Pour plus d'informations sur la migration d'Apache Log4j 1.x vers Log4j 2.x, consultez le Guide de migration d'Apache Log4j et le Modèle Spark Log4j 2 sur Github.

Note

Avec AmazonEMR, Apache Spark utilise un log4j2.properties fichier plutôt que le fichier .xml décrit dans le guide de migration d'Apache Log4j. De plus, nous ne recommandons pas d'utiliser la méthode du pont Log4j 1.x pour convertir en Log4j 2.x.