View a markdown version of this page

Realice sesiones interactivas con Amazon EMR Serverless a través de Spark Connect - Amazon EMR

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Realice sesiones interactivas con Amazon EMR Serverless a través de Spark Connect

Con la versión Amazon EMR emr-7.13.0 y versiones posteriores, puede conectarse a una aplicación Amazon EMR Serverless desde PySpark clientes autogestionados como VS Code y Jupyter notebooks mediante la sesión PyCharm EMR Serverless con Apache Spark Connect. APIs Spark Connect utiliza una arquitectura cliente-servidor que desacopla el código de la aplicación del proceso del controlador de Spark. Desarrollas y depura el PySpark código en tu IDE local mientras las operaciones de Spark se ejecutan en el procesamiento EMR Serverless. Spark Connect ofrece las siguientes ventajas:

  • Conéctese a EMR Serverless desde cualquier PySpark cliente, incluidos VS Code y Jupyter PyCharm notebooks.

  • Establece puntos de interrupción y recorre el PySpark código de tu IDE mientras DataFrames ejecutas datos a escala de producción de forma remota.

Una sesión de Spark Connect es una conexión gestionada entre tu PySpark cliente local y un controlador de Spark que se ejecuta en Amazon EMR Serverless. Cuando inicias una sesión, EMR Serverless aprovisiona un controlador Spark y ejecutores en tu nombre. Su cliente local envía DataFrame las operaciones de SQL al controlador, que las ejecuta de forma remota. La sesión persiste hasta que la termines o se agote el tiempo de espera de inactividad, por lo que puedes ejecutar varias consultas de forma interactiva sin necesidad de reiniciar Spark. Cada sesión tiene su propia URL de punto final y token de autenticación que utilizas para conectarte.

Permisos necesarios

Además de los permisos necesarios para acceder a Amazon EMR Serverless, añada también los siguientes permisos a su función de IAM para acceder a un punto final de Spark Connect y gestionar las sesiones de Spark Connect:

emr-serverless:StartSession

Otorga permiso para crear una sesión de Spark Connect en la aplicación que especifiquesResource.

emr-serverless:GetSessionEndpoint

Otorga permiso para recuperar la URL del punto final de Spark Connect y el token de autenticación de una sesión.

emr-serverless:GetSession

Otorga permiso para obtener el estado de una sesión.

emr-serverless:ListSessions

Otorga permiso para enumerar las sesiones de una aplicación.

emr-serverless:TerminateSession

Otorga permiso para terminar una sesión.

iam:PassRole

Otorga permiso para acceder a la función de ejecución de IAM al crear la sesión de Spark Connect. Amazon EMR Serverless utiliza esta función para ejecutar sus cargas de trabajo.

emr-serverless:GetResourceDashboard

