View a markdown version of this page

Spark-Jobs mit Amazon EMR Serverless ausführen - FSx für ONTAP

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.

Spark-Jobs mit Amazon EMR Serverless ausführen

Datenentwicklungsteams, die Spark-Workloads ausführen — für die Protokollverarbeitung, Feature-Engineering, komplexe ETL oder wissenschaftliche Analysen — verfügen häufig über Quelldaten auf einem FSx for ONTAP-Volume, die von lokalen Ingestion-Pipelines, NFS- oder SMB-Datamovern oder Anwendungen geschrieben wurden, die das Volume direkt mounten.

Wenn ein Amazon S3 S3-Zugriffspunkt an das Volume angeschlossen ist, liest Amazon EMR Serverless die Daten über den Access Point, führt den Spark-Job darauf aus und schreibt die Ergebnisse auf dasselbe Volume zurück. Amazon EMR Serverless wickelt den Cluster-Lebenszyklus automatisch ab — Sie reichen einen Job ein und zahlen für die Sekunden, in denen er ausgeführt wird.

Dieses Muster eignet sich für Workloads, die eine vollständige Spark-Laufzeit benötigen (benutzerdefinierte Bibliotheken, iterative Algorithmen, Transformationen mit langer Laufzeit oder interaktive Notebooks über Amazon EMR Studio), bei denen die leichteren Optionen — Amazon Athena für SQL und AWS Glue für verwaltetes ETL — nicht die richtige Lösung sind. Informationen zu diesen Alternativen finden Sie unter und. Dateien mit SQL mit Amazon Athena abfragen Erstellen Sie ETL-Pipelines mit AWS Glue

In diesem Tutorial simulieren Sie, dass ein Meteorologieteam die Beobachtungen der NOAA Global Surface Summary of the Day (GSOD) für ein Jahr zusammenfasst, die auf einem FSx for ONTAP-Volumen durchgeführt wurden. Sie reichen einen PySpark Job ein, der die CSV-Rohdateien liest, monatliche Aggregate pro Station berechnet (Durchschnittstemperatur, Gesamtniederschlag und Anzahl der Tage mit Niederschlagsereignissen) und die Ergebnisse als nach Monaten partitioniertes Parquet schreibt — alles über den Access Point.

Anmerkung

Die Bearbeitung dieses Tutorials dauert etwa 30 bis 40 Minuten. Für die AWS-Services verwendeten Ressourcen fallen Gebühren für die von Ihnen erstellten Ressourcen an. Wenn Sie alle Schritte, einschließlich des Abschnitts Aufräumen, umgehend abschließen, belaufen sich die voraussichtlichen Kosten im Osten der USA (Nord-Virginia) AWS-Region auf weniger als 1$. In dieser Schätzung sind die laufenden Gebühren für das FSx for ONTAP-Volumen selbst nicht enthalten.

Voraussetzungen

  • Ein FSx for ONTAP-Volume mit angeschlossenem Amazon S3 S3-Zugriffspunkt. Der Access Point muss über einen Internetnetzwerk-Ursprung verfügen, damit der Amazon EMR Serverless-Service ihn erreichen kann. Detaillierte Anweisungen finden Sie unter Erstellen eines Zugriffspunkts.

  • AWS CLI Version 2 wurde mit Anmeldeinformationen installiert und konfiguriert, mit denen IAM-Rollen und serverlose Amazon EMR-Ressourcen erstellt werden können.

Schritt 1: Laden Sie den Beispieldatensatz auf den Access Point hoch

Der NOAA GSOD-Datensatz ist ein öffentlicher Datensatz mit täglichen Wetterbeobachtungen, eine CSV-Datei pro Station und Jahr. Für dieses Tutorial laden Sie eine Teilmenge von 100 Stationen aus dem öffentlichen noaa-gsod-pds Amazon S3 S3-Bucket herunter und laden sie auf Ihren Access Point hoch.

  1. Laden Sie die ersten 100 Stationsdateien für 2024 herunter.

    $ mkdir -p ~/gsod && cd ~/gsod aws s3 ls s3://noaa-gsod-pds/2024/ --no-sign-request | head -100 | awk '{print $NF}' > files.txt while read f; do aws s3 cp "s3://noaa-gsod-pds/2024/$f" "$f" --no-sign-request --only-show-errors done < files.txt ls | wc -l

    Der Befehl lädt ungefähr 100 CSV-Dateien mit einer Gesamtgröße von etwa 7—8 MB herunter.

  2. Laden Sie die Dateien unter dem Präfix auf den Access Point hoch. gsod/2024/ access-point-aliasErsetzen Sie es durch Ihren Access Point-Alias.

    $ aws s3 cp ~/gsod/ "s3://access-point-alias/gsod/2024/" --recursive --exclude "files.txt" --only-show-errors

