

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.

# Utiliser un cluster Iceberg avec Spark
<a name="emr-iceberg-use-spark-cluster"></a>

À partir de la version 6.5.0 d'Amazon EMR, vous pouvez utiliser Iceberg avec votre cluster Spark sans avoir à inclure d'actions de démarrage. Pour les versions 6.4.0 et antérieures d'Amazon EMR, vous pouvez utiliser une action d'amorçage pour préinstaller toutes les dépendances nécessaires.

Dans ce didacticiel, vous allez utiliser le AWS CLI pour travailler avec Iceberg sur un cluster Amazon EMR Spark. Pour utiliser la console afin de créer un cluster avec Iceberg installé, suivez les étapes de la section [Création d'un lac de données Apache Iceberg à l'aide d'Amazon Athena, d'Amazon EMR et d' AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/).

## Création d'un cluster Iceberg
<a name="emr-iceberg-create-cluster"></a>

Vous pouvez créer un cluster sur lequel Iceberg est installé à l'aide de l'API Console de gestion AWS Amazon EMR AWS CLI ou de l'API Amazon EMR. Dans ce didacticiel, vous allez utiliser le AWS CLI pour travailler avec Iceberg sur un cluster Amazon EMR. Pour utiliser la console afin de créer un cluster avec Iceberg installé, suivez les étapes de la section [Création d'un lac de données Apache Iceberg à l'aide d'Amazon Athena, d'Amazon EMR et d' AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/). 

Pour utiliser Iceberg sur Amazon EMR avec le AWS CLI, créez d'abord un cluster en suivant les étapes suivantes. Pour plus d'informations sur la spécification de la classification Iceberg à l'aide du AWS CLI, voir [Fournissez une configuration à l'aide du AWS CLI lorsque vous créez un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) ou[Fournir une configuration à l'aide du kit SDK Java lors de la création d'un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk).

1. Créez un fichier `configurations.json` avec le contenu suivant :

   ```
   [{
       "Classification":"iceberg-defaults",
       "Properties":{"iceberg.enabled":"true"}
   }]
   ```

1. Créez ensuite un cluster à l'aide de la configuration suivante. Remplacez l'exemple de chemin de compartiment Amazon S3 et l'ID de sous-réseau par les vôtres.

   ```
   aws emr create-cluster --release-label emr-6.5.0 \
   --applications Name=Spark \
   --configurations file://configurations.json \
   --region us-east-1 \
   --name My_Spark_Iceberg_Cluster \
   --log-uri s3://{{amzn-s3-demo-bucket/}} \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role EMR_DefaultRole_V2 \ 
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId={{subnet-1234567890abcdef0}}
   ```

