

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Amazon-Redshift-Integration für Apache Spark mit Amazon EMR verwenden
<a name="emr-spark-redshift"></a>

Mit Amazon-EMR-Version 6.4.0 und höher enthält jedes Versions-Image einen Konnektor zwischen [Apache Spark](https://aws.amazon.com/emr/features/spark/) und Amazon Redshift. Mit diesem Konnektor können Sie Spark auf Amazon EMR verwenden, um in Amazon Redshift gespeicherte Daten zu verarbeiten. Für die Amazon-EMR-Versionen 6.4.0 bis 6.8.0 basiert die Integration auf dem [`spark-redshift`-Open-Source-Konnektor.](https://github.com/spark-redshift-community/spark-redshift#readme) Für Amazon-EMR-Versionen 6.9.0 und höher wurde die [Amazon-Redshift-Integration für Apache Spark](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) von der Community-Version auf eine native Integration migriert. 

**Topics**
+ [

# Starten einer Spark-Anwendung mithilfe der Amazon-Redshift-Integration für Apache Spark
](emr-spark-redshift-launch.md)
+ [

# Mit der Amazon-Redshift-Integration für Apache Spark authentifizieren
](emr-spark-redshift-auth.md)
+ [

# Lesen und Schreiben von und zu Amazon Redshift
](emr-spark-redshift-readwrite.md)
+ [

# Überlegungen und Einschränkungen bei der Verwendung des Spark-Connectors
](emr-spark-redshift-considerations.md)

# Starten einer Spark-Anwendung mithilfe der Amazon-Redshift-Integration für Apache Spark
<a name="emr-spark-redshift-launch"></a>

Für die Amazon-EMR-Versionen 6.4 bis 6.9 müssen Sie die Option `--jars` oder `--packages` verwenden, um anzugeben, welche der folgenden JAR-Dateien Sie verwenden möchten. Die `--jars`-Option gibt Abhängigkeiten an, die lokal, in HDFS oder unter Verwendung von HTTP/S gespeichert sind. Weitere von der `--jars`-Option unterstützte Dateispeicherorte finden Sie unter [Erweitertes Abhängigkeitsmanagement](https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management) in der Spark-Dokumentation. Die `--packages`-Option spezifiziert Abhängigkeiten, die im öffentlichen Maven-Repository gespeichert sind. 
+ `spark-redshift.jar`
+ `spark-avro.jar`
+ `RedshiftJDBC.jar`
+ `minimal-json.jar`

Amazon-EMR-Versionen 6.10.0 und höher erfordern die `minimal-json.jar`-Abhängigkeit nicht und installieren die anderen Abhängigkeiten standardmäßig automatisch in jedem Cluster. Die folgenden Beispiele zeigen, wie Sie eine Spark-Anwendung mit der Amazon-Redshift-Integration für Apache Spark starten.

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

Das folgende Beispiel zeigt, wie eine Spark-Anwendung mit dem `spark-redshift`-Konnektor mit Amazon-EMR-Versionen 6.10 und höher gestartet wird.

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

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

Um eine Spark-Anwendung mit dem `spark-redshift`-Konnektor auf den Amazon-EMR-Versionen 6.4 bis 6.9 zu starten, müssen Sie die Option `--jars` oder `--packages` verwenden, wie das folgende Beispiel zeigt. Beachten Sie, dass die mit der `--jars`-Option aufgeführten Pfade die Standardpfade für die JAR-Dateien sind.

```
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
```

------

# Mit der Amazon-Redshift-Integration für Apache Spark authentifizieren
<a name="emr-spark-redshift-auth"></a>

## Wird verwendet AWS Secrets Manager , um Anmeldeinformationen abzurufen und eine Verbindung zu Amazon Redshift herzustellen
<a name="emr-spark-redshift-secrets"></a>

Das folgende Codebeispiel zeigt, wie Sie Anmeldeinformationen abrufen können AWS Secrets Manager , um eine Verbindung zu einem Amazon Redshift Redshift-Cluster mit der PySpark Schnittstelle für Apache Spark in Python herzustellen.

```
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()
```

## Verwenden Sie IAM, um Anmeldeinformationen abzurufen und eine Verbindung zu Amazon Redshift herzustellen
<a name="emr-spark-redshift-iam"></a>

Sie können den von Amazon Redshift bereitgestellten JDBC-Version 2 verwenden, um mit dem Spark-Konnektor eine Verbindung mit Amazon Redshift herzustellen. Um AWS Identity and Access Management (IAM) zu verwenden, [konfigurieren Sie Ihre JDBC-URL](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html) für die Verwendung der IAM-Authentifizierung. Um eine Verbindung zu einem Redshift-Cluster von Amazon EMR herzustellen, müssen Sie Ihrer IAM-Rolle die Berechtigung erteilen, temporäre IAM-Anmeldeinformationen abzurufen. Weisen Sie Ihrer IAM-Rolle die folgenden Berechtigungen zu, damit sie Anmeldeinformationen abrufen und Amazon-S3-Vorgänge ausführen kann. 
+  [Redshift: GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) (für bereitgestellte Amazon Redshift Redshift-Cluster) 
+  [Redshift: DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html) (für bereitgestellte Amazon Redshift Redshift-Cluster) 
+ [Redshift: GetWorkgroup](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetWorkgroup.html) (für serverlose Amazon Redshift Redshift-Arbeitsgruppen)
+  [Redshift: GetCredentials](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetCredentials.html) (für serverlose Amazon Redshift Redshift-Arbeitsgruppen) 
+  [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) 

Weitere Informationen zu `GetClusterCredentials` finden Sie unter [Ressourcenrichtlinien für `GetClusterCredentials`](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift-policy-resources.getclustercredentials-resources).

Sie müssen außerdem sicherstellen, dass Amazon Redshift die IAM-Rolle während `COPY`- und `UNLOAD`-Operationen übernehmen kann.

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

****  

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

------

Das folgende Beispiel verwendet die IAM-Authentifizierung zwischen Spark und 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()
```

# Lesen und Schreiben von und zu Amazon Redshift
<a name="emr-spark-redshift-readwrite"></a>

Die folgenden Codebeispiele werden verwendet PySpark , um Beispieldaten von und in eine Amazon Redshift Redshift-Datenbank mit Datenquellen-API und unter Verwendung von SparkSQL zu lesen und zu schreiben.

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

Wird verwendet PySpark , um Beispieldaten von und in eine Amazon Redshift Redshift-Datenbank mit Datenquellen-API zu lesen und zu schreiben.

```
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 ]

