View a markdown version of this page

Verwenden Sie einen Iceberg-Cluster mit Spark - Amazon EMR

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

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 das, um mit Iceberg auf einem Amazon EMR Spark-Cluster AWS CLI 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.

Erstellen Sie einen Iceberg-Cluster

Sie können mithilfe der, der AWS CLI oder der Amazon EMR-API einen Cluster erstellen AWS-Managementkonsole, auf dem Iceberg installiert ist. In diesem Tutorial verwenden Sie das, 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.

Um Iceberg auf Amazon EMR mit dem zu verwenden AWS CLI, erstellen Sie zunächst einen Cluster mit den folgenden Schritten. Informationen zur Angabe der Iceberg-Klassifizierung mithilfe von finden Sie unter oder AWS CLI. Geben Sie AWS CLI beim Erstellen eines Clusters eine Konfiguration an, indem Sie Beim Erstellen eines Clusters eine Konfiguration mit dem Java SDK angeben

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

    [{ "Classification":"iceberg-defaults", "Properties":{"iceberg.enabled":"true"} }]
  2. 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.

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 im Apache-Spark-Dokument Ausführen von Spark in Kubernetes.

Initialisieren Sie eine Spark-Sitzung für Iceberg

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 im Verwaltungshandbuch für Amazon EMR.

  2. Geben Sie den folgenden Befehl ein, um die Spark-Shell zu starten. Um die PySpark Shell zu verwenden, ersetzen Sie sie spark-shell durchpyspark.

    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 im Verwaltungshandbuch für Amazon EMR.

  2. 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 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 mithilfe 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.

[ { "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

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 enthält eine Python-based Shellpyspark, mit der Sie in Python geschriebene Spark-Programme prototypisieren 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

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 AWS Glue-Datenkatalog mit Spark Iceberg

Sie können von Spark Iceberg aus eine Verbindung zum AWS Glue Data Catalog herstellen. In diesem Abschnitt werden verschiedene Befehle zum Herstellen einer Verbindung gezeigt.

Stellen Sie eine Verbindung zur Standardeinstellung her AWS Glue-Katalog in Ihrer Standardregion

Dieses Beispiel zeigt, wie Sie mithilfe des Glue-Katalogtyps eine Verbindung herstellen. Wenn Sie keine Katalog-ID angeben, wird die Standardkennzeichnung 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 Verbindung her mit AWS Glue-Katalog mit einer bestimmten Katalog-ID

Dieses Beispiel zeigt, wie Sie mithilfe einer Katalog-ID eine Verbindung herstellen:

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 von Iceberg REST Catalog (IRC) mit Spark Iceberg

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

Connect to (Verbinden mit) AWS Glue Data Catalog IRC-Endpunkt

Das Folgende zeigt einen spark-submit Beispielbefehl für die Verwendung von 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

Um ihn auf einem Cluster mit aktivierter Runtime-Rolle 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.

Stellen Sie eine Verbindung zu einem beliebigen IRC-Endpunkt her

Das Folgende zeigt einen spark-submit Beispielbefehl für die Verwendung eines IRC-Endpunkts:

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

Unterschiede in der Konfiguration bei Verwendung von SparkCatalog Iceberg im Vergleich SparkSessionCatalog

Iceberg stellt zwei Möglichkeiten zur Verfügung, um Spark Iceberg-Kataloge zu erstellen. Sie können die Spark-Konfiguration auf entweder oder SparkCatalog auf setzen. SparkSessionCatalog

Verwenden von Iceberg SparkCatalog

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

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 auf keine anderen Tabellen.

  • Der Katalogname darf nicht spark_catalog sein. Dies ist der Name des ursprünglichen Katalogs in Spark. Er 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 das spark.sql.defaultCatalog auf Ihren Katalognamen setzen, um ihn zum Standardkatalog zu machen.

Verwenden von Iceberg SparkSessionCatalog

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

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 Den AWS Glue-Datenkatalog als Katalog für Hive verwenden.

  • Der Katalogname muss spark_catalog sein.

Verwenden von Iceberg Spark-Erweiterungen

Iceberg bietet eine Spark-Erweiterung anorg.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, Anweisungen und Verfahren in der Iceberg-specific Spark-Datendefinitionssprache wie Komprimierung, Ablauf von Snapshots, Branching und Tagging usw. Weitere Informationen finden Sie im Folgenden:

Überlegungen zur Verwendung von Iceberg mit Spark

  • 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 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 z. B. 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 beschriebenUnterschiede in der Konfiguration bei Verwendung von SparkCatalog Iceberg im Vergleich SparkSessionCatalog, müssen Sie zusätzlich zur Konfiguration der Spark Iceberg AWS AWS Glue Data Catalog-Einstellungen die unter Glue Data Catalog als Apache Hive-Metastore konfigurieren beschriebenen Konfigurationsschritte ausführen.