

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 de l'intégration d'Amazon Redshift pour Apache Spark avec Amazon EMR
<a name="emr-spark-redshift"></a>

Avec Amazon EMR version 6.4.0 et versions ultérieures, chaque image de version inclut un connecteur entre [Apache Spark et Amazon Redshift](https://aws.amazon.com/emr/features/spark/). Avec ce connecteur, vous pouvez utiliser Spark sur Amazon EMR pour traiter les données stockées dans Amazon Redshift. Pour les versions 6.4.0 à 6.8.0 d'Amazon EMR, l'intégration est basée sur le [connecteur open source `spark-redshift`](https://github.com/spark-redshift-community/spark-redshift#readme). Pour les versions 6.9.0 et ultérieures d'Amazon EMR, l'[intégration Amazon Redshift pour Apache Spark](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) a été migrée de la version communautaire vers une intégration native. 

**Topics**
+ [Lancement d'une application Spark à l'aide de l'intégration Amazon Redshift pour Apache Spark](emr-spark-redshift-launch.md)
+ [Authentification avec l'intégration Amazon Redshift pour Apache Spark](emr-spark-redshift-auth.md)
+ [Lecture et écriture à partir de et vers Amazon Redshift](emr-spark-redshift-readwrite.md)
+ [Considérations et limites relatives à l’utilisation du connecteur Spark](emr-spark-redshift-considerations.md)

# Lancement d'une application Spark à l'aide de l'intégration Amazon Redshift pour Apache Spark
<a name="emr-spark-redshift-launch"></a>

Pour les versions 6.4 à 6.9 d'Amazon EMR, vous devez utiliser l'option `--jars` ou `--packages` pour spécifier les fichiers JAR suivants que vous souhaitez utiliser. L'option `--jars` spécifie les dépendances stockées localement, dans HDFS ou à l'aide du protocole HTTP/S. Pour connaître les autres emplacements de fichiers pris en charge par l'option `--jars`, consultez la section [Gestion avancée des dépendances](https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management) dans la documentation de Spark. L'option `--packages` spécifie les dépendances stockées dans le référentiel public de Maven. 
+ `spark-redshift.jar`
+ `spark-avro.jar`
+ `RedshiftJDBC.jar`
+ `minimal-json.jar`

Les versions 6.10.0 et supérieures d'Amazon EMR ne nécessitent pas la dépendance de `minimal-json.jar` et installent automatiquement les autres dépendances sur chaque cluster par défaut. Les exemples suivants montrent comment lancer une application Spark avec l'intégration Amazon Redshift pour Apache Spark.

------
#### [ Amazon EMR 6.10.0 \$1 ]

L'exemple suivant montre comment lancer une application Spark avec le connecteur `spark-redshift` avec Amazon EMR versions 6.10 et supérieures.

```
spark-submit my_script.py
```

------
#### [ Amazon EMR 6.4.0 - 6.9.x ]

Pour lancer une application Spark avec le connecteur `spark-redshift` sur les versions 6.4 à 6.9 d'Amazon EMR, vous devez utiliser l'option `--jars` ou `--packages`, comme le montre l'exemple suivant. Notez que les chemins répertoriés avec l'option `--jars` sont les chemins par défaut des fichiers JAR.

```
spark-submit \
  --jars /usr/share/aws/redshift/jdbc/RedshiftJDBC.jar,/usr/share/aws/redshift/spark-redshift/lib/spark-redshift.jar,/usr/share/aws/redshift/spark-redshift/lib/spark-avro.jar,/usr/share/aws/redshift/spark-redshift/lib/minimal-json.jar \
  my_script.py
```

------

# Authentification avec l'intégration Amazon Redshift pour Apache Spark
<a name="emr-spark-redshift-auth"></a>

## Utilisation AWS Secrets Manager pour récupérer les informations d'identification et se connecter à Amazon Redshift
<a name="emr-spark-redshift-secrets"></a>

L'exemple de code suivant montre comment récupérer les informations d'identification AWS Secrets Manager pour vous connecter à un cluster Amazon Redshift avec l' PySpark interface d'Apache Spark en Python.

```
from pyspark.sql import SQLContext
import boto3

sc = # existing SparkContext
sql_context = SQLContext(sc)

secretsmanager_client = boto3.client('secretsmanager')
secret_manager_response = secretsmanager_client.get_secret_value(
    SecretId='string',
    VersionId='string',
    VersionStage='string'
)
username = # get username from secret_manager_response
password = # get password from secret_manager_response
url = "jdbc:redshift://redshifthost:5439/database?user=" + username + "&password=" + password

# Read data from a table
df = sql_context.read \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "my_table") \
    .option("tempdir", "s3://path/for/temp/data") \
    .load()
```

## Utilisation d'IAM pour récupérer les informations d'identification et se connecter à Amazon Redshift
<a name="emr-spark-redshift-iam"></a>

Vous pouvez utiliser le JDBC version 2 fourni par Amazon Redshift pour vous connecter à Amazon Redshift avec le connecteur Spark. Pour utiliser Gestion des identités et des accès AWS (IAM), [configurez votre URL JDBC pour utiliser](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html) l'authentification IAM. Pour vous connecter à un cluster Redshift depuis Amazon EMR, vous devez donner à votre rôle IAM l'autorisation de récupérer des informations d'identification IAM temporaires. Attribuez les autorisations suivantes à votre rôle IAM pour qu'il puisse récupérer les informations d'identification et exécuter les opérations Amazon S3. 
+  [Redshift : GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) (pour les clusters Amazon Redshift provisionnés) 
+  [Redshift : DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html) (pour les clusters Amazon Redshift provisionnés) 
+ [Redshift : GetWorkgroup](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetWorkgroup.html) (pour les groupes de travail Amazon Redshift Serverless)
+  [Redshift : GetCredentials](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetCredentials.html) (pour les groupes de travail Amazon Redshift Serverless) 
+  [s3 : GetBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html) 
+  [s3 : GetBucketLocation](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html) 
+  [s3 : GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 
+  [s3 : PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 
+  [s3 : GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html) 

Pour plus d'informations sur `GetClusterCredentials`, consultez [Stratégies de ressources pour `GetClusterCredentials`](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift-policy-resources.getclustercredentials-resources).

Vous devez également vous assurer qu'Amazon Redshift peut assumer le rôle IAM pendant les opérations `COPY` et `UNLOAD`.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": "arn:aws:iam::123456789012:role/RedshiftServiceRole",
      "Sid": "AllowSTSAssumerole"
    }
  ]
}
```

------

L'exemple suivant utilise l'authentification IAM entre Spark et Amazon Redshift :

```
from pyspark.sql import SQLContext
import boto3

sc = # existing SparkContext
sql_context = SQLContext(sc)

url = "jdbc:redshift:iam://redshift-host:redshift-port/db-name"
iam_role_arn = "arn:aws:iam::account-id:role/role-name"

# Read data from a table
df = sql_context.read \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("aws_iam_role", iam_role_arn) \
    .option("dbtable", "my_table") \
    .option("tempdir", "s3a://path/for/temp/data") \
    .mode("error") \
    .load()
```

# Lecture et écriture à partir de et vers Amazon Redshift
<a name="emr-spark-redshift-readwrite"></a>

Les exemples de code suivants permettent de lire et PySpark d'écrire des exemples de données depuis et vers une base de données Amazon Redshift à l'aide de l'API de source de données et de SparkSQL.

------
#### [ Data source API ]

 PySpark À utiliser pour lire et écrire des exemples de données depuis et vers une base de données Amazon Redshift avec une API de source de données.

```
import boto3
from pyspark.sql import SQLContext

sc = # existing SparkContext
sql_context = SQLContext(sc)

url = "jdbc:redshift:iam://redshifthost:5439/database"
aws_iam_role_arn = "arn:aws:iam::accountID:role/roleName"

df = sql_context.read \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "tableName") \
    .option("tempdir", "s3://path/for/temp/data") \
    .option("aws_iam_role", "aws_iam_role_arn") \
    .load()

df.write \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "tableName_copy") \
    .option("tempdir", "s3://path/for/temp/data") \
    .option("aws_iam_role", "aws_iam_role_arn") \
    .mode("error") \
    .save()