Schritt 2: Schreiben Sie den PySpark Job

Der Job liest alle CSV-Dateien unter dem Eingabepräfix, filtert Sentinel-Werte, die fehlende Daten darstellen, analysiert das FRSHTT Bitfeld (Nebel, Regen, Schnee, Hagel, Donner, Tornado), um die Tage der Niederschlagsereignisse zu zählen, aggregiert pro (station, month) und schreibt partitioniertes Parquet zurück zum Access Point.

  1. Speichern gsod_monthly.py Sie das folgende Skript in einer Datei mit dem Namen.

    # gsod_monthly.py import sys from pyspark.sql import SparkSession from pyspark.sql import functions as F INPUT_PATH, OUTPUT_PATH = sys.argv[1], sys.argv[2] # GSOD sentinels for missing data TEMP_SENTINEL = 9999.9 PRCP_SENTINEL = 99.99 spark = SparkSession.builder.appName("gsod-monthly-summary").getOrCreate() raw = spark.read.option("header", True).csv(INPUT_PATH) cleaned = (raw .select( F.col("STATION").alias("station"), F.col("NAME").alias("station_name"), F.col("LATITUDE").cast("double").alias("lat"), F.col("LONGITUDE").cast("double").alias("lon"), F.to_date("DATE", "yyyy-MM-dd").alias("date"), F.col("TEMP").cast("double").alias("temp_f"), F.col("PRCP").cast("double").alias("prcp_in"), F.col("FRSHTT").alias("frshtt"), ) .filter(F.col("temp_f") != TEMP_SENTINEL) .withColumn("month", F.date_format("date", "yyyy-MM")) .withColumn( "prcp_in", F.when(F.col("prcp_in") == PRCP_SENTINEL, None).otherwise(F.col("prcp_in")), ) # FRSHTT is a 6-char bitfield: Fog, Rain, Snow, Hail, Thunder, Tornado. # Check only positions 2-4 (Rain, Snow, Hail) for precipitation events. .withColumn( "had_precip_event", F.when(F.col("frshtt").substr(2, 3).rlike("1"), 1).otherwise(0), ) ) monthly = (cleaned .groupBy("station", "station_name", "lat", "lon", "month") .agg( F.avg("temp_f").alias("avg_temp_f"), F.min("temp_f").alias("min_temp_f"), F.max("temp_f").alias("max_temp_f"), F.sum("prcp_in").alias("total_prcp_in"), F.sum("had_precip_event").alias("precip_event_days"), F.count("*").alias("observation_days"), ) ) (monthly.write .mode("overwrite") .partitionBy("month") .parquet(OUTPUT_PATH)) spark.stop()
  2. Laden Sie das Skript unter dem scripts/ Präfix auf den Access Point hoch.

    $ aws s3 cp gsod_monthly.py "s3://access-point-alias/scripts/gsod_monthly.py"

Schritt 3: Erstellen Sie die Amazon EMR Serverless-Jobrolle

Amazon EMR Serverless übernimmt eine IAM-Ausführungsrolle, wenn es Ihren Job ausführt. Die Rolle benötigt Berechtigungen zum Lesen und Schreiben des Access Points sowie zum Schreiben von Protokollen in Logs. CloudWatch Erweitern Sie den folgenden Abschnitt für die Einrichtungsschritte.

  1. Speichern Sie die folgende Vertrauensrichtlinie unter. emr-trust-policy.json Dadurch kann Amazon EMR Serverless die Rolle übernehmen.

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": "emr-serverless.amazonaws.com"}, "Action": "sts:AssumeRole" }] }
  2. Speichern Sie die folgende Berechtigungsrichtlinie unter. emr-permissions.json Ersetzen Sie regionaccount-id, und access-point-name durch Ihre Werte.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Logs", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" }, { "Sid": "APRead", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:region:account-id:accesspoint/access-point-name", "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*" ] }, { "Sid": "APWrite", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*" } ] }
  3. Erstellen Sie die Rolle und hängen Sie die Richtlinie an.

    $ aws iam create-role --role-name fsxn-emr-job-role \ --assume-role-policy-document file://emr-trust-policy.json aws iam put-role-policy --role-name fsxn-emr-job-role \ --policy-name emr-access --policy-document file://emr-permissions.json

