

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 du métastore pour EMR Serverless


Un *métastore Hive* est un emplacement centralisé qui stocke les informations structurelles relatives à vos tables, notamment les schémas, les noms de partitions et les types de données. Avec EMR Serverless, vous pouvez conserver les métadonnées de cette table dans un métastore ayant accès à vos tâches.

Deux options s'offrent à vous pour créer un métastore Hive :
+ Le catalogue AWS de données Glue
+ Un métastore Apache Hive externe

## Utiliser le catalogue AWS de données Glue comme métastore


Vous pouvez configurer vos tâches Spark et Hive pour utiliser le catalogue de données AWS Glue comme métastore. Nous recommandons cette configuration lorsque vous avez besoin d'un métastore persistant ou d'un métastore partagé par différentes applications, services ou. Comptes AWS Pour plus d'informations sur le catalogue de données, reportez-vous à la section [Remplissage du catalogue de données AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html). Pour plus d'informations sur AWS la tarification de Glue, reportez-vous à [AWS la section Tarification de Glue](https://aws.amazon.com/glue/pricing).

Vous pouvez configurer votre tâche EMR Serverless pour utiliser le catalogue de données AWS Glue de la même manière Compte AWS que votre application ou d'une autre manière. Compte AWS

### Configuration du catalogue AWS de données Glue


Pour configurer le catalogue de données, choisissez le type d'application EMR sans serveur que vous souhaitez utiliser.

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

Lorsque vous utilisez EMR Studio pour exécuter vos tâches avec des applications EMR Serverless Spark, le catalogue de données AWS Glue est le métastore par défaut.

Lorsque vous utilisez SDKs ou AWS CLI, définissez la `spark.hadoop.hive.metastore.client.factory.class` configuration sur `com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory` dans les `sparkSubmit` paramètres de votre tâche d'exécution. L'exemple suivant montre comment configurer le catalogue de données avec AWS CLI.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/code/pyspark/extreme_weather.py",
            "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.driver.cores=1 --conf spark.driver.memory=3g --conf spark.executor.cores=4 --conf spark.executor.memory=3g"
        }
    }'
```

Vous pouvez également définir cette configuration lorsque vous créez une nouvelle configuration `SparkSession` dans votre code Spark.

```
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder.appName("SparkSQL")
    .config(
        "spark.hadoop.hive.metastore.client.factory.class",
        "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
    )
    .enableHiveSupport()
    .getOrCreate()
)

# we can query tables with SparkSQL
spark.sql("SHOW TABLES").show()

# we can also them with native Spark
print(spark.catalog.listTables())
```

------
#### [ Hive ]

Pour les applications EMR Serverless Hive, le catalogue de données est le métastore par défaut. En d'autres termes, lorsque vous exécutez des tâches sur une application EMR Serverless Hive, Hive enregistre les informations du métastore dans le catalogue de données au même titre que votre application. Compte AWS Vous n'avez pas besoin d'un cloud privé virtuel (VPC) pour utiliser le catalogue de données comme métastore.

Pour accéder aux tables du métastore Hive, ajoutez les politiques AWS Glue requises décrites dans [Configuration des autorisations IAM](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html) pour Glue. AWS 

------

### Configuration de l'accès entre comptes pour EMR Serverless AWS et Glue Data Catalog


Pour configurer l'accès entre comptes pour EMR Serverless, connectez-vous d'abord à l'adresse suivante : Comptes AWS
+ `AccountA`— Et Compte AWS où vous avez créé une application EMR Serverless.
+ `AccountB`— Et Compte AWS qui contient un catalogue de données AWS Glue auquel vous souhaitez que votre tâche EMR Serverless puisse accéder. 

1. Assurez-vous qu'un administrateur ou une autre identité autorisée `AccountB` attache une politique de ressources au catalogue de données dans`AccountB`. Cette politique accorde `AccountA` des autorisations spécifiques entre comptes pour effectuer des opérations sur les ressources du `AccountB` catalogue.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:GetDatabase",
           "glue:CreateDatabase",
           "glue:GetDataBases",
           "glue:CreateTable",
           "glue:GetTable",
           "glue:UpdateTable",
           "glue:DeleteTable",
           "glue:GetTables",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:CreatePartition",
           "glue:BatchCreatePartition",
           "glue:GetUserDefinedFunctions"
         ],
         "Resource": [
           "arn:aws:glue:*:123456789012:catalog"
         ],
         "Sid": "AllowGLUEGetdatabase"
       }
     ]
   }
   ```

------

