Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Organisez des sessions interactives avec Amazon EMR sur EKS via Spark Connect
Avec Amazon EMR sur les versions EKS emr-7.14.0 et versions ultérieures (ou emr-spark-8.1.0 ultérieures), vous pouvez vous connecter à un point de terminaison Spark Connect géré à partir de PySpark clients autogérés tels que VS CodePyCharm, et Jupyter des blocs-notes. Spark Connect utilise une architecture client-serveur qui dissocie le code de votre application du processus du pilote Spark. Vous développez et déboguez PySpark du code dans votre IDE local pendant que les opérations Spark s'exécutent sur votre cluster EKS via Amazon EMR sur EKS. Spark Connect offre les avantages suivants :
-
Connectez-vous à Amazon EMR sur EKS depuis n'importe quel PySpark client, y compris VS CodePyCharm, et des ordinateurs portables Jupyter
-
Définissez des points d'arrêt et parcourez le PySpark code dans votre IDE tout en l'exécutant à DataFrames distance sur des données de production
-
Exécutez sur votre propre cluster EKS avec un contrôle total sur le calcul, la mise en réseau et la configuration de sécurité
Un point de terminaison Spark Connect est un point de terminaison géré sur votre cluster virtuel qui héberge un serveur Spark Connect. Lorsque vous créez un point de terminaison Spark Connect, Amazon EMR sur EKS fournit un pilote Spark avec un serveur gRPC sur votre cluster EKS. Votre PySpark client local envoie DataFrame des opérations SQL au pilote via le point de terminaison gRPC. Pour interagir avec le terminal, vous obtenez des informations d'identification de session à l'aide de l'GetManagedEndpointSessionCredentialsAPI. Chaque terminal prend en charge plusieurs sessions simultanées.
Conditions préalables
Avant de créer un point de terminaison Spark Connect, assurez-vous de disposer des éléments suivants.
Les exigences suivantes sont spécifiques aux terminaux Spark Connect :
-
Cluster EKS avec au moins un sous-réseau privé. Pour acheminer le trafic gRPC vers le terminal, Spark Connect fournit un équilibreur de charge réseau (NLB) interne, qui nécessite un sous-réseau privé dans votre VPC. Le NLB est interne et n'est pas exposé à l'Internet public.
-
Le AWS Load Balancer Controller est installé sur votre cluster EKS, afin qu'Amazon EMR sur EKS puisse provisionner le NLB interne. Pour obtenir des instructions, consultez la section Installation du contrôleur AWS Load Balancer.
Vous avez également besoin de la norme Amazon EMR sur les ressources EKS suivante. Si vous exécutez déjà des tâches sur Amazon EMR sur EKS, il est probable que les tâches suivantes soient en place :
-
Un rôle d'exécution de tâches IAM avec des autorisations d'accès à vos sources de données, telles que les compartiments Amazon S3 et le catalogue de données. Pour obtenir des instructions, consultez la section Création d'un rôle d'exécution des tâches.
-
Si votre cluster EKS utilise la gestion des accès au cluster, les entrées d'accès requises pour Amazon EMR sur EKS. Pour obtenir des instructions, consultez la section Configuration de l'accès au cluster pour Amazon EMR sur EKS.
Autorisations requises
Ajoutez les autorisations suivantes à votre rôle IAM pour créer un endpoint Spark Connect et interagir avec celui-ci :
{ "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" ] } } } ] }
Création d'une configuration de sécurité
Les terminaux Spark Connect nécessitent une configuration de sécurité associée à votre cluster virtuel. La configuration de sécurité définit les paramètres d'authentification et d'autorisation pour le terminal et spécifie l'espace de noms système dans lequel s'exécute l'infrastructure Spark Connect.
Note
Chaque configuration de sécurité entretient une relation biunivoque avec un cluster virtuel. Vous ne pouvez pas réutiliser la même configuration de sécurité sur plusieurs clusters virtuels.
Créez une configuration de sécurité avec un espace de noms système :
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" } } }'
namespaceDans la configuration de sécurité, il y a l'espace de noms du système dans lequel s'exécutent les composants de l'infrastructure Spark Connect. Il est distinct de l'espace de noms utilisateur spécifié lors de la création du cluster virtuel.
Création d'un cluster virtuel avec Spark Connect activé
Créez un cluster virtuel associé à la configuration de sécurité. Vous devez définir true et sessionEnabled fournir les informations securityConfigurationId de l'étape précédente.
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
Important
--security-configuration-id— Associe ce cluster virtuel à la configuration de sécurité créée à l'étape précédente. Cela est obligatoire pour les points de terminaison Spark Connect.
--session-enabled— Active la prise en charge des terminaux Spark Connect sur le cluster virtuel. Sans cet indicateur, vous ne pouvez pas créer de points de terminaison Spark Connect sur ce cluster virtuel.
Création d'un point de terminaison Spark Connect
Après avoir créé une configuration de sécurité, créez un point de terminaison géré par Spark Connect sur votre cluster virtuel.
Note
Le premier point de terminaison Spark Connect d'un cluster EKS met plus de temps à devenir ACTIVE que les suivants. Pour le premier point de terminaison du cluster EKS, Amazon EMR sur EKS fournit les composants réseau partagés utilisés pour la connectivité : un équilibreur de charge réseau (NLB) interne, un point de terminaison d'interface VPC (AWS PrivateLink) et un déploiement ponctuel de routeur Envoy (dans l'spark-connect-routerespace de noms) qui achemine le trafic gRPC vers les terminaux, ce qui peut prendre plusieurs minutes. Ces composants ne sont créés qu'une seule fois par cluster EKS et sont réutilisés par tous les terminaux ultérieurs de ce cluster, afin que les terminaux suivants démarrent plus rapidement.
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
Note
Par défaut, un endpoint géré par Spark Connect démarre avec deux exécuteurs. Si vous ne fournissez pas de modifications de configuration, le point de terminaison utilise cette valeur par défaut. Pour exécuter avec un nombre différent d'exécuteurs, définissez spark.executor.instances dans la configuration les overrides, comme illustré dans l'exemple suivant.
L'exemple suivant inclut des remplacements de configuration Spark par une allocation dynamique et une configuration de surveillance pour exporter les journaux Spark vers 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" } }'
Surveillez l'état des terminaux :
aws emr-containers describe-managed-endpoint \ --virtual-cluster-idVIRTUAL_CLUSTER_ID\ --idENDPOINT_ID
Attendez que l'état du terminal soit atteint ACTIVE avant de vous connecter.
Connectez-vous à un terminal Spark Connect
Une fois le terminal actif, obtenez les informations d'identification de session et connectez-vous depuis un PySpark client.
Pour vous connecter à un terminal Spark Connect
-
Obtenez l'URL du proxy d'authentification à partir de la description du point de terminaison :
aws emr-containers describe-managed-endpoint \ --virtual-cluster-idVIRTUAL_CLUSTER_ID\ --idENDPOINT_IDLa réponse inclut le
authProxyUrlchamp indiquant le point de terminaisonACTIVE. -
Obtenez un jeton de session pour le point de terminaison :
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 réponse inclut un jeton de session :
{ "id": "SESSION_ID", "credentials": { "token": "SESSION_TOKEN" }, "endpointCredentials": { "token": "ENDPOINT_CREDENTIALS_TOKEN" }, "expiresAt": "EXPIRY_TIME" }Utilisez la
credentials.tokenvaleur commex-aws-proxy-authparamètre lors de la connexion à l'URL du proxy d'authentification. -
Installez le PySpark client correspondant à la version de Spark sur votre terminal (Spark 3.5.8 pour
emr-7.14.0, Spark 4.1.1 pouremr-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 -
Connectez-vous à PySpark l'aide de l'URL du proxy d'authentification et du jeton de session :
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()
Le script Python suivant obtient l'URL du proxy d'authentification et le jeton de session, puis se connecte au point de terminaison 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()
Considérations et restrictions
Tenez compte des points suivants lorsque vous exécutez des charges de travail interactives via Spark Connect sur Amazon EMR sur EKS.
-
Spark Connect est pris en charge avec Amazon EMR sur les versions EKS
emr-7.14.0et versions ultérieures, ouemr-spark-8.1.0ultérieures. -
Spark Connect prend DataFrame en charge les API SQL dansPySpark. Spark Connect ne prend pas en charge RDD-based les API.
-
Les jetons de session sont limités dans le temps. Lorsqu'un jeton expire, les appels gRPC échouent avec une erreur d'authentification. Appelez
GetManagedEndpointSessionCredentialspour obtenir un nouveau jeton et créez-en un nouveauSparkSessionavec le jeton mis à jour. -
Chaque configuration de sécurité entretient une relation biunivoque avec un cluster virtuel. Vous ne pouvez pas partager une configuration de sécurité entre plusieurs clusters virtuels.
-
Vous devez supprimer tous les terminaux à l'aide d'une configuration de sécurité avant de pouvoir supprimer la configuration de sécurité.
-
La PySpark version installée localement doit correspondre à la version d'Apache Spark sur votre terminal (Spark 3.5.8 pour
emr-7.14.0, Spark 4.1.1 pouremr-spark-8.1.0). Une incompatibilité de version entraîne des erreurs de connexion ou un comportement inattendu. -
Le type de point de terminaison Spark Connect est
SPARK_CONNECT. Ceci est différent des points de terminaison interactifs Livy (typeJUPYTER_ENTERPRISE_GATEWAY). -
Le
sessionIdleTimeoutInMinutesparamètre contrôle la durée pendant laquelle une session inactive persiste avant son arrêt automatique. La valeur par défaut est de 60 minutes. -
Les terminaux Spark Connect ne prennent pas en charge la propagation sécurisée des identités.
-
Les terminaux Spark Connect ne prennent pas encore en charge le contrôle d'accès précis (FGAC) de Lake Formation. Pour appliquer le contrôle d'accès, utilisez le rôle d'exécution IAM associé au terminal.
-
Les terminaux Spark Connect utilisent un Network Load Balancer (NLB) pour acheminer le trafic gRPC. Le NLB est créé lors de la création du premier point de terminaison Spark Connect et n'est supprimé que lorsque le dernier cluster virtuel activé pour les sessions est supprimé. Amazon EMR sur EKS exécute également un seul routeur Envoy (dans l'
spark-connect-routerespace de noms, un par cluster EKS) qui achemine le trafic gRPC vers les points de terminaison ; il est créé avec le premier point de terminaison Spark Connect et terminé lorsque le dernier cluster virtuel activé pour les sessions est supprimé. Vous êtes responsable des coûts NLB et du calcul EKS consommés par le routeur Envoy tant qu'il existe, en plus des ressources de calcul EKS consommées par le pilote et les exécuteurs Spark pendant votre session. -
Les UDF Python (
@udf,spark.udf.register) nécessitent que la version mineure locale de Python corresponde à la version du télétravailleur, sinon ils échouent.PYTHON_VERSION_MISMATCHBuilt-in Les fonctions et DataFrame opérations SQL ne nécessitent pas de correspondance de version de Python.