Wird verwendet PySpark , um Beispieldaten mit SparkSQL aus und in eine Amazon Redshift Redshift-Datenbank zu lesen und zu schreiben.

```
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()
```

------

# Überlegungen und Einschränkungen bei der Verwendung des Spark-Connectors
<a name="emr-spark-redshift-considerations"></a>
+ Wir empfehlen, SSL für die JDBC-Verbindung von Spark auf Amazon EMR zu Amazon Redshift zu aktivieren.
+ Als bewährte Methode empfehlen wir Ihnen, die Anmeldeinformationen für den Amazon-Redshift-Cluster in AWS Secrets Manager zu verwalten. Ein Beispiel finden Sie [unter Verwenden AWS Secrets Manager zum Abrufen von Anmeldeinformationen für die Verbindung mit Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration.html).
+ Wir empfehlen, dass Sie eine IAM-Rolle mit dem Parameter `aws_iam_role` für den Amazon-Redshift-Authentifizierungsparameter zu übergeben.
+ Die `tempdir`-URI verweist auf einen Amazon-S3-Speicherort. Dieses temporäre Verzeichnis wird nicht automatisch bereinigt und kann zusätzliche Kosten verursachen. 
+ Beachten Sie die folgenden Empfehlungen für Amazon Redshift:
  + Wir empfehlen, den öffentlichen Zugriff auf den Amazon-Redshift-Cluster zu blockieren.
  + Wir empfehlen, die [Amazon-Redshift-Auditprotokollierung](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html) zu aktivieren.
  + Wir empfehlen Ihnen die [Amazon-Redshift-Verschlüsselung im Ruhezustand](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html) zu aktivieren.
+ Beachten Sie die folgenden Empfehlungen für Amazon S3:
  + Wir empfehlen Ihnen [den öffentlichen Zugriff auf Amazon-S3-Buckets zu blockieren](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html).
  + Wir empfehlen die Verwendung der [serverseitigen Amazon-S3-Verschlüsselung](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html), um die verwendeten Amazon-S3-Buckets zu verschlüsseln.
  + Wir empfehlen, die [Lebenszyklusrichtlinien für Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) zu verwenden, um die Aufbewahrungsregeln für den Amazon-S3-Bucket zu definieren.
  + Amazon EMR überprüft immer Code, der aus Open Source in das Image importiert wurde. Aus Sicherheitsgründen unterstützen wir die folgenden Authentifizierungsmethoden von Spark für Amazon S3 nicht:
    +  AWS Zugriffstasten in der `hadoop-env` Konfigurationsklassifizierung einrichten
    + Kodierung der AWS Zugriffsschlüssel in der `tempdir` URI

Weitere Informationen zum Verwenden des Konnektors und seiner unterstützten Parameter finden Sie in den folgenden Ressourcen:
+ [Amazon-Redshift-Integration für Apache Spark](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) im *Amazon-Redshift-Verwaltungshandbuch*
+ Das [`spark-redshift`-Community-Repository](https://github.com/spark-redshift-community/spark-redshift#readme) auf Github