View a markdown version of this page

Führen Sie interaktive Sitzungen mit Amazon EMR auf EKS über Spark Connect durch - Amazon EMR

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Führen Sie interaktive Sitzungen mit Amazon EMR auf EKS über Spark Connect durch

Mit Amazon EMR in der EKS-Version emr-7.14.0 und höher (oder später) können Sie von selbstverwalteten PySpark Clients wieVS Code,, emr-spark-8.1.0 und Notebooks aus eine Verbindung zu einem verwalteten Spark Connect-Endpunkt herstellen. PyCharm Jupyter Spark Connect verwendet eine Client-Server-Architektur, die Ihren Anwendungscode vom Spark-Treiberprozess entkoppelt. Sie entwickeln und debuggen PySpark Code in Ihrer lokalen IDE, während Spark-Operationen auf Ihrem EKS-Cluster über Amazon EMR auf EKS ausgeführt werden. Spark Connect bietet die folgenden Vorteile:

  • Stellen Sie von jedem PySpark Client aus, einschließlich VS Code Notebooks, eine Verbindung zu Amazon EMR auf EKS her PyCharm Jupyter

  • Legen Sie in Ihrer IDE Haltepunkte fest und führen Sie den PySpark Code Schritt für Schritt durch, während Sie ihn remote mit Daten im DataFrames Produktionsumfang ausführen

  • Führen Sie es auf Ihrem eigenen EKS-Cluster aus und haben Sie die volle Kontrolle über die Rechen-, Netzwerk- und Sicherheitskonfiguration

Ein Spark Connect-Endpunkt ist ein verwalteter Endpunkt in Ihrem virtuellen Cluster, der einen Spark Connect-Server hostet. Wenn Sie einen Spark Connect-Endpunkt erstellen, stellt Amazon EMR auf EKS einen Spark-Treiber mit einem gRPC-Server auf Ihrem EKS-Cluster bereit. Ihr lokaler PySpark Client sendet DataFrame SQL-Operationen über den gRPC-Endpunkt an den Treiber. Um mit dem Endpunkt zu interagieren, erhalten Sie mithilfe der GetManagedEndpointSessionCredentials API Anmeldeinformationen für die Sitzung. Jeder Endpunkt unterstützt mehrere gleichzeitige Sitzungen.

Voraussetzungen

Bevor Sie einen Spark Connect-Endpunkt erstellen, stellen Sie sicher, dass Sie über Folgendes verfügen.

Die folgenden Anforderungen gelten spezifisch für Spark Connect-Endpoints:

  • Ein EKS-Cluster mit mindestens einem privaten Subnetz. Um den gRPC-Verkehr zum Endpunkt weiterzuleiten, stellt Spark Connect einen internen Network Load Balancer (NLB) bereit, für den ein privates Subnetz in Ihrer VPC erforderlich ist. Der NLB ist intern und nicht mit dem öffentlichen Internet verbunden.

  • Der Load AWS Balancer Controller ist auf Ihrem EKS-Cluster installiert, sodass Amazon EMR auf EKS den internen NLB bereitstellen kann. Anweisungen finden Sie unter Installation des Load AWS Balancer Controllers.

Sie benötigen außerdem den folgenden Standard-Amazon EMR für EKS-Ressourcen. Wenn Sie bereits Jobs auf Amazon EMR auf EKS ausführen, haben Sie diese wahrscheinlich eingerichtet:

  • Eine Rolle zur Ausführung von IAM-Aufträgen mit Berechtigungen für den Zugriff auf Ihre Datenquellen wie Amazon S3-Buckets und den Datenkatalog. Anweisungen finden Sie unter Eine Rolle zur Auftragsausführung erstellen.

  • Wenn Ihr EKS-Cluster Cluster Access Management verwendet, die erforderlichen Zugriffseinträge für Amazon EMR auf EKS. Anweisungen finden Sie unter Cluster-Zugriff für Amazon EMR auf EKS einrichten.

Erforderliche Berechtigungen

Fügen Sie Ihrer IAM-Rolle die folgenden Berechtigungen hinzu, um einen Spark Connect-Endpoint zu erstellen und mit ihm zu interagieren:

{ "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" ] } } } ] }

Eine Sicherheitskonfiguration erstellen

