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:
-
Una función de ejecución de trabajos de IAM con permisos para acceder a sus fuentes de datos, como los cubos de Amazon S3 y el catálogo de datos. Para obtener instrucciones, consulte Crear un rol de ejecución de trabajos.
-
Si su clúster de EKS utiliza la administración de acceso al clúster, son las entradas de acceso necesarias para Amazon EMR en EKS. Para obtener instrucciones, consulte Configurar el acceso al clúster para Amazon EMR en EKS.
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-idSECURITY_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-idVIRTUAL_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-idVIRTUAL_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-idVIRTUAL_CLUSTER_ID\ --idENDPOINT_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
-
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-idVIRTUAL_CLUSTER_ID\ --idENDPOINT_IDLa respuesta incluye el
authProxyUrlcampo cuando el punto final estáACTIVE. -
Obtenga un token de sesión para el punto final:
aws emr-containers get-managed-endpoint-session-credentials \ --virtual-cluster-identifierVIRTUAL_CLUSTER_ID\ --endpoint-identifierENDPOINT_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.tokenvalor comox-aws-proxy-authparámetro cuando te conectes a la URL del proxy de autenticación. -
Instala el PySpark cliente que coincida con la versión de Spark en tu terminal (Spark 3.5.8 para
emr-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 -
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.0y posteriores, oemr-spark-8.1.0y 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
GetManagedEndpointSessionCredentialspara obtener un nuevo token y crea uno nuevoSparkSessioncon 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 para
emr-7.14.0, Spark 4.1.1 para).emr-spark-8.1.0Una discordancia de versiones provoca errores de conexión o un comportamiento inesperado. -
El tipo de punto final de Spark Connect es
SPARK_CONNECT. Este es diferente de los puntos finales interactivos de Livy (tipoJUPYTER_ENTERPRISE_GATEWAY). -
El
sessionIdleTimeoutInMinutespará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-routernombres, 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_MISMATCHBuilt-in Las funciones y DataFrame operaciones de SQL no requieren que la versión de Python coincida.