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 de Amazon EMR emr-7.13.0 y posteriores, puede conectarse a una aplicación Amazon EMR Serverless desde PySpark clientes autogestionados, como VS Code PyCharm, y Jupyter Notebooks mediante las API de sesión sin servidor de EMR con Apache Spark Connect. Spark Connect utiliza una arquitectura cliente-servidor que desvincula el código de la aplicación del proceso del controlador de Spark. Desarrollas y depuras el PySpark código en tu IDE local mientras las operaciones de Spark se ejecutan en la computación sin servidor de EMR. Spark Connect ofrece las siguientes ventajas:

  • Conéctese a EMR Serverless desde cualquier PySpark cliente, incluidos los ordenadores portátiles VS Code y Jupyter. PyCharm

  • Establezca puntos de interrupción y repase el PySpark código en su IDE mientras DataFrames ejecuta datos a escala de producción de forma remota.

Una sesión de Spark Connect es una conexión gestionada entre su PySpark cliente local y un controlador de Spark que se ejecuta en Amazon EMR Serverless. Cuando inicia una sesión, EMR Serverless aprovisiona un controlador de Spark y ejecutores en su nombre. Tu cliente local envía DataFrame las operaciones de SQL al controlador, y el controlador las ejecuta de forma remota. La sesión continúa hasta que la finalices o hasta que se agote el tiempo de inactividad, por lo que puedes ejecutar varias consultas de forma interactiva sin tener que reiniciar Spark. Cada sesión tiene su propia URL de punto final y un token de autenticación que puedes usar 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 especifiques como. Resource

emr-serverless:GetSessionEndpoint

Concede 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

Concede permiso para enumerar las sesiones en una aplicación.

emr-serverless:TerminateSession

Concede permiso para terminar una sesión.

iam:PassRole

Concede permiso para acceder al rol de ejecución de IAM al crear la sesión de Spark Connect. Amazon EMR Serverless usa este rol 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: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" } } } ] }

Trabajando con sesiones interactivas

Para crear una Connect-enabled aplicación de Spark y conectarte a ella, sigue estos pasos.

Para iniciar una sesión de Spark Connect
  1. Crea una aplicación con 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. Después de que Amazon EMR Serverless cree su aplicación, iníciela si no ha activado el inicio automático para aceptar las sesiones de Spark Connect.

    aws emr-serverless start-application \ --application-id APPLICATION_ID
  3. Utilice el siguiente comando para comprobar el estado de su aplicación. Una vez que 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 conceda 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 IDLE estado STARTED o 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 añadir:443, por ejemplo, sc:// hostname :443/;use_ssl=true;x-aws-proxy-auth=token. Sin ella, 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. Cuando el punto final esté listo, conéctese desde un PySpark cliente. Instala el PySpark cliente que coincida con la versión de Spark en tu aplicación EMR Serverless y el AWS SDK 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 un 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 de Spark en vivo 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 de Apache Spark en vivo para monitorear en tiempo real las consultas, las etapas y los ejecutores. Una vez finalizada una 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 sin servidor de Amazon EMR.

Consideraciones y limitaciones

Tenga en cuenta lo siguiente al ejecutar cargas de trabajo interactivas a través de Spark Connect.

  • Spark Connect es compatible con la versión emr-7.13.0 sin servidor de Amazon EMR y posteriores.

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

  • Spark Connect es compatible con DataFrame las API de SQL PySpark. RDD-based No se admiten las API.

  • 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 después de un tiempo de espera de inactividad configurable. El tiempo de espera predeterminado está establecido en 1 hora.

  • Cada sesión tiene un límite fijo de 24 horas de forma predeterminada, tras el cual finaliza automáticamente aunque esté ejecutando una tarea de forma activa.

  • De forma predeterminada, cada aplicación EMR Serverless admite hasta 25 sesiones simultáneas. Para solicitar un aumento del límite, póngase en contacto con el equipo de soporte. AWS

  • De forma predeterminada, autoStopConfig está activada para las aplicaciones. La aplicación se detiene automáticamente después de 15 minutos sin sesiones activas ni ejecuciones de 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 de 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.

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

  • La propagación de identidades confiables 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 pagas por los recursos informáticos sin servidor de EMR (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 pueden anularla.

  • El PySpark paquete que instales localmente debe coincidir con la versión de Spark de tu aplicación EMR Serverless. Si la versión no coincide, se producen errores de conexión. Las UDF (@udf,spark.udf.register) de Python también requieren que la versión secundaria local de Python coincida con la versión de trabajo, o fallan con ella. PYTHON_VERSION_MISMATCH Built-in Las funciones y DataFrame operaciones de SQL no requieren que la versión de Python coincida.

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