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.
Ausführen von ETL-Jobs auf Amazon S3-Tabellen mit AWS Glue
AWS Glue ist ein serverloser Datenintegrationsdienst, der es Analytics-Benutzern erleichtert, Daten aus mehreren Quellen zu erkennen, vorzubereiten, zu verschieben und zu integrieren. Mithilfe von AWS Glue Jobs können Sie ETL-Pipelines (Extrahieren, Transformieren und Laden) ausführen, um Daten in Ihre Data Lakes zu laden. Weitere Informationen finden Sie AWS Glue unter Was ist AWS Glue? im AWS Glue
Entwicklerhandbuch.
Ein AWS Glue Job kapselt ein Skript, das eine Verbindung zu Ihren Quelldaten herstellt, sie verarbeitet und sie dann in Ihr Datenziel schreibt. In der Regel führt ein Auftrag Extraktions-, Transformations- und Ladeskripts (Extract, Transform and Load, ETL) aus. Jobs können Skripte ausführen, die für Apache Spark-Laufzeitumgebungen entwickelt wurden. Sie können Auftragsausführungen überwachen, um mehr über Laufzeitmetriken wie Bearbeitungsstatus, Dauer und Startzeit zu erfahren.
Sie können AWS Glue Jobs verwenden, um Daten in Ihren S3-Tabellen zu verarbeiten, indem Sie über die Integration mit AWS Analysediensten eine Verbindung zu Ihren Tabellen herstellen, oder Sie stellen eine direkte Verbindung über den Amazon Iceberg REST S3-Tabellen-Endpunkt oder den Amazon S3-Tabellenkatalog für her. Apache Iceberg In diesem Handbuch werden die grundlegenden Schritte für den Einstieg in die Verwendung von AWS Glue S3-Tabellen behandelt, darunter:
Wählen Sie Ihre Zugriffsmethode auf der Grundlage Ihrer spezifischen AWS Glue ETL-Jobanforderungen aus:
-
AWS Integration von Analysediensten (empfohlen) — Empfehlenswert, wenn Sie eine zentrale Metadatenverwaltung für mehrere AWS Analysedienste benötigen, vorhandene AWS Glue Datenkatalogberechtigungen und optional Lake Formation nutzen müssen oder ETL-Pipelines für die Produktion aufbauen, die in andere AWS Dienste wie Athena oder Amazon EMR integriert werden können.
-
Amazon S3 Tables Iceberg REST Endpoint — Empfohlen, wenn Sie eine Verbindung zu S3-Tabellen von Abfrage-Engines von Drittanbietern herstellen müssenApache Iceberg, die benutzerdefinierte ETL-Anwendungen erstellen, die direkten REST-API-Zugriff benötigen, oder wenn Sie die Kontrolle über Katalogvorgänge ohne Abhängigkeiten vom AWS Glue Datenkatalog benötigen.
-
Amazon S3 Tables Katalog für Apache Iceberg – Bitte verwenden Sie diesen ausschließlich für ältere Anwendungen oder spezifische programmatische Szenarien, die die Java-Client-Bibliothek erfordern. Diese Methode wird aufgrund des zusätzlichen JAR Abhängigkeitsmanagements und der Komplexität nicht für neue AWS Glue ETL-Jobimplementierungen empfohlen.
Schritt 1: Voraussetzungen
Bevor Sie Tabellen von einem AWS Glue Job aus abfragen können, müssen Sie eine IAM-Rolle konfigurieren, die zur Ausführung des Jobs verwendet werden AWS Glue kann. Wählen Sie Ihre Zugriffsmethode, um sich über die spezifischen Voraussetzungen für diese Methode zu informieren.
- AWS analytics services integration (Recommended)
-
Erforderliche Voraussetzungen, um die AWS Analyseintegration von S3 Tables zur Ausführung von AWS Glue Aufträgen verwenden zu können.
- Amazon S3 Tables Iceberg-REST endpoint
-
Voraussetzungen für die Verwendung des Amazon Iceberg REST S3-Tabelles-Endpunkts zur Ausführung von AWS Glue ETL-Aufträgen.
- Amazon S3 Tables Catalog for Apache Iceberg
-
Voraussetzungen: Verwenden Sie den Amazon S3-Tabellenkatalog für Apache Iceberg die Ausführung von AWS Glue ETL-Aufträgen.
Schritt 2 – Erstellen Sie ein Skript, um eine Verbindung zu Tabellen-Buckets herzustellen.
Um bei der Ausführung eines AWS Glue ETL-Jobs auf Ihre Tabellendaten zuzugreifen, konfigurieren Sie eine Spark Sitzung, Apache Iceberg die eine Verbindung zu Ihrem S3-Tabellen-Bucket herstellt. Sie können ein vorhandenes Skript ändern, um eine Verbindung zu Ihrem Tabellen-Bucket herzustellen, oder ein neues Skript erstellen. Weitere Informationen zum Erstellen von AWS Glue Skripten finden Sie unter Tutorial: Ein AWS Glue For-Spark-Skript schreiben im AWS Glue
Entwicklerhandbuch.
Sie können die Sitzung so konfigurieren, dass sie über eine der folgenden Zugriffsmethoden für S3 Tables eine Verbindung zu Ihren Tabellen-Buckets herstellt:
-
Integration der AWS Analysedienste in S3 Tables (empfohlen)
-
Amazon S3 Tables Iceberg REST-Endpunkt
-
Amazon S3 Tables Katalog für Apache Iceberg
Wählen Sie aus den folgenden Zugriffsmethoden, um Anweisungen zur Einrichtung und Konfigurationsbeispiele einzusehen.
- AWS analytics services integration (Recommended)
-
Als Voraussetzung für die Abfrage von Tabellen Spark unter AWS Glue
Verwendung der AWS Analytics Services-Integration müssen Sie Ihre Tabellen-Buckets in die AWS Analysedienste integrieren
Sie können die Verbindung zu Ihrem Table-Bucket über eine Spark Sitzung in einem Job oder mit AWS Glue Studio Magie in einer interaktiven Sitzung konfigurieren. Um die folgenden Beispiele zu verwenden, ersetzen Sie das placeholder values durch die Informationen für Ihren eigenen Table-Bucket.
- Mithilfe eines PySpark Skripts
-
Verwenden Sie den folgenden Codeausschnitt in einem PySpark Skript, um einen AWS Glue Job zu konfigurieren, der mithilfe der Integration eine Verbindung zu Ihrem Table-Bucket herstellt.
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog","s3tables") \
.config("spark.sql.catalog.s3tables", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tables.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.s3tables.glue.id", "111122223333:s3tablescatalog/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3tables.warehouse", "s3://amzn-s3-demo-table-bucket/warehouse/") \
.getOrCreate()
- Verwenden einer interaktiven AWS Glue
-Sitzung
-
Wenn Sie eine interaktive Notebook-Sitzung mit AWS Glue
5.0 verwenden, geben Sie vor der Codeausführung dieselben Konfigurationen mithilfe von %%configure-Magic in einer Zelle an.
%%configure
{"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3tables --conf spark.sql.catalog.s3tables=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3tables.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.s3tables.glue.id=111122223333:s3tablescatalog/amzn-s3-demo-table-bucket --conf spark.sql.catalog.s3tables.warehouse=s3://amzn-s3-demo-table-bucket/warehouse/"}
- Amazon S3 Tables Iceberg-REST endpoint
-
Sie können die Verbindung zu Ihrem Table-Bucket über eine Spark Sitzung in einem Job oder mit AWS Glue Studio Magie in einer interaktiven Sitzung konfigurieren. Um die folgenden Beispiele zu verwenden, ersetzen Sie das placeholder values durch die Informationen für Ihren eigenen Table-Bucket.
- Mithilfe eines PySpark Skripts
Verwenden Sie den folgenden Codeausschnitt in einem PySpark Skript, um einen AWS Glue Job zu konfigurieren, der mithilfe des Endpunkts eine Verbindung zu Ihrem Table-Bucket herstellt.
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3_rest_catalog") \
.config("spark.sql.catalog.s3_rest_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3_rest_catalog.type", "rest") \
.config("spark.sql.catalog.s3_rest_catalog.uri", "https://s3tables.Region.amazonaws.com/iceberg") \
.config("spark.sql.catalog.s3_rest_catalog.warehouse", "arn:aws:s3tables:Region:111122223333:bucket/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled", "true") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-name", "s3tables") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-region", "Region") \
.config('spark.sql.catalog.s3_rest_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
- Verwenden einer interaktiven AWS Glue
-Sitzung
Wenn Sie eine interaktive Notebook-Sitzung mit AWS Glue 5.0 verwenden, geben Sie vor der Codeausführung dieselben Konfigurationen mithilfe der %%configure Magie in einer Zelle an. Ersetzen Sie die Platzhalterwerte durch die Informationen für Ihren eigenen Tabellen-Bucket.
%%configure
{"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3_rest_catalog --conf spark.sql.catalog.s3_rest_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3_rest_catalog.type=rest --conf spark.sql.catalog.s3_rest_catalog.uri=https://s3tables.Region.amazonaws.com/iceberg --conf spark.sql.catalog.s3_rest_catalog.warehouse=arn:aws:s3tables:Region:111122223333:bucket/amzn-s3-demo-table-bucket --conf spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled=true --conf spark.sql.catalog.s3_rest_catalog.rest.signing-name=s3tables --conf spark.sql.catalog.s3_rest_catalog.rest.signing-region=Region --conf spark.sql.catalog.s3_rest_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled=false"}
- Amazon S3 Tables Catalog for Apache Iceberg
-
Um eine Verbindung zu Tabellen über den Amazon S3 Tables Catalog für Apache Iceberg herstellen zu können, müssen Sie zunächst die neueste Katalog-JAR-Datei herunterladen und in einen S3-Bucket hochladen. Wenn Sie dann Ihren Job erstellen, fügen Sie den Pfad zum Client-Katalog JAR als speziellen Parameter hinzu. Weitere Informationen zu Jobparametern in finden Sie unter Spezielle Parameter AWS Glue, die in AWS Glue Aufträgen verwendet werden, im AWS Glue Entwicklerhandbuch.
Sie können die Verbindung zu Ihrem Table-Bucket über eine Spark Sitzung in einem Job oder mit AWS Glue Studio Magie in einer interaktiven Sitzung konfigurieren. Um die folgenden Beispiele zu verwenden, ersetzen Sie das placeholder values durch die Informationen für Ihren eigenen Table-Bucket.
- Verwenden eines PySpark-Skripts
-
Verwenden Sie den folgenden Codeausschnitt in einem PySpark Skript, um einen AWS Glue Job für die Verbindung zu Ihrem Table-Bucket mithilfe von zu konfigurieren. JAR Ersetzen Sie die Platzhalterwerte durch die Informationen für Ihren eigenen Tabellen-Bucket.
spark = SparkSession.builder.appName("glue-s3-tables") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3tablesbucket") \
.config("spark.sql.catalog.s3tablesbucket", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tablesbucket.catalog-impl", "software.amazon.s3tables.iceberg.S3TablesCatalog") \
.config("spark.sql.catalog.s3tablesbucket.warehouse", "arn:aws:s3tables:Region:111122223333:bucket/amzn-s3-demo-table-bucket") \
.getOrCreate()
- Verwenden einer interaktiven AWS Glue
-Sitzung
-
Wenn Sie eine interaktive Notebook-Sitzung mit AWS Glue 5.0 verwenden, geben Sie vor der Codeausführung dieselben Konfigurationen mithilfe der %%configure Magie in einer Zelle an. Ersetzen Sie die Platzhalterwerte durch die Informationen für Ihren eigenen Tabellen-Bucket.
%%configure
{"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3tablesbucket --conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog --conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:Region:111122223333:bucket/amzn-s3-demo-table-bucket", "extra-jars": "s3://amzn-s3-demo-bucket/jars/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar"}
Beispielskripte
Die folgenden PySpark Beispielskripten können verwendet werden, um das Abfragen von S3-Tabellen mit einem AWS Glue Job zu testen. Diese Skripten stellen eine Verbindung zu Ihrem Tabellen-Bucket her und führen Abfragen aus, um: einen neuen Namespace zu erstellen, eine Beispieltabelle zu erstellen, Daten in die Tabelle einzufügen und die Tabellendaten zurückzugeben. Um die Skripts zu verwenden, ersetzen Sie die placeholder values durch die Informationen für Ihren eigenen Tabellen-Bucket.
Wählen Sie je nach Ihrer Zugriffsmethode für S3 Tables aus den folgenden Skripten aus.
- S3 Tables integration with AWS analytics services
-
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog","s3tables") \
.config("spark.sql.catalog.s3tables", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tables.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.s3tables.glue.id", "111122223333:s3tablescatalog/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3tables.warehouse", "s3://amzn-s3-demo-table-bucket/bucket/amzn-s3-demo-table-bucket") \
.getOrCreate()
namespace = "new_namespace"
table = "new_table"
spark.sql("SHOW DATABASES").show()
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
- Amazon S3 Tables Iceberg-REST endpoint
-
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3_rest_catalog") \
.config("spark.sql.catalog.s3_rest_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3_rest_catalog.type", "rest") \
.config("spark.sql.catalog.s3_rest_catalog.uri", "https://s3tables.Region.amazonaws.com/iceberg") \
.config("spark.sql.catalog.s3_rest_catalog.warehouse", "arn:aws:s3tables:Region:111122223333:bucket/amzn-s3-demo-table-bucket") \
.config("spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled", "true") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-name", "s3tables") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-region", "Region") \
.config('spark.sql.catalog.s3_rest_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
namespace = "s3_tables_rest_namespace"
table = "new_table_s3_rest"
spark.sql("SHOW DATABASES").show()
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
- Amazon S3 Tables Catalog for Apache Iceberg
-
from pyspark.sql import SparkSession
#Spark session configurations
spark = SparkSession.builder.appName("glue-s3-tables") \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.4.2") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3tablesbucket") \
.config("spark.sql.catalog.s3tablesbucket", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tablesbucket.catalog-impl", "software.amazon.s3tables.iceberg.S3TablesCatalog") \
.config("spark.sql.catalog.s3tablesbucket.warehouse", "arn:aws:s3tables:Region:111122223333:bucket/amzn-s3-demo-table-bucket") \
.getOrCreate()
#Script
namespace = "new_namespace"
table = "new_table"
spark.sql(f"CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.{namespace}")
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
Schritt 3 — Erstellen Sie eine AWS Glue Job, der Tabellen abfragt
Die folgenden Verfahren zeigen, wie Sie AWS Glue Jobs einrichten, die eine Verbindung zu Ihren S3-Tabellen-Buckets herstellen. Sie können dies mit dem AWS CLI oder mithilfe der Konsole mit dem AWS Glue Studio Skripteditor tun. Weitere Informationen finden Sie unter Aufträge erstellen in AWS Glue des AWS Glue -Benutzerhandbuchs.
Das folgende Verfahren zeigt, wie Sie den AWS Glue Studio Skripteditor verwenden, um einen ETL-Job zu erstellen, der Ihre S3-Tabellen abfragt.
Öffnen Sie die AWS Glue Konsole unter https://console.aws.amazon.com/glue/.
-
Wählen Sie ETL-Aufträge aus dem Navigationsbereich.
-
Wählen Sie Skripteditor und dann Skript hochladen und laden Sie das Skript hoch, das PySpark Sie für die Abfrage von S3-Tabellen erstellt haben.
-
Wählen Sie die Registerkarte Jobdetails und geben Sie Folgendes für Basiseigenschaften ein.
-
Geben Sie unter Name einen Namen für den Auftrag ein.
-
Wählen Sie für die IAM-Rolle die Rolle aus, die Sie für AWS Glue erstellt haben.
-
(Optional) Wenn Sie die Zugriffsmethode Amazon S3 Tables Catalog als Apache Iceberg Zugriffsmethode verwenden, erweitern Sie Erweiterte Eigenschaften und geben Sie für Dependent JAR-Pfad als Voraussetzung die S3-URI der Client-Katalog-JAR-Datei ein, die Sie in einen S3-Bucket hochgeladen haben. Zum Beispiel s3://amzn-s3-demo-bucket1/jars0.1.5/s3-tables-catalog-for-iceberg-runtime- .jar
-
Wählen Sie Speichern, um den Auftrag zu erstellen.
-
Wählen Sie Ausführen, starten Sie den Job und überprüfen Sie den Jobstatus auf der Registerkarte Ausführungen.
Das folgende Verfahren zeigt, wie Sie den verwenden, um einen ETL-Job zu erstellen, der Ihre S3-Tabellen abfragt. AWS CLI Um die Befehle zu verwenden, ersetzen Sie sie durch Ihre eigenen. placeholder
values
-
Erstellen Sie einen AWS Glue Job.
aws glue create-job \
--name etl-tables-job \
--role arn:aws:iam::111122223333:role/AWSGlueServiceRole \
--command '{
"Name": "glueetl",
"ScriptLocation": "s3://amzn-s3-demo-bucket1/scripts/glue-etl-query.py",
"PythonVersion": "3"
}' \
--default-arguments '{
"--job-language": "python",
"--class": "GlueApp"
}' \
--glue-version "5.0"
(Optional) Wenn Sie die Apache Iceberg Zugriffsmethode Amazon S3 Tables Catalog für den Zugriff verwenden, fügen Sie den Client-Katalog JAR --default-arguments mithilfe des --extra-jars Parameters hinzu. Ersetzen Sie den input placeholders durch Ihren eigenen, wenn Sie den Parameter hinzufügen.
"--extra-jars": "s3://amzn-s3-demo-bucket/jar-path/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar"
-
Starten Sie Ihren Auftrag.
aws glue start-job-run \
--job-name etl-tables-job
-
Um Ihren Jobstatus zu überprüfen, kopieren Sie die Ausführungs-ID aus dem vorherigen Befehl und geben Sie sie in den folgenden Befehl ein.
aws glue get-job-run --job-name etl-tables-job \
--run-id jr_ec9a8a302e71f8483060f87b6c309601ea9ee9c1ffc2db56706dfcceb3d0e1ad