View a markdown version of this page

Realice sesiones interactivas con Amazon EMR en EKS 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 en EKS a través de Spark Connect

Con Amazon EMR en la versión EKS emr-7.14.0 y posteriores (o emr-spark-8.1.0 posteriores), puede conectarse a un punto de enlace gestionado de Spark Connect desde PySpark clientes autogestionadosVS Code, como ordenadores portátilesPyCharm, y Jupyter ordenadores portátiles. 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 PySpark código en tu IDE local mientras las operaciones de Spark se ejecutan en tu clúster de EKS a través de Amazon EMR en EKS. Spark Connect ofrece las siguientes ventajas:

  • Conéctese a Amazon EMR en EKS desde cualquier PySpark cliente VS CodePyCharm, incluidos ordenadores portátiles Jupyter

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

  • Ejecute en su propio clúster de EKS con un control total sobre la configuración informática, de red y de seguridad

Un punto final de Spark Connect es un punto final administrado en su clúster virtual que aloja un servidor de Spark Connect. Al crear un punto de enlace de Spark Connect, Amazon EMR en EKS aprovisiona un controlador de Spark con un servidor gRPC en su clúster de EKS. Su PySpark cliente local envía DataFrame operaciones de SQL al controlador a través del punto de enlace de gRPC. Para interactuar con el punto final, obtienes las credenciales de sesión mediante la GetManagedEndpointSessionCredentials API. Cada punto final admite varias sesiones simultáneas.

Requisitos previos

Antes de crear un punto final de Spark Connect, asegúrate de tener lo siguiente.

Los siguientes requisitos son específicos de los terminales de Spark Connect:

  • Un clúster de EKS con al menos una subred privada. Para dirigir el tráfico de gRPC al punto final, Spark Connect aprovisiona un balanceador de carga de red (NLB) interno, que requiere una subred privada en tu VPC. La NLB es interna y no está expuesta a la Internet pública.

  • La controladora del balanceador de AWS carga está instalada en su clúster de EKS, de modo que Amazon EMR en EKS pueda aprovisionar el NLB interno. Para obtener instrucciones, consulte Instalación del controlador del balanceador de AWS carga.

También necesita los siguientes recursos estándar de Amazon EMR en EKS. Si ya ejecuta trabajos en Amazon EMR en EKS, es probable que ya disponga de los siguientes:

Permisos necesarios