1. Ajoutez une politique IAM au rôle d'exécution des tâches EMR sans serveur afin que ce rôle puisse accéder aux ressources du catalogue de données `AccountA` dans. `AccountB`

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:GetDatabase",
           "glue:CreateDatabase",
           "glue:GetDataBases",
           "glue:CreateTable",
           "glue:GetTable",
           "glue:UpdateTable",
           "glue:DeleteTable",
           "glue:GetTables",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:CreatePartition",
           "glue:BatchCreatePartition",
           "glue:GetUserDefinedFunctions"
         ],
         "Resource": [
           "arn:aws:glue:*:123456789012:catalog"
         ],
         "Sid": "AllowGLUEGetdatabase"
       }
     ]
   }
   ```

------

1.  Commencez à exécuter votre tâche. Cette étape est légèrement différente selon le `AccountA` type d'application EMR Serverless de l'application. 

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

   Transmettez la `spark.hadoop.hive.metastore.glue.catalogid` propriété `sparkSubmitParameters` comme indiqué dans l'exemple suivant. Remplacez *`AccountB-catalog-id`* par l'ID du catalogue de données dans`AccountB`.

   ```
   aws emr-serverless start-job-run \
   --application-id "application-id" \
   --execution-role-arn "job-role-arn" \
   --job-driver '{
       "sparkSubmit": {
           "entryPoint": "s3://amzn-s3-demo-bucket/scripts/test.py",
            "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.hadoop.hive.metastore.glue.catalogid=AccountB-catalog-id --conf spark.executor.cores=1 --conf spark.executor.memory=1g --conf spark.driver.cores=1 --conf spark.driver.memory=1g --conf spark.executor.instances=1"
       }
     }' \
   --configuration-overrides '{
       "monitoringConfiguration": {
       "s3MonitoringConfiguration": {
       "logUri": "s3://amzn-s3-demo-bucket/logs/"
       }
     }
   }'
   ```

------
#### [ Hive ]

   Définissez la `hive.metastore.glue.catalogid` propriété dans la `hive-site` classification comme indiqué dans l'exemple suivant. Remplacez *`AccountB-catalog-id`* par l'ID du catalogue de données dans`AccountB`.

   ```
   aws emr-serverless start-job-run \
   --application-id "application-id" \
   --execution-role-arn "job-role-arn" \
   --job-driver '{
       "hive": {
       "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql",
       "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse"
       }
   }' \
   --configuration-overrides '{
       "applicationConfiguration": [{
           "classification": "hive-site",
           "properties": {
               "hive.metastore.glue.catalogid": "AccountB-catalog-id"
           }
       }]
   }'
   ```

------

### Considérations relatives à l'utilisation du catalogue AWS de données Glue


Vous pouvez ajouter JARs un auxiliaire `ADD JAR` dans vos scripts Hive. Pour plus d'informations, reportez-vous à la section [Considérations relatives à l'utilisation de AWS Glue Data Catalog](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html#emr-hive-glue-considerations-hive). 

# Utilisation d'un métastore Hive externe


Vous pouvez configurer vos tâches EMR Serverless Spark et Hive pour vous connecter à un métastore Hive externe, tel qu'Amazon Aurora ou Amazon RDS for MySQL. Cette section explique comment configurer un métastore Amazon RDS Hive, configurer votre VPC et configurer vos tâches EMR Serverless pour utiliser un métastore externe.

## Création d'un métastore Hive externe


1. Créez un Amazon Virtual Private Cloud (Amazon VPC) avec des sous-réseaux privés en suivant les instructions de la section Créer [un](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC) VPC. 

1. Créez votre application EMR Serverless avec votre nouvel Amazon VPC et vos sous-réseaux privés. Lorsque vous configurez votre application EMR Serverless avec un VPC, elle fournit d'abord une interface Elastic Network pour chaque sous-réseau que vous spécifiez. Il attache ensuite le groupe de sécurité que vous avez spécifié à cette interface réseau. Cela permet à votre application de contrôler l'accès. Pour plus de détails sur la configuration de votre VPC, reportez-vous à. [Configuration de l'accès VPC pour que les applications EMR sans serveur se connectent aux données](vpc-access.md)

1. Créez une base de données MySQL ou Aurora PostgreSQL dans un sous-réseau privé de votre Amazon VPC. Pour plus d'informations sur la création d'une base de données Amazon RDS, reportez-vous à la section [Création d'une instance de base de données Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html). 

1. Modifiez le groupe de sécurité de votre base de données MySQL ou Aurora pour autoriser les connexions JDBC depuis votre groupe de sécurité EMR Serverless en suivant les étapes décrites dans Modification d'[une instance de base de données Amazon](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html) RDS. Ajoutez une règle pour le trafic entrant au groupe de sécurité RDS depuis l'un de vos groupes de sécurité EMR Serverless.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/emr/latest/EMR-Serverless-UserGuide/external-metastore.html)

## Configuration des options Spark


**Utilisation de JDBC**

Pour configurer votre application EMR Serverless Spark afin de se connecter à un metastore Hive basé sur une instance Amazon RDS for MySQL ou Amazon Aurora MySQL, utilisez une connexion JDBC. Transmettez le `mariadb-connector-java.jar` with `--jars` dans les `spark-submit` paramètres de votre exécution de tâche.

```
aws emr-serverless start-job-run \
  --application-id "application-id" \
  --execution-role-arn "job-role-arn" \
  --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/scripts/spark-jdbc.py",
            "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar 
            --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver 
            --conf spark.hadoop.javax.jdo.option.ConnectionUserName=<connection-user-name> 
            --conf spark.hadoop.javax.jdo.option.ConnectionPassword=<connection-password>
            --conf spark.hadoop.javax.jdo.option.ConnectionURL=<JDBC-Connection-string> 
            --conf spark.driver.cores=2
            --conf spark.executor.memory=10G 
            --conf spark.driver.memory=6G 
            --conf spark.executor.cores=4"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-bucket/spark/logs/"
        }
    }
}'
```

L'exemple de code suivant est un script Spark entrypoint qui interagit avec un métastore Hive sur Amazon RDS.

```
from os.path import expanduser, join, abspath
from pyspark.sql import SparkSession
from pyspark.sql import Row
# warehouse_location points to the default location for managed databases and tables
warehouse_location = abspath('spark-warehouse')
spark = SparkSession \
    .builder \
    .config("spark.sql.warehouse.dir", warehouse_location) \
    .enableHiveSupport() \
    .getOrCreate()