Für Spark Connect-Endpunkte ist eine Sicherheitskonfiguration erforderlich, die Ihrem virtuellen Cluster zugeordnet ist. Die Sicherheitskonfiguration definiert die Authentifizierungs- und Autorisierungseinstellungen für den Endpunkt und gibt den System-Namespace an, auf dem die Spark Connect-Infrastruktur ausgeführt wird.

Anmerkung

Jede Sicherheitskonfiguration hat eine Eins-zu-Eins-Beziehung zu einem virtuellen Cluster. Sie können dieselbe Sicherheitskonfiguration nicht in mehreren virtuellen Clustern wiederverwenden.

Erstellen Sie eine Sicherheitskonfiguration mit einem System-Namespace:

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" } } }'

namespaceIn der Sicherheitskonfiguration ist dies der System-Namespace, in dem die Infrastrukturkomponenten von Spark Connect ausgeführt werden. Dieser ist getrennt von dem Benutzernamespace, der bei der Erstellung des virtuellen Clusters angegeben wurde.

Erstellen Sie einen virtuellen Cluster mit aktiviertem Spark Connect

Erstellen Sie einen virtuellen Cluster, der der Sicherheitskonfiguration zugeordnet ist. Sie müssen sessionEnabled den Wert securityConfigurationId aus dem vorherigen Schritt auswählen true und angeben.

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
Wichtig

--security-configuration-id— Ordnet diesen virtuellen Cluster der im vorherigen Schritt erstellten Sicherheitskonfiguration zu. Dies ist für Spark Connect-Endpunkte erforderlich.

--session-enabled— Aktiviert die Unterstützung von Spark Connect-Endpunkten auf dem virtuellen Cluster. Ohne dieses Flag können Sie keine Spark Connect-Endpunkte auf diesem virtuellen Cluster erstellen.

Erstellen Sie einen Spark Connect-Endpunkt

Nachdem Sie eine Sicherheitskonfiguration erstellt haben, erstellen Sie einen von Spark Connect verwalteten Endpunkt in Ihrem virtuellen Cluster.

Anmerkung

Es dauert länger, bis der erste Spark Connect-Endpunkt auf einem EKS-Cluster erstellt wird ACTIVE als die nachfolgenden. Für den ersten Endpunkt auf dem EKS-Cluster stellt Amazon EMR auf EKS die gemeinsam genutzten Netzwerkkomponenten bereit, die für die Konnektivität verwendet werden — einen internen Network Load Balancer (NLB), einen VPC-Schnittstellenendpunkt (AWS PrivateLink) und eine einmalige Envoy-Router-Bereitstellung (im spark-connect-router Namespace), die den gRPC-Verkehr an Endpunkte weiterleitet — was mehrere Minuten dauern kann. Diese Komponenten werden nur einmal pro EKS-Cluster erstellt und von allen späteren Endpunkten in diesem Cluster wiederverwendet, sodass nachfolgende Endpunkte schneller gestartet werden.

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
Anmerkung

Standardmäßig beginnt ein von Spark Connect verwalteter Endpunkt mit 2 Executoren. Wenn Sie keine Konfigurationsüberschreibungen angeben, verwendet der Endpunkt diese Standardeinstellung. Um mit einer anderen Anzahl von Executoren zu arbeiten, legen Sie spark.executor.instances die Konfigurationsüberschreibungen fest, wie im folgenden Beispiel gezeigt.

Das folgende Beispiel beinhaltet Spark-Konfigurationsüberschreibungen mit dynamischer Zuweisung und eine Überwachungskonfiguration für den Export von Spark-Protokollen nach 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" } }'

Überwachen Sie den Endpunktstatus:

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

Warten Sie, bis der Endpunktstatus erreicht ist, ACTIVE bevor Sie eine Verbindung herstellen.

Stellen Sie eine Verbindung zu einem Spark Connect-Endpunkt her

Nachdem der Endpunkt aktiv ist, rufen Sie die Anmeldeinformationen für die Sitzung ab und stellen Sie von einem PySpark Client aus eine Verbindung her.

Um eine Verbindung zu einem Spark Connect-Endpunkt herzustellen
  1. Rufen Sie die Auth-Proxy-URL aus der Endpunktbeschreibung ab:

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

    Die Antwort enthält das authProxyUrl Feld, wenn der Endpunkt lautetACTIVE.

  2. Holen Sie sich ein Sitzungstoken für den Endpunkt:

    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"

    Die Antwort enthält ein Sitzungstoken:

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

    Verwenden Sie den credentials.token Wert als x-aws-proxy-auth Parameter, wenn Sie eine Verbindung zur Auth-Proxy-URL herstellen.

  3. Installieren Sie den PySpark Client, der der Spark-Version entspricht, auf Ihrem Endpunkt (Spark 3.5.8 füremr-7.14.0, Spark 4.1.1 für): 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. Stellen Sie PySpark mithilfe der Auth-Proxy-URL und des Sitzungstoken eine Verbindung her:

    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()

