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 d'Apache Iceberg dans Amazon EMR
Amazon EMR fournit un traitement de données à l'échelle du pétaoctet, des analyses interactives et un apprentissage automatique dans le cloud en utilisant des frameworks open source tels qu'Apache Spark, Apache Hive, Flink et Trino.
Note
Ce guide utilise Apache Spark à titre d'exemple.
Amazon EMR prend en charge plusieurs options de déploiement : Amazon EMR sur Amazon EC2, Amazon EMR sur Amazon EKS, Amazon EMR sans serveur et Amazon EMR activé. AWS Outposts Pour choisir une option de déploiement adaptée à votre charge de travail, consultez la FAQ Amazon EMR.
Compatibilité des versions et des fonctionnalités
Amazon EMR version 6.5.0 et versions ultérieures prennent en charge Apache Iceberg de manière native. Pour obtenir la liste des versions d'Iceberg prises en charge pour chaque version d'Amazon EMR, consultez l'historique des versions d'Iceberg dans la documentation Amazon EMR. Consultez également les considérations et les limites relatives à l'utilisation d'Iceberg sur Amazon EMR afin de déterminer quelles fonctionnalités d'Iceberg sont prises en charge dans Amazon EMR sur différents frameworks.
Nous vous recommandons d'utiliser la dernière version d'Amazon EMR pour bénéficier de la dernière version prise en charge d'Iceberg. Les exemples de code et les configurations présentés dans cette section supposent que vous utilisez la version emr-6.9.0 d'Amazon EMR.
Création d'un cluster Amazon EMR avec Iceberg
Plus précisément, votre cluster doit être configuré selon la classification suivante :
[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]
Vous pouvez également choisir d'utiliser Amazon EMR Serverless ou Amazon EMR sur Amazon EKS comme options de déploiement pour vos charges de travail Iceberg, à partir d'Amazon EMR 6.6.0.
Développement d'applications Iceberg dans Amazon EMR
Pour développer le code Spark pour vos applications Iceberg, vous pouvez utiliser Amazon EMR Studio, un environnement de développement intégré (IDE) basé sur le Web pour les blocs-notes Jupyter entièrement gérés qui s'exécutent sur des clusters Amazon EMR.
Utilisation des blocs-notes Amazon EMR Studio
Vous pouvez développer des applications Spark de manière interactive dans des blocs-notes Amazon EMR Studio Workspace et connecter ces blocs-notes à vos clusters Amazon EMR sur Amazon EC2 ou Amazon EMR sur des points de terminaison gérés par Amazon EKS. Consultez Service AWS la documentation pour obtenir des instructions sur la configuration d'un studio EMR pour Amazon EMR sur Amazon EC2 et Amazon EMR sur Amazon EKS.
Pour utiliser Iceberg dans EMR Studio, procédez comme suit :
-
Lancez un cluster Amazon EMR avec Iceberg activé, comme indiqué dans Utiliser un cluster avec Iceberg installé.
-
Configurez un studio EMR. Pour obtenir des instructions, consultez Configurer un studio Amazon EMR.
-
Ouvrez un bloc-notes EMR Studio Workspace et exécutez le code suivant dans la première cellule du bloc-notes pour configurer votre session Spark afin d'utiliser Iceberg :
%%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }
où :
-
<catalog_name>
est le nom de votre catalogue de sessions Iceberg Spark. Remplacez-le par le nom de votre catalogue et n'oubliez pas de modifier les références dans toutes les configurations associées à ce catalogue. Dans votre code, vous devez ensuite faire référence à vos tables Iceberg avec le nom complet de la table, y compris le nom du catalogue de sessions Spark, comme suit :<catalog_name>.<database_name>.<table_name>
-
<catalog_name>.warehouse
pointe vers le chemin Amazon S3 où vous souhaitez stocker vos données et métadonnées. -
Pour que le catalogue soit un AWS Glue Data Catalog, définissez
<catalog_name>.catalog-impl
surorg.apache.iceberg.aws.glue.GlueCatalog
. Cette clé est requise pour pointer vers une classe d'implémentation pour toute implémentation de catalogue personnalisé. La section Bonnes pratiques générales plus loin dans ce guide décrit les différents catalogues pris en charge par Iceberg. -
org.apache.iceberg.aws.s3.S3FileIO
Utilisez-le comme pour tirer parti du chargement partitionné sur Amazon S3 pour un parallélisme élevé.<catalog_name>.io-impl
-
-
Vous pouvez désormais commencer à développer votre application Spark pour Iceberg de manière interactive dans le bloc-notes, comme vous le feriez pour n'importe quelle autre application Spark.
Pour plus d'informations sur la configuration de Spark pour Apache Iceberg à l'aide d'Amazon EMR Studio, consultez le billet de blog Créez un lac de données évolutif à hautes performances, conforme à l'ACID et évolutif à l'aide d'Apache Iceberg sur Amazon
Exécution de tâches Iceberg dans Amazon EMR
Après avoir développé le code d'application Spark pour votre charge de travail Iceberg, vous pouvez l'exécuter sur n'importe quelle option de déploiement Amazon EMR compatible avec Iceberg (voir la FAQ Amazon EMR
Comme pour les autres tâches Spark, vous pouvez soumettre du travail à un cluster Amazon EMR sur Amazon EC2 en ajoutant des étapes ou en soumettant des tâches Spark de manière interactive au nœud principal. Pour exécuter une tâche Spark, consultez les pages de documentation Amazon EMR suivantes :
-
Pour un aperçu des différentes options de soumission d'un travail à un cluster Amazon EMR sur Amazon EC2 et des instructions détaillées pour chaque option, consultez Soumettre un travail à un cluster.
-
Pour Amazon EMR sur Amazon EKS, consultez Exécuter des tâches Spark avec. StartJobRun
Les sections suivantes fournissent un exemple pour chaque option de déploiement d'Amazon EMR.
Amazon EMR sur Amazon EC2
Vous pouvez suivre les étapes suivantes pour soumettre le job Iceberg Spark :
-
Créez le fichier
emr_step_iceberg.json
avec le contenu suivant sur votre poste de travail :[{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--conf", "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "--conf", "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog", "--conf", "spark.sql.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "--conf", "spark.sql.catalog.<catalog_name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
-
Modifiez le fichier de configuration pour votre tâche Spark spécifique en personnalisant les options de configuration d'Iceberg surlignées en gras.
-
Soumettez l'étape en utilisant le AWS Command Line Interface (AWS CLI). Exécutez la commande dans le répertoire où se trouve le
emr_step_iceberg.json
fichier.aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json
Amazon EMR sans serveur
Pour soumettre une tâche Iceberg Spark à Amazon EMR Serverless en utilisant : AWS CLI
-
Créez le fichier
emr_serverless_iceberg.json
avec le contenu suivant sur votre poste de travail :{ "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars /usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
-
Modifiez le fichier de configuration pour votre tâche Spark spécifique en personnalisant les options de configuration d'Iceberg surlignées en gras.
-
Soumettez le travail en utilisant le AWS CLI. Exécutez la commande dans le répertoire où se trouve le
emr_serverless_iceberg.json
fichier :aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json
Pour soumettre une tâche Iceberg Spark à Amazon EMR Serverless à l'aide de la console EMR Studio :
Suivez les instructions de la documentation Amazon EMR Serverless.
Pour la configuration de Job, utilisez la configuration Iceberg pour Spark fournie pour Iceberg AWS CLI et personnalisez les champs surlignés pour Iceberg. Pour obtenir des instructions détaillées, consultez la section Utilisation d'Apache Iceberg avec EMR sans serveur dans la documentation Amazon EMR.
Amazon EMR sur Amazon EKS
Pour soumettre une tâche Iceberg Spark à Amazon EMR sur Amazon EKS en utilisant : AWS CLI
-
Créez le fichier
emr_eks_iceberg.json
avec le contenu suivant sur votre poste de travail :{ "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
-
Modifiez le fichier de configuration de votre tâche Spark en personnalisant les options de configuration d'Iceberg surlignées en gras.
-
Soumettez le travail en utilisant le AWS CLI. Exécutez la commande suivante dans le répertoire où se trouve le
emr_eks_iceberg.json
fichier :aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json
Pour obtenir des instructions détaillées, consultez la section Utilisation d'Apache Iceberg avec Amazon EMR sur EKS dans la documentation Amazon EMR sur EKS.
Bonnes pratiques pour Amazon EMR
Cette section fournit des directives générales pour le réglage des tâches Spark dans Amazon EMR afin d'optimiser la lecture et l'écriture des données dans les tables Iceberg. Pour connaître les meilleures pratiques spécifiques à Iceberg, consultez la section Meilleures pratiques plus loin dans ce guide.
-
Utilisez la dernière version d'Amazon EMR : Amazon EMR fournit des optimisations Spark prêtes à l'emploi avec le runtime Amazon EMR Spark. AWS améliore les performances du moteur d'exécution Spark à chaque nouvelle version.
-
Déterminez l'infrastructure optimale pour vos charges de travail Spark : les charges de travail Spark peuvent nécessiter différents types de matériel pour différentes caractéristiques de travail afin de garantir des performances optimales. Amazon EMR prend en charge plusieurs types d'instances (optimisées pour le calcul, pour la mémoire, pour usage général et pour le stockage) afin de répondre à tous les types d'exigences de traitement. Lorsque vous intégrez de nouvelles charges de travail, nous vous recommandons de les comparer à des types d'instances généraux tels que M5 ou M6g. Surveillez le système d'exploitation (OS) et les métriques YARN de Ganglia et Amazon CloudWatch afin de déterminer les goulots d'étranglement du système (processeur, mémoire, stockage et E/S) en cas de charge maximale et choisissez le matériel approprié.
-
spark.sql.shuffle.partitions
Régler : définissez laspark.sql.shuffle.partitions
propriété sur le nombre total de cœurs virtuels (vCores) de votre cluster ou sur un multiple de cette valeur (généralement, 1 à 2 fois le nombre total de vCores). Ce paramètre affecte le parallélisme de Spark lorsque vous utilisez le partitionnement par hachage et par plage comme mode de distribution d'écriture. Il demande un shuffle avant d'écrire pour organiser les données, ce qui garantit l'alignement des partitions. -
Activer le dimensionnement géré : dans presque tous les cas d'utilisation, nous vous recommandons d'activer le dimensionnement géré et l'allocation dynamique. Toutefois, si votre charge de travail présente un schéma prévisible, nous vous suggérons de désactiver le dimensionnement automatique et l'allocation dynamique. Lorsque le dimensionnement géré est activé, nous vous recommandons d'utiliser des instances Spot pour réduire les coûts. Utilisez des instances Spot pour les nœuds de tâches plutôt que pour les nœuds principaux ou principaux. Lorsque vous utilisez des instances Spot, utilisez des flottes d'instances avec plusieurs types d'instances par flotte pour garantir la disponibilité des instances ponctuelles.
-
Utilisez la jointure par diffusion lorsque cela est possible : la jointure par diffusion (côté carte) est la meilleure jointure, à condition que l'une de vos tables soit suffisamment petite pour tenir dans la mémoire de votre plus petit nœud (de l'ordre des Mo) et que vous effectuez une jointure equi (=). Tous les types de jointure, à l'exception des jointures externes complètes, sont pris en charge. Une jointure de diffusion diffuse la plus petite table sous forme de table de hachage sur tous les nœuds de travail en mémoire. Une fois la petite table diffusée, vous ne pouvez pas y apporter de modifications. Comme la table de hachage se trouve localement dans la machine virtuelle Java (JVM), elle peut être facilement fusionnée avec la grande table en fonction de la condition de jointure à l'aide d'une jointure par hachage. Les jointures de diffusion offrent des performances élevées en raison d'une surcharge minimale liée au shuffle.
-
Régler le ramasse-miettes — Si les cycles de collecte des déchets (GC) sont lents, envisagez de passer du ramasse-miettes parallèle par défaut au G1GC pour de meilleures performances. Pour optimiser les performances du GC, vous pouvez affiner les paramètres du GC. Pour suivre les performances du GC, vous pouvez les surveiller à l'aide de l'interface utilisateur Spark. Idéalement, la durée du GC doit être inférieure ou égale à 1 % de l'exécution totale de la tâche.