Vous pouvez également créer un cluster Amazon EMR incluant l'application Spark et inclure le fichier `/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` en tant que dépendance JAR dans une tâche Spark. Pour plus d'informations, consultez [Soumission d'applications](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications).

Pour inclure le fichier jar en tant que dépendance dans une tâche Spark, ajoutez la propriété de configuration suivante à l'application Spark :

```
--conf "spark.jars=/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar"
```

Pour plus d'informations sur les dépendances des tâches Spark, consultez la section [Gestion des dépendances](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management) dans le document d'Apache Spark [Running Spark on Kubernetes](https://spark.apache.org/docs/latest/running-on-kubernetes.html).

## Initialisation d'une session Spark pour Iceberg
<a name="emr-iceberg-initialize-spark-session"></a>

Les exemples suivants montrent comment lancer le shell Spark interactif, utiliser Spark submit ou utiliser Blocs-notes EMR pour travailler avec Iceberg sur Amazon EMR.

------
#### [ spark-shell ]

1. Connexion au nœud principal à l'aide de SSH Pour plus d'informations, consultez [Connexion au nœud principal à l'aide de SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) dans le *Guide de gestion d'Amazon EMR*.

1. Entrez la commande suivante pour lancer le shell Spark. Pour utiliser la PySpark coque, remplacez-la `spark-shell` par`pyspark`.

   ```
   spark-shell \
       --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket}}/{{prefix}}/
       --conf spark.sql.catalog.my_catalog.type=glue \
       --conf spark.sql.defaultCatalog=my_catalog \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ spark-submit ]

1. Connexion au nœud principal à l'aide de SSH Pour plus d'informations, consultez [Connexion au nœud principal à l'aide de SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) dans le *Guide de gestion d'Amazon EMR*.

1. Entrez la commande suivante pour lancer la session Spark pour Iceberg.

   ```
   spark-submit \
   --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
   --conf spark.sql.catalog.my_catalog.type=glue \
   --conf spark.sql.defaultCatalog=my_catalog \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ EMR Studio notebooks ]

Pour initialiser une session Spark à l'aide des blocs-notes EMR Studio, configurez votre session Spark à l'aide de la commande magique `%%configure` de votre bloc-notes Amazon EMR, comme dans l'exemple suivant. Pour plus d'informations, consultez [Utilisation des magies de Blocs-notes EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics) dans le *Guide de gestion Amazon EMR*.

```
%%configure -f{
"conf":{
    "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.my_catalog.type":"glue",
    "spark.sql.catalog.my_catalog.warehouse":"s3://{{amzn-s3-demo-bucket1}}/{{prefix}}/",
    "spark.sql.defaultCatalog":"my_catalog",
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
}
```

------
#### [ CLI ]

Pour initialiser un cluster Spark à l'aide de l'interface de ligne de commande et définir toutes les configurations par défaut de la session Spark Iceberg, exécutez l'exemple suivant. Pour plus d'informations sur la spécification d'une classification de configuration à l'aide de AWS CLI l'API Amazon EMR, consultez la section [ Configuration des applications](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html).

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
      "spark.sql.catalog.my_catalog.type":"glue",
      "spark.sql.catalog.my_catalog.warehouse":"s3://{{amzn-s3-demo-bucket1}}/{{prefix}}/",
      "spark.sql.defaultCatalog":"my_catalog",
      "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }
]
```

------

## Écriture dans une table Iceberg
<a name="emr-iceberg-write-to-table"></a>

L'exemple suivant montre comment créer un jeu de données Iceberg DataFrame et l'écrire en tant que jeu de données Iceberg. Les exemples illustrent l'utilisation des jeux de données à l'aide du shell Spark lorsque vous êtes connecté au nœud principal à l'aide de SSH comme utilisateur hadoop par défaut.

**Note**  
Pour coller des exemples de code dans le shell Spark, tapez `:paste` à l'invite, collez l'exemple, puis appuyez sur `CTRL+D`.

------
#### [ PySpark ]

Spark inclut un Python-based shell que vous pouvez utiliser pour prototyper des programmes Spark écrits en Python. `pyspark` Invoquez `pyspark` sur le nœud principal.

```
## Create a DataFrame.
data = spark.createDataFrame([
 ("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
 ("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
 ("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
 ("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
],["id", "creation_date", "last_update_time"])

## Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://{{amzn-s3-demo-bucket}}/{{example-prefix}}/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------
#### [ Scala ]

```
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.functions._

// Create a DataFrame.
val data = Seq(
("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
).toDF("id", "creation_date", "last_update_time")

// Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://{{amzn-s3-demo-bucket}}/{{example-prefix}}/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------

## Lecture à partir d'une table Iceberg
<a name="emr-iceberg-read-from-table"></a>

------
#### [ PySpark ]

```
df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Scala ]

```
val df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Spark SQL ]

```
SELECT * from dev.db.iceberg_table LIMIT 10
```

------

## Utilisation AWS Catalogue de données Glue avec Spark Iceberg
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Vous pouvez vous connecter au catalogue de données AWS Glue depuis Spark Iceberg. Cette section présente les différentes commandes de connexion.

### Connexion à la configuration par défaut AWS Collez le catalogue dans votre région par défaut
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Cet exemple montre comment se connecter à l'aide du type de catalogue Glue. Si vous ne spécifiez pas d'identifiant de catalogue, il utilise la valeur par défaut :

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

### Connectez-vous à un AWS Collez le catalogue avec un identifiant de catalogue spécifique
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Cet exemple montre comment se connecter à l'aide d'un identifiant de catalogue :

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.catalog.my_catalog.glue.id={{AWS Glue catalog ID}} \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

Cette commande peut être utilisée pour se connecter à un catalogue AWS Glue dans un autre compte, à un catalogue RMS ou à un catalogue fédéré.

## Utilisation du catalogue Iceberg REST (IRC) avec Spark Iceberg
<a name="emr-iceberg-rest-catalog-config"></a>

Les sections suivantes expliquent comment configurer l'intégration d'Iceberg à un catalogue.

### Se connecter à AWS Point de terminaison IRC Glue Data Catalog
<a name="emr-iceberg-rest-catalog-config-gdc"></a>

Voici un exemple de `spark-submit` commande permettant d'utiliser Iceberg REST :

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse={{glue catalog ID}} \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri={{glue endpoint URI}}/iceberg \
    --conf spark.sql.catalog.my_catalog.rest.sigv4-enabled=true \
    --conf spark.sql.catalog.my_catalog.rest.signing-name=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

Pour l'utiliser sur un cluster activé par les rôles d'exécution, les paramètres de configuration Spark supplémentaires suivants sont nécessaires :

```
"spark.hadoop.fs.s3.credentialsResolverClass": "software.amazon.glue.GlueTableCredentialsResolver",
"spark.hadoop.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
"spark.hadoop.glue.id": {{glue catalog ID}}
"spark.hadoop.glue.endpoint": "glue endpoint"
```

Pour consulter la liste des URL des points de terminaison AWS Glue pour chaque région, voir Points de terminaison et quotas [AWS](https://docs.aws.amazon.com/general/latest/gr/glue.html) Glue.

### Connectez-vous à un point de terminaison IRC arbitraire
<a name="emr-iceberg-rest-catalog-config-arbitrary"></a>

Voici un exemple de `spark-submit` commande permettant d'utiliser un point de terminaison IRC :

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse={{warehouse name}} \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri={{your rest endpoint}} \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

## Différences de configuration entre Iceberg SparkCatalog et SparkSessionCatalog
<a name="emr-iceberg-spark-catalog"></a>

Iceberg propose deux méthodes pour créer des catalogues Spark Iceberg. Vous pouvez définir la configuration de Spark sur l'une `SparkCatalog` ou l'autre sur`SparkSessionCatalog`. 

### Utiliser Iceberg SparkCatalog
<a name="emr-iceberg-spark-catalog-spark-catalog"></a>

Voici la commande à utiliser ** SparkCatalog ** comme catalogue Spark Iceberg :

```
spark-shell \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.defaultCatalog=my_catalog
```

Considérations relatives à cette approche :
+ Vous pouvez accéder aux tables Iceberg mais à aucune autre table.
+ Le nom du catalogue ne peut pas être ** ** spark\_catalog. Il s'agit du nom du catalogue initial de Spark. Il se connecte toujours à un métastore Hive. Il s'agit du catalogue par défaut dans Spark, à moins que l'utilisateur ne le remplace à l'aide `spark.sql.defaultCatalog` de.
+ Vous pouvez définir le nom `spark.sql.defaultCatalog` de votre catalogue pour en faire le catalogue par défaut.

### Utiliser Iceberg SparkSessionCatalog
<a name="emr-iceberg-spark-catalog-spark-session"></a>

Voici la commande à utiliser ** SparkSessionCatalog ** comme catalogue Spark Iceberg :

```
spark-shell \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.warehouse=s3://{{amzn-s3-demo-bucket1}}/{{prefix}} \
    --conf spark.sql.catalog.spark_catalog.type=glue
```

Considérations relatives à cette approche :
+ Si aucune table n'est trouvée en tant que table Iceberg, Spark essaiera de voir s'il s'agit d'une table dans le métastore Hive. Consultez la section [ Utilisation du catalogue de données AWS Glue comme catalogue pour Hive ](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html) pour plus d'informations.
+ Le nom du catalogue doit être ** ** spark\_catalog.

## Utilisation des extensions Iceberg Spark
<a name="emr-iceberg-spark-catalog-extensions"></a>

Iceberg propose l'extension Spark `org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions` que les utilisateurs peuvent définir via la configuration `spark.sql.extensions` des extensions Spark. Les extensions activent les fonctionnalités clés d'Iceberg telles que DELETE, UPDATE et MERGE au niveau des lignes, les instructions et procédures du langage de définition des données Iceberg-specific Spark, telles que le compactage, l'expiration des instantanés, le branchement et le balisage, etc. Consultez les informations suivantes pour plus de détails :
+ Extensions d'écriture Iceberg Spark : [ Spark Writes ](https://iceberg.apache.org/docs/nightly/spark-writes/)
+ Extensions DDL pour Iceberg Spark : extensions SQL [ ALTER TABLE ](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)
+ Extensions de procédures Iceberg Spark : Procédures [ Spark ](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)

## Considérations relatives à l'utilisation d'Iceberg avec Spark
<a name="spark-considerations-catalog"></a>
+ Amazon EMR 6.5.0 ne prend pas en charge l'exécution d'Iceberg sur Amazon EMR sur EKS par défaut. Une image personnalisée Amazon EMR 6.5.0 est disponible afin que vous puissiez la transmettre `--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` en tant que paramètre `spark-submit` pour créer des tables Iceberg sur Amazon EMR sur EKS. Pour plus d'informations, consultez [Soumettre une charge de travail Spark dans Amazon EMR à l'aide d'une image personnalisée](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-submit) dans le *Guide de développement Amazon EMR sur EKS*. Vous pouvez également nous contacter Support pour obtenir de l'aide. À partir d'Amazon EMR 6.6.0, Iceberg est pris en charge sur Amazon EMR sur EKS.
+ Lorsque vous utilisez AWS Glue comme catalogue pour Iceberg, assurez-vous que la base de données dans laquelle vous créez une table existe dans AWS Glue. Si vous utilisez des services tels que AWS Lake Formation et que vous ne parvenez pas à charger le catalogue, assurez-vous de disposer d'un accès approprié au service pour exécuter la commande.
+ Si vous utilisez Iceberg SparkSessionCatalog, comme décrit dans[Différences de configuration entre Iceberg SparkCatalog et SparkSessionCatalog](#emr-iceberg-spark-catalog), vous devez suivre les étapes de configuration décrites dans [ Configurer le catalogue de données AWS Glue en tant que métastore Apache Hive](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html), en plus de configurer les paramètres du catalogue de données Spark Iceberg AWS Glue.