```

------
#### [ SparkSQL ]

 PySpark À utiliser pour lire et écrire des exemples de données depuis et vers une base de données Amazon Redshift avec SparkSQL.

```
import boto3
import json
import sys
import os
from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .enableHiveSupport() \
    .getOrCreate()
    
url = "jdbc:redshift:iam://redshifthost:5439/database"
aws_iam_role_arn = "arn:aws:iam::accountID:role/roleName"
    
bucket = "s3://path/for/temp/data"
tableName = "tableName" # Redshift table name

s = f"""CREATE TABLE IF NOT EXISTS {tableName} (country string, data string) 
    USING io.github.spark_redshift_community.spark.redshift 
    OPTIONS (dbtable '{tableName}', tempdir '{bucket}', url '{url}', aws_iam_role '{aws_iam_role_arn}' ); """

spark.sql(s)
         
columns = ["country" ,"data"]
data = [("test-country","test-data")]
df = spark.sparkContext.parallelize(data).toDF(columns)

# Insert data into table
df.write.insertInto(tableName, overwrite=False)
df = spark.sql(f"SELECT * FROM {tableName}")
df.show()
```

------

# Considérations et limites relatives à l’utilisation du connecteur Spark
<a name="emr-spark-redshift-considerations"></a>
+ Nous vous recommandons d'activer le protocole SSL pour la connexion JDBC entre Spark sur Amazon EMR et Amazon Redshift.
+ À titre de bonne pratique, nous vous recommandons de gérer les informations d'identification du cluster Amazon Redshift dans AWS Secrets Manager . Voir [Utiliser AWS Secrets Manager pour récupérer les informations d'identification pour se connecter à Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration.html) pour un exemple.
+ Nous vous recommandons de transmettre un rôle IAM à l'aide du paramètre `aws_iam_role` pour le paramètre d'authentification Amazon Redshift.
+ L'URI `tempdir` renvoie à un emplacement Amazon S3. Ce répertoire temporaire n'est pas nettoyé automatiquement et peut donc entraîner des coûts supplémentaires. 
+ Tenez compte des recommandations suivantes pour Amazon Redshift :
  + Nous vous recommandons de bloquer l'accès public au cluster Amazon Redshift.
  + Nous vous recommandons d'activer la [journalisation des audits d'Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html).
  + Nous vous recommandons d'activer le [chiffrement au repos d'Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html).
+ Tenez compte des recommandations suivantes pour Amazon S3 :
  + Nous vous recommandons de [bloquer l'accès public aux compartiments Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html).
  + Nous vous recommandons d'utiliser le [chiffrement côté serveur Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) pour chiffrer les compartiments Amazon S3 utilisés.
  + Nous vous recommandons d'utiliser les [politiques de cycle de vie d'Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) pour définir les règles de conservation du compartiment Amazon S3.
  + Amazon EMR vérifie toujours le code importé à partir d'une source ouverte dans l'image. Pour des raisons de sécurité, nous ne prenons pas en charge les méthodes d'authentification suivantes de Spark vers Amazon S3 :
    + Configuration des clés AWS d'accès dans la classification `hadoop-env` de configuration
    + Encodage des clés AWS d'accès dans l'`tempdir`URI

Pour plus d'informations sur l'utilisation du connecteur et les paramètres qu'il prend en charge, consultez les ressources suivantes :
+ [Intégration d'Amazon Redshift pour Apache Spark](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) dans le *Guide de gestion Amazon Redshift*
+ Le [référentiel communautaire `spark-redshift`](https://github.com/spark-redshift-community/spark-redshift#readme) sur Github