

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.

# Verwenden Sie einen Iceberg-Cluster mit Spark
<a name="emr-iceberg-use-spark-cluster"></a>

Ab Amazon-EMR-Version 6.5.0 können Sie Iceberg mit Ihrem Spark-Cluster verwenden, ohne dass Bootstrap-Aktionen erforderlich sind. Für Amazon-EMR-Versionen 6.4.0 und früher können Sie eine Bootstrap-Aktion verwenden, um alle erforderlichen Abhängigkeiten vorab zu installieren.

In diesem Tutorial verwenden Sie den, AWS CLI um mit Iceberg auf einem Amazon EMR Spark-Cluster zu arbeiten. Um die Konsole zur Erstellung eines Clusters mit Iceberg zu verwenden, folgen Sie den Schritten unter [Ein Data Lake von Apache Iceberg mit Amazon Athena, Amazon EMR und AWS Glue erstellen](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/).

## Erstellen Sie einen Iceberg-Cluster
<a name="emr-iceberg-create-cluster"></a>

Sie können einen Cluster mit installiertem Iceberg mithilfe der AWS-Managementkonsole, der AWS CLI oder der Amazon EMR-API erstellen. In diesem Tutorial verwenden Sie den, AWS CLI um mit Iceberg auf einem Amazon EMR-Cluster zu arbeiten. Um die Konsole zur Erstellung eines Clusters mit Iceberg zu verwenden, folgen Sie den Schritten unter [Ein Data Lake von Apache Iceberg mit Amazon Athena, Amazon EMR und AWS Glue erstellen](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/). 

Um Iceberg auf Amazon EMR mit dem zu verwenden AWS CLI, erstellen Sie zunächst einen Cluster mit den folgenden Schritten. Informationen zur Spezifizierung der Iceberg-Klassifizierung mithilfe von finden Sie unter oder AWS CLI. [Geben Sie AWS CLI beim Erstellen eines Clusters eine Konfiguration an, indem Sie](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Beim Erstellen eines Clusters eine Konfiguration mit dem Java SDK angeben](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk)

1. Erstellen Sie eine Datei `configurations.json`, mit folgendem Inhalt:

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

1. Im nächsten Schritt erstellen Sie einen Cluster mit der folgenden Konfiguration. Ersetzen Sie den Amazon-S3-Beispiel-Bucket-Pfad und die Subnetz-ID durch Ihre eigene.

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

Alternativ können Sie einen Amazon-EMR-Cluster mit der Spark-Anwendung erstellen und die Datei `/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` als JAR-Abhängigkeit in einen Spark-Auftrag aufnehmen. Weitere Informationen finden Sie unter [Anwendungen einreichen](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications).

Um das JAR als Abhängigkeit in einen Spark-Auftrag aufzunehmen, fügen Sie der Spark-Anwendung die folgende Konfigurationseigenschaft hinzu:

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