Das folgende Python-Skript ruft die Auth-Proxy-URL und das Sitzungstoken ab und stellt dann eine Verbindung zum Spark Connect-Endpunkt her:

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()

Überlegungen und Einschränkungen

Beachten Sie Folgendes, wenn Sie interaktive Workloads über Spark Connect auf Amazon EMR auf EKS ausführen.

  • Spark Connect wird mit Amazon EMR ab der EKS-Version emr-7.14.0 und höher oder emr-spark-8.1.0 später unterstützt.

  • Spark Connect unterstützt DataFrame und SQL-APIs sind aktiviert. PySpark Spark Connect unterstützt keine RDD-based APIs.

  • Sitzungstoken sind zeitlich begrenzt. Wenn ein Token abläuft, schlagen gRPC-Aufrufe mit einem Authentifizierungsfehler fehl. Rufen Sie GetManagedEndpointSessionCredentials auf, um ein neues Token abzurufen und ein neues SparkSession mit dem aktualisierten Token zu erstellen.

  • Jede Sicherheitskonfiguration hat eine Eins-zu-Eins-Beziehung zu einem virtuellen Cluster. Sie können eine Sicherheitskonfiguration nicht für mehrere virtuelle Cluster gemeinsam verwenden.

  • Sie müssen alle Endpunkte löschen, die eine Sicherheitskonfiguration verwenden, bevor Sie die Sicherheitskonfiguration löschen können.

  • Die lokal installierte PySpark Version muss mit der Apache Spark-Version auf Ihrem Endpunkt übereinstimmen (Spark 3.5.8 füremr-7.14.0, Spark 4.1.1 für). emr-spark-8.1.0 Eine Versionsinkongruenz führt zu Verbindungsfehlern oder unerwartetem Verhalten.

  • Der Spark Connect-Endpunkttyp istSPARK_CONNECT. Dies unterscheidet sich von den interaktiven Livy-Endpunkten (TypJUPYTER_ENTERPRISE_GATEWAY).

  • Der sessionIdleTimeoutInMinutes Parameter steuert, wie lange eine Sitzung im Leerlauf andauert, bevor sie automatisch beendet wird. Standard ist 60 Minuten.

  • Spark Connect-Endpunkte unterstützen Trusted Identity Propagation nicht.

  • Spark Connect-Endpunkte unterstützen Lake Formation Fine-Grained Access Control (FGAC) noch nicht. Verwenden Sie die dem Endpunkt zugeordnete IAM-Ausführungsrolle, um die Zugriffskontrolle durchzusetzen.

  • Spark Connect-Endpunkte verwenden einen Network Load Balancer (NLB), um den gRPC-Verkehr weiterzuleiten. Der NLB wird erstellt, wenn der erste Spark Connect-Endpunkt erstellt wird, und erst gelöscht, wenn der letzte virtuelle Cluster mit aktivierter Sitzung gelöscht wird. Amazon EMR auf EKS betreibt außerdem einen einzelnen Envoy-Router (im spark-connect-router Namespace, einen pro EKS-Cluster), der den gRPC-Verkehr an Endpunkte weiterleitet. Er wird mit dem ersten Spark Connect-Endpunkt erstellt und beendet, wenn der letzte virtuelle Cluster mit aktivierter Sitzung gelöscht wird. Sie sind für die NLB-Kosten und die vom Envoy-Router verbrauchten EKS-Rechenleistung verantwortlich, solange diese existieren, zusätzlich für die EKS-Rechenressourcen, die während Ihrer Sitzung vom Spark-Treiber und den Executoren verbraucht werden.

  • Python-UDFs (@udf,spark.udf.register) erfordern, dass die lokale Python-Nebenversion mit der Remote-Worker-Version übereinstimmt, andernfalls schlagen sie fehl. PYTHON_VERSION_MISMATCH Built-in Für SQL-Funktionen und DataFrame -Operationen ist kein Abgleich der Python-Version erforderlich.