Añade los siguientes permisos a tu rol de IAM para crear un punto final de Spark Connect e interactuar con él:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EMRContainersEndpointAccess", "Effect": "Allow", "Action": [ "emr-containers:CreateManagedEndpoint", "emr-containers:DescribeManagedEndpoint", "emr-containers:DeleteManagedEndpoint", "emr-containers:ListManagedEndpoints", "emr-containers:GetManagedEndpointSessionCredentials" ], "Resource": [ "arn:aws:emr-containers:region:account-id:/virtualclusters/virtual-cluster-id", "arn:aws:emr-containers:region:account-id:/virtualclusters/virtual-cluster-id/endpoints/*" ] }, { "Sid": "PassRoleToEKSPodIdentity", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/ExecutionRole", "Condition": { "StringEquals": { "iam:PassedToService": "pods.eks.amazonaws.com" }, "ArnLike": { "iam:AssociatedResourceARN": [ "arn:aws:eks:region:account-id:cluster/eks-cluster-name" ] } } } ] }

Creación de una configuración de seguridad

Los terminales de Spark Connect requieren una configuración de seguridad asociada a tu clúster virtual. La configuración de seguridad define los ajustes de autenticación y autorización del punto final y especifica el espacio de nombres del sistema en el que se ejecuta la infraestructura de Spark Connect.

nota

Cada configuración de seguridad tiene una relación de uno a uno con un clúster virtual. No puede reutilizar la misma configuración de seguridad en varios clústeres virtuales.

Cree una configuración de seguridad con un espacio de nombres del sistema:

aws emr-containers create-security-configuration \ --name "security-config-name" \ --security-configuration-data '{ "authenticationConfiguration": { "identityCenterConfiguration": { "enableIdentityCenter": false } } }' \ --container-provider '{ "type": "EKS", "id": "eks-cluster-name", "info": { "eksInfo": { "namespace": "system-namespace" } } }'

La configuración de seguridad es el espacio de nombres del sistema namespace en el que se ejecutan los componentes de la infraestructura de Spark Connect. Es independiente del espacio de nombres de usuario especificado al crear el clúster virtual.

Crea un clúster virtual con Spark Connect activado

Cree un clúster virtual asociado a la configuración de seguridad. Debe establecer true y sessionEnabled proporcionar el valor securityConfigurationId del paso anterior.

aws emr-containers create-virtual-cluster \ --name "virtual-cluster-name" \ --container-provider '{ "type": "EKS", "id": "eks-cluster-name", "info": { "eksInfo": { "namespace": "user-namespace" } } }' \ --security-configuration-id SECURITY_CONFIGURATION_ID \ --session-enabled true
importante

--security-configuration-id— Asocia este clúster virtual a la configuración de seguridad creada en el paso anterior. Esto es obligatorio para los terminales de Spark Connect.

--session-enabled— Permite la compatibilidad con los terminales de Spark Connect en el clúster virtual. Sin este indicador, no puedes crear puntos de conexión de Spark Connect en este clúster virtual.

Crea un punto final de Spark Connect

Tras crear una configuración de seguridad, crea un punto final administrado de Spark Connect en tu clúster virtual.

nota

El primer punto final de Spark Connect de un clúster de EKS tarda ACTIVE más en convertirse que los siguientes. Para el primer punto final del clúster de EKS, Amazon EMR en EKS aprovisiona los componentes de red compartidos que se utilizan para la conectividad: un balanceador de carga de red (NLB) interno, un punto final de interfaz de VPC (AWS PrivateLink) y una implementación única de un enrutador Envoy (en el espacio de spark-connect-router nombres) que dirige el tráfico de gRPC a los puntos de enlace, lo que puede tardar varios minutos. Estos componentes se crean solo una vez por clúster de EKS y todos los puntos finales posteriores de ese clúster los reutilizan para que los puntos finales posteriores se inicien más rápido.

aws emr-containers create-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --name "spark-connect-endpoint" \ --type "SPARK_CONNECT" \ --release-label "emr-7.14.0-latest" \ --execution-role-arn "arn:aws:iam::account-id:role/ExecutionRole" \ --session-idle-timeout-in-minutes 60
nota

De forma predeterminada, un punto final gestionado por Spark Connect comienza con 2 ejecutores. Si no proporcionas anulaciones de configuración, el punto final usa este valor predeterminado. Para ejecutarlo con un número diferente de ejecutores, spark.executor.instances defina las anulaciones de configuración, como se muestra en el siguiente ejemplo.

El siguiente ejemplo incluye las anulaciones de configuración de Spark con asignación dinámica y una configuración de supervisión para exportar los registros de Spark a Amazon S3:

aws emr-containers create-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --name "spark-connect-endpoint" \ --type "SPARK_CONNECT" \ --release-label "emr-7.14.0-latest" \ --execution-role-arn "arn:aws:iam::account-id:role/ExecutionRole" \ --session-idle-timeout-in-minutes 60 \ --configuration-overrides '{ "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.driver.memory": "4g", "spark.executor.memory": "4g", "spark.executor.cores": "2", "spark.executor.instances": "3", "spark.dynamicAllocation.enabled": "true", "spark.dynamicAllocation.minExecutors": "3", "spark.dynamicAllocation.maxExecutors": "5" } } ], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://your-bucket/spark-connect-logs/" }, "persistentAppUI": "ENABLED" } }'

Supervise el estado del punto final:

aws emr-containers describe-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --id ENDPOINT_ID

Espere hasta que el estado del punto final esté ACTIVE antes de conectarse.

Conéctate a un punto final de Spark Connect

Cuando el punto final esté activo, obtenga las credenciales de la sesión y conéctese desde un PySpark cliente.

Para conectarse a un punto final de Spark Connect
  1. Obtén la URL del proxy de autenticación a partir de la descripción del punto final:

    aws emr-containers describe-managed-endpoint \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --id ENDPOINT_ID

    La respuesta incluye el authProxyUrl campo cuando el punto final estáACTIVE.

  2. Obtenga un token de sesión para el punto final:

    aws emr-containers get-managed-endpoint-session-credentials \ --virtual-cluster-identifier VIRTUAL_CLUSTER_ID \ --endpoint-identifier ENDPOINT_ID \ --execution-role-arn "arn:aws:iam::account-id:role/ExecutionRole" \ --credential-type "TOKEN"

    La respuesta incluye un token de sesión:

    { "id": "SESSION_ID", "credentials": { "token": "SESSION_TOKEN" }, "endpointCredentials": { "token": "ENDPOINT_CREDENTIALS_TOKEN" }, "expiresAt": "EXPIRY_TIME" }

    Usa el credentials.token valor como x-aws-proxy-auth parámetro cuando te conectes a la URL del proxy de autenticación.

  3. Instala el PySpark cliente que coincida con la versión de Spark en tu terminal (Spark 3.5.8 paraemr-7.14.0, Spark 4.1.1 para): emr-spark-8.1.0

    # For emr-7.14.0 pip install pyspark[connect]==3.5.8 # For emr-spark-8.1.0 pip install pyspark[connect]==4.1.1 pip install boto3
  4. Conéctate desde PySpark la URL del proxy de autenticación y el token de sesión:

    from pyspark.sql import SparkSession # Use the authProxyUrl from DescribeManagedEndpoint # and the credentials.token from GetManagedEndpointSessionCredentials connect_url = f"{auth_proxy_url}/;use_ssl=true;x-aws-proxy-auth={token}" spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run queries spark.sql("SELECT 1+1 AS result").show() # When finished, disconnect the client spark.stop()

La siguiente secuencia de comandos de Python obtiene la URL del proxy de autenticación y el token de sesión y, a continuación, se conecta al punto final de Spark Connect:

import boto3 from pyspark.sql import SparkSession from pyspark.sql.functions import col REGION = 'REGION' VIRTUAL_CLUSTER_ID = 'VIRTUAL_CLUSTER_ID' ENDPOINT_ID = 'ENDPOINT_ID' EXECUTION_ROLE = 'arn:aws:iam::account-id:role/ExecutionRole' client = boto3.client('emr-containers', region_name=REGION) # Get the auth proxy URL from DescribeManagedEndpoint endpoint_response = client.describe_managed_endpoint( virtualClusterId=VIRTUAL_CLUSTER_ID, id=ENDPOINT_ID ) auth_proxy_url = endpoint_response['endpoint']['authProxyUrl'] # Get session token creds_response = client.get_managed_endpoint_session_credentials( virtualClusterIdentifier=VIRTUAL_CLUSTER_ID, endpointIdentifier=ENDPOINT_ID, executionRoleArn=EXECUTION_ROLE, credentialType='TOKEN' ) token = creds_response['credentials']['token'] # Connect via Spark Connect using auth proxy URL and credentials token connect_url = f"{auth_proxy_url}/;use_ssl=true;x-aws-proxy-auth={token}" spark = SparkSession.builder.remote(connect_url).getOrCreate() print(f"Connected. Spark version: {spark.version}") # Run DataFrame operations df = spark.range(100).withColumn("squared", col("id") * col("id")) df.show(10) print(f"Count: {df.count()}") spark.stop()

Consideraciones y limitaciones

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

  • Spark Connect es compatible con Amazon EMR en la versión EKS emr-7.14.0 y posteriores, o emr-spark-8.1.0 y en versiones posteriores.

  • Spark Connect es compatible con DataFrame las API de SQL incluidas. PySpark Spark Connect no admite RDD-based las API.

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

  • Cada configuración de seguridad tiene una relación de uno a uno con un clúster virtual. No puede compartir una configuración de seguridad entre varios clústeres virtuales.

  • Debe eliminar todos los puntos finales mediante una configuración de seguridad antes de poder eliminar la configuración de seguridad.

  • La PySpark versión instalada localmente debe coincidir con la versión de Apache Spark de su terminal (Spark 3.5.8 paraemr-7.14.0, Spark 4.1.1 para). emr-spark-8.1.0 Una discordancia de versiones provoca errores de conexión o un comportamiento inesperado.

  • El tipo de punto final de Spark Connect esSPARK_CONNECT. Este es diferente de los puntos finales interactivos de Livy (tipoJUPYTER_ENTERPRISE_GATEWAY).

  • El sessionIdleTimeoutInMinutes parámetro controla cuánto tiempo dura una sesión inactiva antes de la finalización automática. El tiempo predeterminado es 60 minutos.

  • Los terminales de Spark Connect no admiten la propagación de identidades confiables.

  • Los terminales de Spark Connect aún no son compatibles con el control de acceso detallado (FGAC) de Lake Formation. Para reforzar el control de acceso, usa la función de ejecución de IAM asociada al punto final.

  • Los terminales de Spark Connect utilizan un balanceador de carga de red (NLB) para enrutar el tráfico de gRPC. El NLB se crea cuando se crea el primer punto final de Spark Connect y solo se elimina cuando se elimina el último clúster virtual con sesión habilitada. Amazon EMR en EKS también ejecuta un único enrutador Envoy (en el espacio de spark-connect-router nombres, uno por clúster de EKS) que dirige el tráfico del gRPC a los puntos finales; se crea con el primer punto final de Spark Connect y termina cuando se elimina el último clúster virtual con sesión habilitada. Usted es responsable de los costos de NLB y del procesamiento de EKS consumido por el enrutador Envoy mientras existan, además de los recursos informáticos de EKS consumidos por el controlador y los ejecutores de Spark durante la sesión.

  • Las UDF de Python (@udf,spark.udf.register) requieren que la versión secundaria local de Python coincida con la versión de trabajo remoto, o fallan. PYTHON_VERSION_MISMATCH Built-in Las funciones y DataFrame operaciones de SQL no requieren que la versión de Python coincida.