View a markdown version of this page

Esegui sessioni interattive con Amazon EMR Serverless tramite Spark Connect - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esegui sessioni interattive con Amazon EMR Serverless tramite Spark Connect

Con la versione Amazon EMR emr-7.13.0 e successive, puoi connetterti a un'applicazione Amazon EMR Serverless da PySpark client autogestiti come VS Code e notebook Jupyter utilizzando le API di PyCharm sessione EMR Serverless con Apache Spark Connect. Spark Connect utilizza un'architettura client-server che separa il codice dell'applicazione dal processo del driver Spark. Sviluppi ed esegui il debug del PySpark codice nel tuo IDE locale mentre le operazioni Spark vengono eseguite su EMR Serverless Computing. Spark Connect offre i seguenti vantaggi:

  • Connettiti a EMR Serverless da qualsiasi PySpark client, inclusi VS Code e notebook PyCharm Jupyter.

  • Imposta punti di interruzione e PySpark codice dettagliato nel tuo IDE mentre esegui i dati su scala di produzione in remoto. DataFrames

Una sessione Spark Connect è una connessione gestita tra il PySpark client locale e un driver Spark in esecuzione su Amazon EMR Serverless. Quando avvii una sessione, EMR Serverless esegue il provisioning di un driver Spark e degli esecutori per tuo conto. Il client locale invia DataFrame le operazioni SQL al driver, che le esegue in remoto. La sessione persiste finché non la interrompi o non raggiunge il timeout di inattività, quindi puoi eseguire più query in modo interattivo senza riavviare Spark. Ogni sessione ha il proprio URL dell'endpoint e il token di autenticazione che usi per connetterti.

Autorizzazioni richieste

Oltre alle autorizzazioni richieste per accedere ad Amazon EMR Serverless, aggiungi anche le seguenti autorizzazioni al tuo ruolo IAM per accedere a un endpoint Spark Connect e gestire le sessioni Spark Connect:

emr-serverless:StartSession

Concede il permesso di creare una sessione Spark Connect sull'applicazione specificata come. Resource

emr-serverless:GetSessionEndpoint

Concede il permesso di recuperare l'URL dell'endpoint Spark Connect e il token di autenticazione per una sessione.

emr-serverless:GetSession

Concede il permesso di ottenere lo stato di una sessione.

emr-serverless:ListSessions

Concede il permesso di elencare le sessioni in un'applicazione.

emr-serverless:TerminateSession

Concede il permesso di terminare una sessione.

iam:PassRole

Concede il permesso di accedere al ruolo di esecuzione IAM durante la creazione della sessione Spark Connect. Amazon EMR Serverless utilizza questo ruolo per eseguire i carichi di lavoro.

emr-serverless:GetResourceDashboard

Concede il permesso di generare l'URL dell'interfaccia utente di Spark e fornisce l'accesso ai log della sessione.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EMRServerlessApplicationLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:StartSession", "emr-serverless:ListSessions" ], "Resource": [ "arn:aws:emr-serverless:us-east-1:111122223333:/applications/application-id" ] }, { "Sid": "EMRServerlessSessionLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:GetSession", "emr-serverless:GetSessionEndpoint", "emr-serverless:TerminateSession", "emr-serverless:GetResourceDashboard" ], "Resource": [ "arn:aws:emr-serverless:us-east-1:111122223333:/applications/application-id/sessions/*" ] }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::111122223333:role/EMRServerlessExecutionRole" ], "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }

Lavorare con sessioni interattive

Per creare un' Connect-enabled applicazione Spark e connetterti ad essa, segui questi passaggi.

