Arbeiten mit Apache Iceberg in Amazon EMR - AWS Artikel über Prescriptive

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.

Arbeiten mit Apache Iceberg in Amazon EMR

Amazon EMR bietet Datenverarbeitung im Petabyte-Bereich, interaktive Analysen und maschinelles Lernen in der Cloud mithilfe von Open-Source-Frameworks wie Apache Spark, Apache Hive, Flink und Trino.

Anmerkung

In diesem Handbuch wird Apache Spark als Beispiele verwendet.

Amazon EMR unterstützt mehrere Bereitstellungsoptionen: Amazon EMR auf Amazon EC2, Amazon EMR auf Amazon EKS, Amazon EMR Serverless und Amazon EMR auf. AWS Outposts Informationen zur Auswahl einer Bereitstellungsoption für Ihren Workload finden Sie in den häufig gestellten Fragen zu Amazon EMR.

Versions- und Funktionskompatibilität

Amazon EMR Version 6.5.0 und spätere Versionen unterstützen Apache Iceberg nativ. Eine Liste der unterstützten Iceberg-Versionen für jede Amazon EMR-Version finden Sie im Iceberg-Versionsverlauf in der Amazon EMR-Dokumentation. Lesen Sie auch die Überlegungen und Einschränkungen zur Verwendung von Iceberg auf Amazon EMR, um zu erfahren, welche Iceberg-Funktionen in Amazon EMR auf verschiedenen Frameworks unterstützt werden.

Wir empfehlen Ihnen, die neueste Amazon EMR-Version zu verwenden, um von der neuesten unterstützten Iceberg-Version zu profitieren. Bei den Codebeispielen und Konfigurationen in diesem Abschnitt wird davon ausgegangen, dass Sie die Amazon EMR-Version emr-6.9.0 verwenden.

Erstellen eines Amazon EMR-Clusters mit Iceberg

Um einen Amazon EMR-Cluster auf Amazon EC2 mit installiertem Iceberg zu erstellen, folgen Sie den Anweisungen in der Amazon EMR-Dokumentation. 

Insbesondere sollte Ihr Cluster mit der folgenden Klassifizierung konfiguriert werden:

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

Ab Amazon EMR 6.6.0 können Sie auch Amazon EMR Serverless oder Amazon EMR auf Amazon EKS als Bereitstellungsoptionen für Ihre Iceberg-Workloads verwenden.

Entwicklung von Iceberg-Anwendungen in Amazon EMR

Um den Spark-Code für Ihre Iceberg-Anwendungen zu entwickeln, können Sie Amazon EMR Studio verwenden, eine webbasierte integrierte Entwicklungsumgebung (IDE) für vollständig verwaltete Jupyter-Notebooks, die auf Amazon EMR-Clustern ausgeführt werden. 

Verwenden von Amazon EMR Studio-Notizbüchern

Sie können Spark-Anwendungen interaktiv in Amazon EMR Studio Workspace-Notebooks entwickeln und diese Notebooks mit Ihren Amazon EMR auf Amazon EC2 EC2-Clustern oder Amazon EMR auf Amazon EKS-verwalteten Endpunkten verbinden. Anweisungen zur Einrichtung von EMR Studio für Amazon EMR auf Amazon EC2 und Amazon EMR auf Amazon EKS finden Sie in der AWS-Service Dokumentation.

Gehen Sie wie folgt vor, um Iceberg in EMR Studio zu verwenden: 

  1. Starten Sie einen Amazon EMR-Cluster mit aktiviertem Iceberg, wie unter Verwenden Sie einen Cluster mit installiertem Iceberg beschrieben. 

  2. Richten Sie ein EMR Studio ein. Anweisungen finden Sie unter Amazon EMR Studio einrichten.

  3. Öffnen Sie ein EMR Studio Workspace-Notizbuch und führen Sie den folgenden Code als erste Zelle im Notizbuch aus, um Ihre Spark-Sitzung für die Verwendung von Iceberg zu konfigurieren:

    %%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }

    Wobei:

    • <catalog_name>ist der Name Ihres Iceberg Spark-Sitzungskatalogs. Ersetzen Sie ihn durch den Namen Ihres Katalogs und denken Sie daran, die Verweise in allen Konfigurationen, die mit diesem Katalog verknüpft sind, zu ändern. In Ihrem Code sollten Sie dann wie folgt auf Ihre Iceberg-Tabellen mit dem vollqualifizierten Tabellennamen, einschließlich des Namens des Spark-Sitzungskatalogs, verweisen:

      <catalog_name>.<database_name>.<table_name>
    • <catalog_name>.warehouseverweist auf den Amazon S3 S3-Pfad, in dem Sie Ihre Daten und Metadaten speichern möchten.

    • Um den Katalog zu einem zu machen AWS Glue Data Catalog, setzen Sie <catalog_name>.catalog-impl auforg.apache.iceberg.aws.glue.GlueCatalog. Dieser Schlüssel ist erforderlich, um auf eine Implementierungsklasse für jede benutzerdefinierte Katalogimplementierung zu verweisen. Im Abschnitt Allgemeine bewährte Methoden weiter unten in diesem Handbuch werden die verschiedenen von Iceberg unterstützten Kataloge beschrieben.

    • Verwenden Sie org.apache.iceberg.aws.s3.S3FileIO als, um <catalog_name>.io-impl den mehrteiligen Amazon S3 S3-Upload für hohe Parallelität zu nutzen.

  4. Sie können jetzt wie bei jeder anderen Spark-Anwendung mit der interaktiven Entwicklung Ihrer Spark-Anwendung für Iceberg im Notizbuch beginnen.