Schritt 4: Erstellen und starten Sie die Amazon EMR Serverless-Anwendung

Eine serverlose Amazon EMR-Anwendung ist eine langlebige Rechenumgebung für ein bestimmtes Release-Label und eine Engine (Spark oder Hive). Sie reichen einen oder mehrere Jobs bei ihr ein. Anwendungen skalieren die Rechenleistung automatisch auf der Grundlage der Auftragsnachfrage nach oben und unten und werden im Leerlauf abgeschaltet, wenn keine Jobs ausgeführt werden.

  1. Erstellen Sie eine Spark-Anwendung mit einer aktuellen Amazon EMR-Version.

    $ aws emr-serverless create-application \ --name fsxn-emr-app --type SPARK --release-label emr-7.0.0

    Beachten Sie die applicationId in der Antwort.

  2. Starten Sie die Anwendung. Beim Starten wird ein kleiner Pool von Mitarbeitern vorgewärmt, sodass der erste Job ohne Kaltstartverzögerung ausgeführt wird.

    $ aws emr-serverless start-application --application-id application-id

    Wartet darauf, dass der Staat wird. STARTED

    $ aws emr-serverless get-application --application-id application-id \ --query 'application.state'

Schritt 5: Reichen Sie den Spark-Job ein

Reichen Sie den Job mit der Anwendungs-ID und der Ausführungsrolle ein. Der Job liest die unformatierten CSVs aus dem partitionierten Parquet gsod/2024/ und schreibt in beide gsod-monthly/ Dateien über den Access Point.

  1. Speichern Sie die Konfiguration des Job-Treibers unter. job-driver.json Ersetzen Sie die Platzhalter.

    { "sparkSubmit": { "entryPoint": "s3://access-point-alias/scripts/gsod_monthly.py", "entryPointArguments": [ "s3://access-point-alias/gsod/2024/", "s3://access-point-alias/gsod-monthly/" ], "sparkSubmitParameters": "--conf spark.executor.cores=2 --conf spark.executor.memory=4g --conf spark.driver.cores=2 --conf spark.driver.memory=4g --conf spark.executor.instances=2" } }
  2. Speichern Sie die folgende Überwachungskonfiguration unter. job-config.json Es sendet Treiber- und Executor-Protokolle an CloudWatch Logs.

    { "monitoringConfiguration": { "cloudWatchLoggingConfiguration": { "enabled": true, "logGroupName": "/aws/emr-serverless/fsxn-emr-app" } } }
  3. Reichen Sie den Job ein.

    $ aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn arn:aws:iam::account-id:role/fsxn-emr-job-role \ --name gsod-monthly \ --job-driver file://job-driver.json \ --configuration-overrides file://job-config.json

    Beachten Sie die jobRunId in der Antwort.

  4. Fragen Sie den Jobstatus ab. Der Job wechselt von SCHEDULED nach RUNNING nachSUCCESS.

    $ aws emr-serverless get-job-run \ --application-id application-id \ --job-run-id job-run-id \ --query 'jobRun.state'
Anmerkung

Wenn der Job fehlschlägt, überprüfen Sie die CloudWatch Treiberprotokolle in den Protokollen unter der Protokollgruppe/aws/emr-serverless/fsxn-emr-app. Amazon EMR Serverless schreibt einen Protokollstream pro Auftragsausführung.

Schritt 6: Untersuchen Sie die Ausgabe