spark.sql("SHOW DATABASES").show()
spark.sql("CREATE EXTERNAL TABLE `sampledb`.`sparknyctaxi`(`dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'")
spark.sql("SELECT count(*) FROM sampledb.sparknyctaxi").show()
spark.stop()
```

**Utilisation du service d'épargne**

Vous pouvez configurer votre application EMR Serverless Hive pour qu'elle se connecte à un métastore Hive basé sur une instance Amazon RDS for MySQL ou Amazon Aurora MySQL. Pour ce faire, exécutez un serveur d'épargne sur le nœud principal d'un cluster Amazon EMR existant. Cette option est idéale si vous possédez déjà un cluster Amazon EMR avec un serveur d'épargne que vous souhaitez utiliser pour simplifier vos configurations de tâches EMR sans serveur. 

```
aws emr-serverless start-job-run \
  --application-id "application-id" \
  --execution-role-arn "job-role-arn" \
  --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/thriftscript.py",
            "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar 
            --conf spark.driver.cores=2
            --conf spark.executor.memory=10G 
            --conf spark.driver.memory=6G 
            --conf spark.executor.cores=4"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-bucket/spark/logs/"
        }
    }
}'
```

L'exemple de code suivant est un script entrypoint (`thriftscript.py`) qui utilise le protocole Thrift pour se connecter à un métastore Hive. Notez que la `hive.metastore.uris` propriété doit être définie pour être lue depuis un métastore Hive externe. 

```
from os.path import expanduser, join, abspath
from pyspark.sql import SparkSession
from pyspark.sql import Row
# warehouse_location points to the default location for managed databases and tables
warehouse_location = abspath('spark-warehouse')
spark = SparkSession \
    .builder \
    .config("spark.sql.warehouse.dir", warehouse_location) \
    .config("hive.metastore.uris","thrift://thrift-server-host:thift-server-port") \
    .enableHiveSupport() \
    .getOrCreate()