Weitere Informationen zur Konfiguration von Spark für Apache Iceberg mithilfe von Amazon EMR Studio finden Sie im Blogbeitrag Build a high-performance, ACID-compliant, evolving data lake using Apache Iceberg on Amazon EMR. 

Iceberg-Jobs in Amazon EMR ausführen

Nachdem Sie den Spark-Anwendungscode für Ihren Iceberg-Workload entwickelt haben, können Sie ihn auf jeder Amazon EMR-Bereitstellungsoption ausführen, die Iceberg unterstützt (siehe Häufig gestellte Fragen zu Amazon EMR).

Wie bei anderen Spark-Jobs können Sie Arbeit an einen Amazon EMR on Amazon EC2 EC2-Cluster senden, indem Sie Schritte hinzufügen oder Spark-Jobs interaktiv an den Master-Knoten senden. Informationen zum Ausführen eines Spark-Jobs finden Sie auf den folgenden Amazon EMR-Dokumentationsseiten:

Die folgenden Abschnitte enthalten ein Beispiel für jede Amazon EMR-Bereitstellungsoption.

Amazon EMR auf Amazon EC2

Sie können die folgenden Schritte ausführen, um den Iceberg Spark-Job einzureichen:

  1. Erstellen Sie die Datei emr_step_iceberg.json mit dem folgenden Inhalt auf Ihrer Workstation:

    [{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--conf", "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "--conf", "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog", "--conf", "spark.sql.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "--conf", "spark.sql.catalog.<catalog_name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
  2. Ändern Sie die Konfigurationsdatei für Ihren speziellen Spark-Job, indem Sie die fett hervorgehobenen Iceberg-Konfigurationsoptionen anpassen.

  3. Reichen Sie den Schritt mit AWS Command Line Interface ()AWS CLI ein. Führen Sie den Befehl in dem Verzeichnis aus, in dem sich die emr_step_iceberg.json Datei befindet.

    aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json

Amazon EMR Serverless

Um einen Iceberg Spark-Job an Amazon EMR Serverless zu senden, verwenden Sie: AWS CLI

  1. Erstellen Sie die Datei emr_serverless_iceberg.json mit dem folgenden Inhalt auf Ihrer Workstation:

    { "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars /usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. Ändern Sie die Konfigurationsdatei für Ihren speziellen Spark-Job, indem Sie die fett hervorgehobenen Iceberg-Konfigurationsoptionen anpassen.

  3. Senden Sie den Job mit dem. AWS CLI Führen Sie den Befehl in dem Verzeichnis aus, in dem sich die emr_serverless_iceberg.json Datei befindet:

    aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json

So reichen Sie mithilfe der EMR Studio-Konsole einen Iceberg Spark-Job an Amazon EMR Serverless ein:

  1. Folgen Sie den Anweisungen in der Amazon EMR Serverless-Dokumentation.

  2. Verwenden Sie für die Jobkonfiguration die für Spark bereitgestellte Iceberg-Konfiguration für Spark AWS CLI und passen Sie die hervorgehobenen Felder für Iceberg an. Eine ausführliche Anleitung finden Sie unter Using Apache Iceberg with EMR Serverless in der Amazon EMR-Dokumentation.

Amazon EMR auf Amazon EKS

Um einen Iceberg Spark-Job an Amazon EMR auf Amazon EKS zu senden, verwenden Sie: AWS CLI

  1. Erstellen Sie die Datei emr_eks_iceberg.json mit dem folgenden Inhalt auf Ihrer Workstation:

    { "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. Ändern Sie die Konfigurationsdatei für Ihren Spark-Job, indem Sie die fett hervorgehobenen Iceberg-Konfigurationsoptionen anpassen.

  3. Senden Sie den Job mit dem. AWS CLI Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem sich die emr_eks_iceberg.json Datei befindet:

    aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json

Eine ausführliche Anleitung finden Sie unter Using Apache Iceberg with Amazon EMR on EKS in der Dokumentation zu Amazon EMR on EKS. 

Bewährte Methoden für Amazon EMR

Dieser Abschnitt enthält allgemeine Richtlinien für die Optimierung von Spark-Jobs in Amazon EMR, um das Lesen und Schreiben von Daten in Iceberg-Tabellen zu optimieren. Iceberg-spezifische Best Practices finden Sie im Abschnitt „Bewährte Methoden“ weiter unten in diesem Handbuch.

  • Verwenden Sie die neueste Version von Amazon EMR — Amazon EMR bietet mit der Amazon EMR Spark-Laufzeit sofort Spark-Optimierungen. AWS verbessert die Leistung der Spark-Runtime-Engine mit jeder neuen Version.

  • Ermitteln Sie die optimale Infrastruktur für Ihre Spark-Workloads — Spark-Workloads benötigen möglicherweise unterschiedliche Hardwaretypen für unterschiedliche Jobmerkmale, um eine optimale Leistung zu gewährleisten. Amazon EMR unterstützt verschiedene Instance-Typen (z. B. rechenoptimiert, speicheroptimiert, universell einsetzbar und speicheroptimiert), um alle Arten von Verarbeitungsanforderungen abzudecken. Wenn Sie neue Workloads integrieren, empfehlen wir, einen Benchmark mit allgemeinen Instance-Typen wie M5 oder M6g durchzuführen. Überwachen Sie das Betriebssystem (OS) und die YARN-Metriken von Ganglia und Amazon, CloudWatch um die Systemengpässe (CPU, Speicher, Speicher und I/O) bei Spitzenlast zu ermitteln und geeignete Hardware auszuwählen.

  • Tune spark.sql.shuffle.partitions — Legen Sie die spark.sql.shuffle.partitions Eigenschaft auf die Gesamtzahl der virtuellen Kerne (vCores) in Ihrem Cluster oder auf ein Vielfaches dieses Werts fest (in der Regel das 1- bis 2-fache der Gesamtzahl der vCores). Diese Einstellung wirkt sich auf die Parallelität von Spark aus, wenn Sie Hash- und Bereichspartitionierung als Schreibverteilungsmodus verwenden. Vor dem Schreiben wird ein Shuffle angefordert, um die Daten zu organisieren, wodurch die Ausrichtung der Partitionen gewährleistet wird.

  • Verwaltete Skalierung aktivieren — Für fast alle Anwendungsfälle empfehlen wir, die verwaltete Skalierung und die dynamische Zuweisung zu aktivieren. Wenn Sie jedoch einen Workload haben, der ein vorhersehbares Muster aufweist, empfehlen wir Ihnen, die automatische Skalierung und die dynamische Zuweisung zu deaktivieren. Wenn die verwaltete Skalierung aktiviert ist, empfehlen wir die Verwendung von Spot-Instances, um die Kosten zu senken. Verwenden Sie Spot-Instances für Task-Knoten anstelle von Core- oder Master-Knoten. Wenn Sie Spot-Instances verwenden, verwenden Sie Instance-Flotten mit mehreren Instance-Typen pro Flotte, um die Spot-Verfügbarkeit sicherzustellen.

  • Verwenden Sie nach Möglichkeit Broadcast-Join — Der Broadcast-Join (mapside) ist der optimalste Join, sofern eine Ihrer Tabellen klein genug ist, um in den Speicher Ihres kleinsten Knotens zu passen (in der Reihenfolge von MB) und Sie einen Equi (=) -Join durchführen. Alle Join-Typen mit Ausnahme von vollständigen Outer-Joins werden unterstützt. Ein Broadcast-Join überträgt die kleinere Tabelle als Hashtabelle an alle Worker-Knoten im Speicher. Nachdem die kleine Tabelle übertragen wurde, können Sie keine Änderungen mehr daran vornehmen. Da sich die Hashtabelle lokal in der Java Virtual Machine (JVM) befindet, kann sie anhand der Join-Bedingung mithilfe eines Hash-Joins problemlos mit der großen Tabelle zusammengeführt werden. Broadcast-Joins bieten aufgrund des minimalen Shuffle-Overheads eine hohe Leistung.

  • Optimieren Sie den Garbage-Collector — Wenn die Garbage-Collection-Zyklen (GC) langsam sind, sollten Sie erwägen, für eine bessere Leistung vom standardmäßigen parallel Garbage-Collector auf G1GC umzusteigen. Um die GC-Leistung zu optimieren, können Sie die GC-Parameter fein abstimmen. Um die GC-Leistung zu verfolgen, können Sie sie mithilfe der Spark-Benutzeroberfläche überwachen. Idealerweise sollte die GC-Zeit weniger als oder gleich 1 Prozent der gesamten Aufgabenlaufzeit sein.