Stellen Sie sicher, dass der Job eine Parquet-Partition pro Monat geschrieben hat und dass die Ausgabe lesbar ist.

  1. Listet die Ausgabepartitionen auf.

    $ aws s3 ls "s3://access-point-alias/gsod-monthly/" --recursive

    Sie sollten eine Parquet-Datei pro month=YYYY-MM/ Partition sowie eine _SUCCESS Markierung im Stammverzeichnis sehen.

  2. Lesen Sie eine Partition lokal, um den Inhalt zu überprüfen.

    $ aws s3 cp "s3://access-point-alias/gsod-monthly/month=2024-06/" . \ --recursive --exclude "_SUCCESS" python3 -c "import pyarrow.parquet as pq; \ t = pq.read_table(next(__import__('glob').iglob('*.parquet'))); \ print(t.schema); print(t.to_pandas().head())"

    Das Ausgabeschema umfasst station station_namelat,lon,avg_temp_f,min_temp_f,max_temp_f,,total_prcp_in,precip_event_days, undobservation_days.

Erweiterung des Musters

  • Fragen Sie die Ausgabe mit Spark SQL ab. Registrieren Sie die partitionierte Ausgabe als Tabelle bei der AWS Glue Data Catalog und fragen Sie sie mit Spark SQL, Athena oder einem anderen Tool ab, das AWS Glue Katalogtabellen liest. Anweisungen zur Registrierung eines auf Access Points gestützten Datensatzes finden Sie unter. Dateien mit SQL mit Amazon Athena abfragen

  • Verwenden Sie Iceberg für ACID-Schreibvorgänge. Für Workloads, die Daten aktualisieren oder zusammenführen, konfigurieren Sie den Job so, dass er in eine Iceberg-Tabelle auf dem Access Point schreibt und nicht in ein einfaches Parquet. Amazon EMR Serverless beinhaltet standardmäßig die Iceberg-Runtime auf den Labels neuerer Versionen.

  • Interaktiv mit Amazon EMR Studio ausführen. Schließen Sie ein Jupyter-Notebook an die Amazon EMR Serverless-Anwendung an, um die Daten interaktiv zu untersuchen. Weitere Informationen finden Sie unter Interaktive Workloads mit Amazon EMR Serverless im Amazon EMR Serverless User Guide.

  • Planen Sie den Job. Verwenden Sie Amazon EventBridge Scheduler oder AWS Step Functions, um den Job nach einem wiederkehrenden Zeitplan auszuführen (z. B. wenn ein neuer Tag mit Daten auf dem Volume landet).

Fehlerbehebung

Der Job schlägt AccessDenied auf dem Access Point fehl

Stellen Sie sicher, dass die Job-Rollenrichtlinie den ARN s3:ListBucket auf dem Access Point (nicht auf einem Bucket) gewährt s3:GetObject und dass der Access Point über einen Internet-Netzwerkursprung verfügt, sodass der Amazon EMR Serverless-Service ihn erreichen kann.

Der Job ist erfolgreich, aber die Ausgabe ist leer

Überprüfen Sie den Eingabepfad. Amazon S3 ListObjectsV2 behandelt Präfixe wörtlich, sodass sich s3://alias/gsod/2024 (kein abschließender Schrägstrich) und s3://alias/gsod/2024/ (nachfolgender Schrägstrich) unterschiedlich verhalten können. Fügen Sie den abschließenden Schrägstrich ein, wenn Sie auf ein Dateiverzeichnis zeigen.

Treiberprotokolle befinden sich nicht in den Protokollen CloudWatch

Die Überwachungskonfiguration muss an und nicht --configuration-overrides an start-job-run der Anwendung weitergegeben werden. Jeder ausgeführte Job schreibt in seinen eigenen Protokollstream unter der konfigurierten Protokollgruppe.

Bereinigen

Beenden und löschen Sie die Anwendung, entfernen Sie die IAM-Rolle und löschen Sie alle hochgeladenen Daten, die Sie nicht mehr benötigen.

$ aws emr-serverless stop-application --application-id application-id aws emr-serverless delete-application --application-id application-id aws iam delete-role-policy --role-name fsxn-emr-job-role --policy-name emr-access aws iam delete-role --role-name fsxn-emr-job-role aws s3 rm "s3://access-point-alias/scripts/gsod_monthly.py" aws s3 rm "s3://access-point-alias/gsod/" --recursive aws s3 rm "s3://access-point-alias/gsod-monthly/" --recursive