Concede permiso para generar la URL de la interfaz de usuario de Spark y proporciona acceso a los registros de la sesión.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EMRServerlessApplicationLevelAccess", "Effect": "Allow", "Action": [ "emr-serverless:StartSession", "emr-serverless:ListSessions" ], "Resource": [ "arn:aws:emr-serverless:region:account-id:/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:region:account-id:/applications/application-id/sessions/*" ] }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::account-id:role/EMRServerlessExecutionRole" ], "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }

Trabajando con sesiones interactivas

Para crear una aplicación compatible con Spark Connect y conectarte a ella, sigue estos pasos.

Para iniciar una sesión de Spark Connect
  1. Crea una aplicación con las sesiones de Spark Connect.

    aws emr-serverless create-application \ --type "SPARK" \ --name "spark-connect-app" \ --release-label emr-7.13.0 \ --interactive-configuration '{"sessionEnabled": true}'
  2. Una vez que Amazon EMR Serverless haya creado tu aplicación, iníciala si no has activado el inicio automático para aceptar sesiones de Spark Connect.

    aws emr-serverless start-application \ --application-id APPLICATION_ID
  3. Usa el siguiente comando para comprobar el estado de tu solicitud. Cuando el estado pase a serSTARTED, inicie una sesión.

    aws emr-serverless get-application \ --application-id APPLICATION_ID
  4. Inicie una sesión con una función de ejecución de IAM que le dé acceso a sus datos.

    aws emr-serverless start-session \ --application-id APPLICATION_ID \ --execution-role-arn arn:aws:iam::account-id:role/EMRServerlessExecutionRole
  5. Supervise el estado de la sesión mediante la get-session API y espere a que la sesión esté en este STARTED IDLE estado.

    aws emr-serverless get-session \ --application-id APPLICATION_ID \ --session-id SESSION_ID
  6. Recupera el punto final y el token de autenticación de Spark Connect. La URL del punto final devuelta por GetSessionEndpoint no incluye un número de puerto. Al crear la URL de sc:// conexión, debe agregar:443, por ejemplo, sc:// hostname :443/;use_ssl=true;x-aws-proxy-auth=token. Sin él, el PySpark cliente utiliza de forma predeterminada el puerto 15002, al que no se puede acceder en EMR Serverless.

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

    La respuesta incluye la URL del punto final y un token de autenticación:

    { "endpoint": "ENDPOINT_URL", "authToken": "AUTH_TOKEN", "authTokenExpiresAt": "AUTH_TOKEN_EXPIRY_TIME" }
  7. Una vez que el punto final esté listo, conéctese desde un PySpark cliente. Instale el PySpark cliente que coincida con la versión de Spark en su aplicación EMR Serverless y el SDK AWS para 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

El siguiente es un ejemplo de script de Python para iniciar una sesión y enviar solicitudes directamente al punto final de la sesión:

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.")

Para acceder a la interfaz de usuario activa de Spark o al servidor de historial de Spark durante una sesión, usa la GetResourceDashboard API.

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

Mientras una sesión está activa, la URL abre la interfaz de usuario activa de Apache Spark para monitorizar en tiempo real las consultas, las etapas y los ejecutores. Una vez finalizada la sesión, el servidor de historial de Spark permanece disponible para su análisis posterior a la sesión a través de la consola Amazon EMR Serverless.

Consideraciones y limitaciones

Ten en cuenta lo siguiente cuando ejecutes cargas de trabajo interactivas a través de Spark Connect.

  • Spark Connect es compatible con la versión Amazon EMR Serverless y versiones emr-7.13.0 posteriores.

  • Spark Connect solo es compatible con el motor Apache Spark.

  • Spark Connect admite DataFrame y SQL APIs in PySpark. No se admiten los basados en RDD APIs .

  • Los tokens de autenticación tienen un límite de tiempo de 1 hora. Cuando un token caduca, las llamadas de gRPC fallan y se produce un error de autenticación. Llama GetSessionEndpoint para obtener un nuevo token y crea uno nuevo SparkSession con el token actualizado.

  • Las sesiones finalizan tras un tiempo de espera de inactividad configurable. El tiempo de espera predeterminado está establecido en 1 hora.

  • De forma predeterminada, cada sesión tiene un límite estricto de 24 horas, después del cual finaliza automáticamente incluso si se está ejecutando una tarea de forma activa.

  • Cada aplicación EMR Serverless admite hasta 25 sesiones simultáneas de forma predeterminada. Para solicitar un aumento del límite, ponte en contacto con AWS Support.

  • De forma predeterminada, autoStopConfig está activada para las aplicaciones. La aplicación se detiene automáticamente después de 15 minutos sin ninguna sesión activa ni ejecución de ningún trabajo. Puede cambiar esta configuración como parte de su solicitud de create-application o de update-application.

  • Para obtener la mejor experiencia de inicio, configure la capacidad preinicializada de los controladores y ejecutores.

  • Debe habilitar AutoStart o iniciar manualmente la aplicación antes de iniciar una sesión EMR Serverless.

  • La PySpark versión instalada localmente debe coincidir con la versión de Apache Spark de su aplicación Amazon EMR Serverless (3.5.6 para). emr-7.13.0 Una discordancia de versiones provoca ImportError un comportamiento inesperado o inesperado.

  • El control de acceso detallado a través de Lake Formation no es compatible con las sesiones de Spark Connect.

  • La propagación de identidad confiable no es compatible con las sesiones interactivas con Spark Connect.

  • El almacenamiento sin servidor en EMR Serverless no es compatible con las sesiones interactivas con Spark Connect.

  • El uso de Spark Connect no conlleva ningún cargo adicional. Solo paga por los recursos informáticos de EMR Serverless (vCPU, memoria y almacenamiento) consumidos durante la sesión.

  • EMR Serverless reserva la configuración spark.connect.grpc.binding.address de Spark y los usuarios no la pueden anular.

  • El PySpark paquete que instale localmente debe coincidir con la versión de Spark de su aplicación EMR Serverless. Una discordancia de versiones provoca errores de conexión. Python UDFs (@udf,spark.udf.register) también requiere que la versión secundaria local de Python coincida con la versión de trabajo, o fallará con ellaPYTHON_VERSION_MISMATCH. Las funciones y DataFrame operaciones SQL integradas no requieren una coincidencia de versión de Python.

  • Para transferir las configuraciones de Sparkstart-session, configúrelas runtimeConfiguration en el --configuration-overrides parámetro. La start-job-run API usa applicationConfiguration en su lugar.