

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
<a name="emr-eks-spark-connect"></a>

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
<a name="emr-eks-spark-connect-prerequisites"></a>

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. ](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)

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. ](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/creating-job-execution-role.html)
+ 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. ](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-cluster-access.html)

## Erforderliche Berechtigungen
<a name="emr-eks-spark-connect-permissions"></a>

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
<a name="emr-eks-spark-connect-security-config"></a>

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

`namespace`In 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
<a name="emr-eks-spark-connect-create-vc"></a>

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
<a name="emr-eks-spark-connect-create"></a>

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
<a name="emr-eks-spark-connect-connect"></a>

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 lautet`ACTIVE`.

1. 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.

1. Installieren Sie den PySpark Client, der der Spark-Version entspricht, auf Ihrem Endpunkt (Spark 3.5.8 für`emr-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
   ```

1. 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
<a name="emr-eks-spark-connect-considerations"></a>

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ür`emr-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 ist`SPARK_CONNECT`. Dies unterscheidet sich von den interaktiven Livy-Endpunkten (Typ`JUPYTER_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.