Per avviare una sessione Spark Connect
  1. Crea un'applicazione con sessioni Spark Connect.

    aws emr-serverless create-application \ --type "SPARK" \ --name "spark-connect-app" \ --release-label emr-7.13.0 \ --interactive-configuration '{"sessionEnabled": true}'
  2. Dopo che Amazon EMR Serverless ha creato l'applicazione, avviala se non hai abilitato l'avvio automatico per accettare le sessioni di Spark Connect.

    aws emr-serverless start-application \ --application-id APPLICATION_ID
  3. Usa il seguente comando per verificare lo stato della tua applicazione. Dopo che lo stato è diventatoSTARTED, avvia una sessione.

    aws emr-serverless get-application \ --application-id APPLICATION_ID
  4. Avvia una sessione con un ruolo di esecuzione IAM che conceda l'accesso ai tuoi dati.

    aws emr-serverless start-session \ --application-id APPLICATION_ID \ --execution-role-arn arn:aws:iam::account-id:role/EMRServerlessExecutionRole
  5. Monitora lo stato della sessione utilizzando l'get-sessionAPI e attendi che la sessione sia STARTED attivaIDLE.

    aws emr-serverless get-session \ --application-id APPLICATION_ID \ --session-id SESSION_ID
  6. Recupera l'endpoint e il token di autenticazione di Spark Connect. L'URL dell'endpoint restituito da GetSessionEndpoint non include un numero di porta. Quando si costruisce l'URL di sc:// connessione, è necessario aggiungere, ad esempio:443,. sc:// hostname :443/;use_ssl=true;x-aws-proxy-auth= token Senza di essa, il PySpark client utilizza per impostazione predefinita la porta 15002, che non è raggiungibile su EMR Serverless.

    aws emr-serverless get-session-endpoint \ --application-id APPLICATION_ID \ --session-id SESSION_ID

    La risposta include l'URL dell'endpoint e un token di autenticazione:

    { "endpoint": "ENDPOINT_URL", "authToken": "AUTH_TOKEN", "authTokenExpiresAt": "AUTH_TOKEN_EXPIRY_TIME" }
  7. Quando l'endpoint è pronto, connettiti da un PySpark client. Installa il PySpark client che corrisponde alla versione di Spark sulla tua applicazione EMR Serverless e l' AWS SDK per Python.

    # Match the PySpark version to your EMR Serverless release version (3.5.6 for emr-7.13.0) pip install pyspark[connect]==3.5.6 pip install boto3

Di seguito è riportato un esempio di script Python per avviare una sessione e inviare richieste direttamente all'endpoint della sessione:

import boto3 import time from pyspark.sql import SparkSession from pyspark.sql.functions import col client = boto3.client('emr-serverless', region_name='REGION') APPLICATION_ID = 'APPLICATION_ID' EXECUTION_ROLE = 'arn:aws:iam::account-id:role/EMRServerlessExecutionRole' # Start the session response = client.start_session( applicationId=APPLICATION_ID, executionRoleArn=EXECUTION_ROLE ) session_id = response['sessionId'] print(f"Session {session_id} starting...") # Wait for the session to be ready while True: response = client.get_session( applicationId=APPLICATION_ID, sessionId=session_id ) state = response['session']['state'] print(f"Session state: {state}") if state in ('STARTED', 'IDLE'): break if state in ('FAILED', 'TERMINATED'): raise Exception(f"Session failed: {response['session'].get('stateDetails', 'Unknown error')}") time.sleep(5) # Retrieve the Spark Connect endpoint and authentication token response = client.get_session_endpoint( applicationId=APPLICATION_ID, sessionId=session_id ) # Construct the authenticated remote URL auth_token = response['authToken'] endpoint_url = response['endpoint'] connect_url = endpoint_url.replace("https://", "sc://", 1) + ":443/;use_ssl=true;" connect_url += f"x-aws-proxy-auth={auth_token}" # Start the Spark session spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run SQL spark.sql("SELECT 1+1 AS result").show() # Run DataFrame operations df = spark.range(100).withColumn("squared", col("id") * col("id")) df.show(10) print(f"Count: {df.count()}") # Stop the Spark session (disconnects the client only) spark.stop() # Terminate the EMR Serverless session to stop billing. # spark.stop() only closes the local client connection. The remote session # continues running and incurring charges until you explicitly terminate it # or it reaches the idle timeout. client.terminate_session( applicationId=APPLICATION_ID, sessionId=session_id ) print(f"Session {session_id} terminated.")