spark.sql("SHOW DATABASES").show()
spark.sql("CREATE EXTERNAL TABLE sampledb.`sparknyctaxi`( `dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'")
spark.sql("SELECT * FROM sampledb.sparknyctaxi").show()
spark.stop()
```

## Configurer les options Hive


**Utilisation de JDBC**

Si vous souhaitez spécifier un emplacement de base de données Hive externe sur une instance Amazon RDS MySQL ou Amazon Aurora, vous pouvez remplacer la configuration de métastore par défaut.

**Note**  
Dans Hive, vous pouvez effectuer plusieurs écritures dans des tables de métastore en même temps. Si vous partagez des informations de métastore entre deux jobs, assurez-vous de ne pas écrire simultanément dans la même table de métastore, sauf si vous écrivez sur des partitions différentes de la même table de métastore.

Définissez les configurations suivantes dans la `hive-site` classification pour activer le métastore Hive externe. 

```
{
    "classification": "hive-site",
    "properties": {
        "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory",
        "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
        "javax.jdo.option.ConnectionURL": "jdbc:mysql://db-host:db-port/db-name",
        "javax.jdo.option.ConnectionUserName": "username",
        "javax.jdo.option.ConnectionPassword": "password"
    }
}
```

**Utilisation d'un serveur d'épargne**

Vous pouvez configurer votre application EMR Serverless Hive pour qu'elle se connecte à un métastore Hive basé sur Amazon RDS for MySQL ou Amazon Aurora My. SQLinstance Pour ce faire, exécutez un serveur d'épargne sur le nœud principal d'un cluster Amazon EMR existant. Cette option est idéale si vous possédez déjà un cluster Amazon EMR qui exécute un serveur d'épargne et que vous souhaitez utiliser vos configurations de tâches EMR sans serveur. 

Définissez les configurations suivantes dans la `hive-site` classification afin qu'EMR Serverless puisse accéder à la métastore d'épargne distante. Notez que vous devez définir la `hive.metastore.uris` propriété pour qu'elle puisse être lue depuis un métastore Hive externe. 

```
{
    "classification": "hive-site",
    "properties": {
        "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory",
        "hive.metastore.uris": "thrift://thrift-server-host:thirft-server-port"
    }
}
```

# Utilisation de la hiérarchie multi-catalogues AWS Glue sur EMR Serverless


Vous pouvez configurer vos applications EMR Serverless pour qu'elles fonctionnent avec la hiérarchie multi-catalogues AWS Glue. L'exemple suivant montre comment utiliser EMR-S Spark avec la hiérarchie multi-catalogues AWS Glue.

Pour en savoir plus sur la hiérarchie de plusieurs catalogues, reportez-vous à la section [Utilisation d'une hiérarchie de catalogues multiples dans AWS Glue Data Catalog with Spark sur Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-multi-catalog.html).

## Utilisation du stockage géré Redshift (RMS) avec Iceberg et AWS Glue Data Catalog
Utilisation du stockage géré Redshift (RMS) avec l'intégration des catalogues Iceberg et AWS Glue Data Catalog

Voici comment configurer Spark pour l'intégrer à un catalogue de données AWS Glue avec Iceberg :

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/myscript.py",
            "sparkSubmitParameters": "--conf spark.sql.catalog.nfgac_rms = org.apache.iceberg.spark.SparkCatalog
             --conf spark.sql.catalog.rms.type=glue 
             --conf spark.sql.catalog.rms.glue.id=Glue RMS catalog ID 
             --conf spark.sql.defaultCatalog=rms
             --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
        }
    }'
```

Exemple de requête provenant d'une table du catalogue, suite à l'intégration :

```
SELECT * FROM my_rms_schema.my_table
```

## Utilisation du stockage géré Redshift (RMS) avec l'API REST d'Iceberg et le catalogue de données Glue AWS
Utilisation du stockage géré Redshift (RMS) avec l'API REST d'Iceberg et le catalogue de données Glue AWS

Voici comment configurer Spark pour qu'il fonctionne avec le catalogue REST d'Iceberg :

```
aws emr-serverless start-job-run \
--application-id application-id \
--execution-role-arn job-role-arn \
--job-driver '{
"sparkSubmit": {
"entryPoint": "s3://amzn-s3-demo-bucket/myscript.py",
    "sparkSubmitParameters": "
    --conf spark.sql.catalog.rms=org.apache.iceberg.spark.SparkCatalog
    --conf spark.sql.catalog.rms.type=rest
    --conf spark.sql.catalog.rms.warehouse=Glue RMS catalog ID
    --conf spark.sql.catalog.rms.uri=Glue endpoint URI/iceberg
    --conf spark.sql.catalog.rms.rest.sigv4-enabled=true
    --conf spark.sql.catalog.rms.rest.signing-name=glue
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }'
```

Exemple de requête provenant d'une table du catalogue :

```
SELECT * FROM my_rms_schema.my_table
```

# Considérations relatives à l'utilisation d'un métastore externe

+ Vous pouvez configurer des bases de données compatibles avec MariaDB JDBC en tant que metastore. RDS pour MariaDB, MySQL et Amazon Aurora sont des exemples de ces bases de données.
+ Les métastores ne sont pas initialisés automatiquement. [Si votre métastore n'est pas initialisé avec un schéma pour votre version de Hive, utilisez l'outil Hive Schema.](https://cwiki.apache.org/confluence/display/Hive/Hive+Schema+Tool)
+ EMR Serverless ne prend pas en charge l'authentification Kerberos. Vous ne pouvez pas utiliser un serveur Thrift Metastore avec authentification Kerberos avec des tâches EMR Serverless Spark ou Hive.
+ Vous devez configurer l'accès au VPC pour utiliser la hiérarchie multi-catalogues.