Weitere Informationen zu den Abhängigkeiten von Spark-Aufträgen finden Sie unter [Abhängigkeitsverwaltung](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management) im Apache-Spark-Dokument [Ausführen von Spark in Kubernetes](https://spark.apache.org/docs/latest/running-on-kubernetes.html).

## Initialisieren Sie eine Spark-Sitzung für Iceberg
<a name="emr-iceberg-initialize-spark-session"></a>

In den folgenden Beispielen wird veranschaulicht, wie Sie die interaktive Spark-Shell starten und die Spark-Übermittlung und Amazon EMR Notebooks verwenden, um mit Iceberg in Amazon EMR zu arbeiten.

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

1. Verbinden mit dem Master-Knoten über SSH. Weitere Informationen finden Sie unter [Mit SSH eine Verbindung zum Hauptknoten herstellen](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Geben Sie den folgenden Befehl ein, um die Spark-Shell zu starten. Um die PySpark Shell zu verwenden, ersetzen Sie `spark-shell` durch`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. Verbinden mit dem Master-Knoten über SSH. Weitere Informationen finden Sie unter [Mit SSH eine Verbindung zum Hauptknoten herstellen](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) im *Verwaltungshandbuch für Amazon EMR*.

1. Geben Sie den folgenden Befehl ein, um die Spark-Sitzung für Iceberg zu.starten.

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

Um eine Spark-Sitzung mit EMR Studio-Notebooks zu initialisieren, konfigurieren Sie Ihre Spark-Sitzung mit dem `%%configure` magischen Befehl in Ihrem Amazon-EMR-Notebook, wie im folgenden Beispiel. Weitere Informationen finden Sie unter [Verwendung von EMR-Notebooks-Magics](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics) im *Verwaltungshandbuch für 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 ]

Führen Sie das folgende Beispiel aus, um einen Spark-Cluster mit der CLI zu initialisieren und alle Standardkonfigurationen der Spark Iceberg-Sitzung festzulegen. Weitere Informationen zur Angabe einer Konfigurationsklassifizierung mithilfe der AWS CLI Amazon EMR-API finden [Sie unter Anwendungen konfigurieren](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"
    }
  }
]
```

------

## Schreiben Sie an einen Iceberg-Tabelle
<a name="emr-iceberg-write-to-table"></a>

Das folgende Beispiel zeigt, wie ein Iceberg-Datensatz erstellt DataFrame und als Iceberg-Datensatz geschrieben wird. Die Beispiele in diesem Abschnitt veranschaulichen das Arbeiten mit Datensätzen unter Verwendung der Spark-Shell, während eine Verbindung mit dem Hauptknoten mittels SSH als Standard--Benutzer vorhanden ist.

**Anmerkung**  
Um Codebeispiele in die Spark-Shell einzufügen, geben Sie an der Eingabeaufforderung `:paste` ein, fügen das Beispiel ein und drücken dann `CTRL+D`.

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

Spark umfasst auch eine auf Python basierende Shell namens `pyspark`, mit der Sie Prototypen von in Python geschriebenen Spark-Programmen entwickeln können. Invoke wird in `pyspark` auf dem Hauptknoten festgelegt.

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

------

## Lesen von einer Iceberg-Tabelle
<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
```

------

## Verwenden des AWS Glue-Datenkatalogs mit Spark Iceberg
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Sie können von Spark Iceberg aus eine Verbindung zum AWS Glue Data Catalog herstellen. Dieser Abschnitt zeigt verschiedene Befehle zum Herstellen einer Verbindung.

### Connect zum AWS Standard-Glue-Katalog in Ihrer Standardregion her
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Dieses Beispiel zeigt, wie mithilfe des Katalogtyps Glue eine Verbindung hergestellt wird. Wenn Sie keine Katalog-ID angeben, wird die Standardeinstellung verwendet:

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

### Stellen Sie eine Connect zu einem AWS Glue-Katalog mit einer bestimmten Katalog-ID her
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Dieses Beispiel zeigt, wie mithilfe einer Katalog-ID eine Verbindung hergestellt wird:

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

Dieser Befehl kann verwendet werden, um eine Verbindung zu einem AWS Glue-Katalog in einem anderen Konto, zu einem RMS-Katalog oder zu einem Verbundkatalog herzustellen.

## Verwenden des Iceberg REST-Katalogs (IRC) mit Spark Iceberg
<a name="emr-iceberg-rest-catalog-config"></a>

In den folgenden Abschnitten wird detailliert beschrieben, wie die Iceberg-Integration mit einem Katalog konfiguriert wird.

### Connect zum AWS IRC-Endpunkt von Glue Data Catalog her
<a name="emr-iceberg-rest-catalog-config-gdc"></a>

Im Folgenden wird ein `spark-submit` Beispielbefehl für die Verwendung von Iceberg REST gezeigt:

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

Um ihn auf einem Cluster mit aktivierter Runtime-Role zu verwenden, sind die folgenden zusätzlichen Spark-Konfigurationseinstellungen erforderlich:

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

Eine Liste der AWS Glue-Endpunkt-URLs für jede Region finden Sie unter [AWS Glue-Endpunkte und Kontingente](https://docs.aws.amazon.com/general/latest/gr/glue.html).

### Stellen Sie eine Connect zu einem beliebigen IRC-Endpunkt her
<a name="emr-iceberg-rest-catalog-config-arbitrary"></a>

Im Folgenden wird ein `spark-submit` Beispielbefehl für die Verwendung eines IRC-Endpunkts gezeigt:

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

## Konfigurationsunterschiede bei der Verwendung von Iceberg versus SparkCatalog SparkSessionCatalog
<a name="emr-iceberg-spark-catalog"></a>

Iceberg bietet zwei Möglichkeiten, Spark-Iceberg-Kataloge zu erstellen. Sie können die Spark-Konfiguration entweder auf oder `SparkCatalog` auf einstellen. `SparkSessionCatalog` 

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

Im Folgenden wird der Befehl zur Verwendung **SparkCatalog**als Spark-Iceberg-Katalog gezeigt:

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

Überlegungen zu diesem Ansatz:
+ Sie können auf Iceberg-Tabellen zugreifen, aber nicht auf andere Tabellen.
+ Der Katalogname darf nicht **spark\_catalog** sein. Dies ist der Name des ersten Katalogs in Spark. Es stellt immer eine Verbindung zu einem Hive-Metastore her. Es ist der Standardkatalog in Spark, es sei denn, der Benutzer überschreibt ihn mit. `spark.sql.defaultCatalog`
+ Sie können den `spark.sql.defaultCatalog` auf Ihren Katalognamen setzen, um ihn zum Standardkatalog zu machen.

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

Im Folgenden wird der Befehl zur Verwendung **SparkSessionCatalog**als Spark-Iceberg-Katalog gezeigt:

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

Überlegungen zu diesem Ansatz:
+ Wenn eine Tabelle nicht als Iceberg-Tabelle gefunden wird, versucht Spark herauszufinden, ob es sich um eine Tabelle im Hive-Metastore handelt. Weitere Informationen finden Sie [unter Verwenden des AWS Glue-Datenkatalogs als Katalog für Hive](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html).
+ Der Katalogname muss **spark\_catalog** lauten.

## Verwenden von Iceberg Spark-Erweiterungen
<a name="emr-iceberg-spark-catalog-extensions"></a>

Iceberg bietet eine Spark-Erweiterung an`org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions`, die Benutzer über die Spark-Erweiterungskonfiguration einrichten können. `spark.sql.extensions` Die Erweiterungen ermöglichen wichtige Iceberg-Funktionen wie DELETE, UPDATE und MERGE auf Zeilenebene, Iceberg-spezifische Spark-Datendefinitionssprachanweisungen und -prozeduren wie Komprimierung, Ablauf von Snapshots, Branching und Tagging usw. Weitere Informationen finden Sie im Folgenden:
+ Iceberg Spark-Schreiberweiterungen: [Spark](https://iceberg.apache.org/docs/nightly/spark-writes/) Writes
+ Iceberg Spark DDL-Erweiterungen: [ALTER TABLE](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/) SQL-Erweiterungen
+ [Iceberg Spark-Prozedurerweiterungen: Spark-Prozeduren](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)

## Überlegungen zur Verwendung von Iceberg mit Spark
<a name="spark-considerations-catalog"></a>
+ Amazon EMR 6.5.0 unterstützt Iceberg, das auf Amazon EMR auf EKS ausgeführt wird, standardmäßig nicht. Ein benutzerdefiniertes Amazon EMR 6.5.0-Image ist verfügbar, sodass Sie `--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` als `spark-submit`-Parameter übergeben können, um Iceberg-Tabellen auf Amazon EMR auf EKS zu erstellen. Weitere Informationen finden Sie unter [Einreichen eines Spark-Workloads in Amazon EMR mithilfe eines benutzerdefinierten Images](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-submit) im *Entwicklerhandbuch zu Amazon EMR in EKS*. Sie können sich auch an Support wenden, um Unterstützung zu erhalten. Ab Amazon EMR 6.6.0 wird Iceberg auf Amazon EMR in EKS unterstützt.
+ Wenn Sie AWS Glue als Katalog für Iceberg verwenden, stellen Sie sicher, dass die Datenbank, in der Sie eine Tabelle erstellen, in AWS Glue vorhanden ist. Wenn Sie Dienste wie verwenden AWS Lake Formation und den Katalog nicht laden können, stellen Sie sicher, dass Sie über den richtigen Zugriff auf den Dienst verfügen, um den Befehl auszuführen.
+ Wenn Sie Iceberg verwenden SparkSessionCatalog, wie unter beschrieben[Konfigurationsunterschiede bei der Verwendung von Iceberg versus SparkCatalog SparkSessionCatalog](#emr-iceberg-spark-catalog), müssen Sie zusätzlich zur Konfiguration der Einstellungen des Spark Iceberg [AWS Glue-Datenkatalogs die unter AWS Glue-Datenkatalog konfigurieren als Apache Hive-Metastore](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html) beschriebenen Konfigurationsschritte befolgen.