Per accedere all'interfaccia utente attiva di Spark o allo Spark History Server per una sessione, usa l'API. GetResourceDashboard

response = client.get_resource_dashboard( applicationId=APPLICATION_ID, resourceId=session_id, resourceType='SESSION' ) response['url']

Mentre una sessione è attiva, l'URL apre l'interfaccia utente attiva di Apache Spark per il monitoraggio in tempo reale di query, fasi ed esecutori. Al termine di una sessione, lo Spark History Server rimane disponibile per l'analisi post-sessione tramite la console Amazon EMR Serverless.

Considerazioni e limitazioni

Quando esegui carichi di lavoro interattivi tramite Spark Connect, considera quanto segue.

  • Spark Connect è supportato dalla versione Amazon EMR Serverless e successive. emr-7.13.0

  • Spark Connect è supportato solo per il motore Apache Spark.

  • Spark Connect supporta DataFrame e API SQL in. PySpark RDD-based Le API non sono supportate.

  • I token di autenticazione sono limitati a 1 ora. Quando un token scade, le chiamate gRPC hanno esito negativo e viene generato un errore di autenticazione. Chiama GetSessionEndpoint per ottenere un nuovo token e crearne uno nuovo SparkSession con il token aggiornato.

  • Le sessioni terminano dopo un timeout di inattività configurabile. Il timeout predefinito è impostato su 1 ora.

  • Per impostazione predefinita, ogni sessione ha un limite fisso di 24 ore, dopodiché si interrompe automaticamente anche se sta eseguendo attivamente un'attività.

  • Ogni applicazione EMR Serverless supporta fino a 25 sessioni simultanee per impostazione predefinita. Per richiedere un aumento del limite, contatta l'assistenza. AWS

  • Per impostazione predefinita, autoStopConfig è attiva per le applicazioni. L'applicazione si arresta automaticamente dopo 15 minuti senza sessioni o operazioni attive. Puoi modificare questa configurazione come parte della tua create-application update-application richiesta.

  • Per una migliore esperienza di avvio, configura la capacità preinizializzata per driver ed esecutori.

  • È necessario abilitare AutoStart o avviare manualmente l'applicazione prima di iniziare una sessione EMR Serverless.

  • La PySpark versione installata localmente deve corrispondere alla versione di Apache Spark sull'applicazione Amazon EMR Serverless (3.5.6 per). emr-7.13.0 Una mancata corrispondenza della versione causa o un comportamento imprevisto. ImportError

  • Fine-grained il controllo degli accessi tramite Lake Formation non è supportato per le sessioni Spark Connect.

  • Trusted Identity Propagation non è supportata per le sessioni interattive con Spark Connect.

  • Lo storage serverless su EMR Serverless non è supportato per le sessioni interattive con Spark Connect.

  • Non sono previsti costi aggiuntivi per l'utilizzo di Spark Connect. Paghi solo per le risorse di elaborazione EMR Serverless (vCPU, memoria e storage) consumate durante la sessione.

  • La configurazione di Spark spark.connect.grpc.binding.address è riservata da EMR Serverless e non può essere sovrascritta dagli utenti.

  • Il PySpark pacchetto installato localmente deve corrispondere alla versione di Spark sull'applicazione EMR Serverless. Una mancata corrispondenza della versione causa errori di connessione. Le UDF di Python (@udf,spark.udf.register) richiedono inoltre che la versione secondaria locale di Python corrisponda a quella del worker, altrimenti falliscono. PYTHON_VERSION_MISMATCH Built-in Le funzioni e le DataFrame operazioni SQL non richiedono una corrispondenza della versione di Python.

  • Per passare le configurazioni di Spark constart-session, impostale sotto runtimeConfiguration nel parametro. --configuration-overrides L'start-job-runAPI utilizza applicationConfiguration invece.