

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.

# Einrichtung von IAM-Rollen für Dienstkonten (IRSA) für Spark-Submit
<a name="spark-submit-security-irsa"></a>

In den folgenden Abschnitten wird erklärt, wie Sie IAM-Rollen für Service Accounts (IRSA) einrichten, um Kubernetes-Dienstkonten zu authentifizieren und zu autorisieren, sodass Sie in Amazon S3 gespeicherte Spark-Anwendungen ausführen können.

## Voraussetzungen
<a name="spark-submit-security-irsa-prereqs"></a>

Bevor Sie eines der Beispiele in dieser Dokumentation ausprobieren, stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllt haben:
+ [Die Einrichtung von Spark-Submit ist abgeschlossen](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/spark-submit-setup.html)
+ [Es wurde ein S3-Bucket erstellt](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) und das Spark-Anwendungs-JAR [hochgeladen](https://docs.aws.amazon.com/AmazonS3/latest/userguide/uploading-an-object-bucket.html)

## Konfiguration eines Kubernetes-Dienstkontos für die Übernahme einer IAM-Rolle
<a name="spark-submit-security-irsa-configure-kubernetes"></a>

In den folgenden Schritten wird beschrieben, wie Sie ein Kubernetes-Dienstkonto so konfigurieren, dass es eine AWS Identity and Access Management (IAM-) Rolle annimmt. Nachdem Sie die Pods für die Verwendung des Dienstkontos konfiguriert haben, können sie auf alle Pods zugreifen, für die AWS-Service die Rolle über Zugriffsberechtigungen verfügt.

1. [Erstellen Sie eine Richtliniendatei, um den schreibgeschützten Zugriff auf das Amazon S3 S3-Objekt zu ermöglichen, das Sie hochgeladen haben:](https://docs.aws.amazon.com/AmazonS3/latest/userguide/uploading-an-object-bucket.html)

   ```
   cat >my-policy.json <<EOF
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::<{{my-spark-jar-bucket}}>",
                   "arn:aws:s3:::<{{my-spark-jar-bucket}}>/*"
               ]
           }
       ]
   }
   EOF
   ```

1. Erstellen Sie die IAM-Richtlinie.

   ```
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

1. Erstellen Sie eine IAM-Rolle und verknüpfen Sie sie mit einem Kubernetes-Dienstkonto für den Spark-Treiber

   ```
   eksctl create iamserviceaccount --name my-spark-driver-sa --namespace spark-operator \
   --cluster my-cluster --role-name "my-role" \
   --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
   ```

1. Erstellen Sie eine YAML-Datei mit den erforderlichen [Berechtigungen](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/spark-submit-security.html) für das Spark-Treiberdienstkonto:

   ```
   cat >spark-rbac.yaml <<EOF
   apiVersion: rbac.authorization.k8s.io/v1
   kind: Role
   metadata:
     namespace: default
     name: emr-containers-role-spark
   rules:
   - apiGroups:
     - ""
     resources:
     - pods
     verbs:
     - "*"
   - apiGroups:
     - ""
     resources:
     - services
     verbs:
     - "*"
   - apiGroups:
     - ""
     resources:
     - configmaps
     verbs:
     - "*"
   - apiGroups:
     - ""
     resources:
     - persistentvolumeclaims
     verbs:
     - "*"
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     name: spark-role-binding
     namespace: default
   roleRef:
     apiGroup: rbac.authorization.k8s.io
     kind: Role
     name: emr-containers-role-spark
   subjects:
   - kind: ServiceAccount
     name: emr-containers-sa-spark
     namespace: default
   EOF
   ```

1. Wenden Sie die Bindungskonfigurationen für die Clusterrolle an.

   ```
   kubectl apply -f spark-rbac.yaml
   ```

1. Der `kubectl` Befehl sollte die Bestätigung des erstellten Kontos zurückgeben.

   ```
   serviceaccount/emr-containers-sa-spark created
   clusterrolebinding.rbac.authorization.k8s.io/emr-containers-role-spark configured
   ```

## Die Spark-Anwendung ausführen
<a name="spark-submit-security-irsa-app-run"></a>

Amazon EMR 6.10.0 und höher unterstützt Spark-Submit für die Ausführung von Spark-Anwendungen auf einem Amazon-EKS-Cluster. Führen Sie die folgenden Schritte aus, um die Spark-Anwendung auszuführen:

1. Stellen Sie sicher, dass Sie die Schritte unter [Spark-Submit für Amazon EMR auf EKS einrichten](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/spark-submit-setup.html) abgeschlossen haben.

1. Legen Sie die Werte der folgenden Umgebungsvariablen fest:

   ```
   export SPARK_HOME=spark-home
   export MASTER_URL=k8s://Amazon EKS-cluster-endpoint
   ```

1. Senden Sie jetzt die Spark-Anwendung mit dem folgenden Befehl:

   ```
   $SPARK_HOME/bin/spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master $MASTER_URL \
    --conf spark.kubernetes.container.image=895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.15.0:latest \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=emr-containers-sa-spark \
    --deploy-mode cluster \
    --conf spark.kubernetes.namespace=default \
    --conf "spark.driver.extraClassPath=/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*" \
    --conf "spark.driver.extraLibraryPath=/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native" \
    --conf "spark.executor.extraClassPath=/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*" \
    --conf "spark.executor.extraLibraryPath=/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native" \
    --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.auth.WebIdentityTokenCredentialsProvider \
    --conf spark.hadoop.fs.s3.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem \
    --conf spark.hadoop.fs.AbstractFileSystem.s3.impl=org.apache.hadoop.fs.s3.EMRFSDelegate \
    --conf spark.hadoop.fs.s3.buffer.dir=/mnt/s3 \
    --conf spark.hadoop.fs.s3.getObject.initialSocketTimeoutMilliseconds="2000" \
    --conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem="2" \
    --conf spark.hadoop.mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem="true" \
    s3://my-pod-bucket/spark-examples.jar 20
   ```

1. Nachdem der Spark-Treiber den Spark-Job abgeschlossen hat, sollten Sie am Ende der Einreichung eine Protokollzeile sehen, die angibt, dass der Spark-Job abgeschlossen ist.

   ```
   23/11/24 17:02:14 INFO LoggingPodStatusWatcherImpl: Application org.apache.spark.examples.SparkPi with submission ID default:org-apache-spark-examples-sparkpi-4980808c03ff3115-driver finished
   23/11/24 17:02:14 INFO ShutdownHookManager: Shutdown hook called
   ```

## Bereinigen
<a name="spark-submit-security-irsa-cleanup"></a>

Wenn Sie mit der Ausführung Ihrer Anwendungen fertig sind, können Sie die Bereinigung mit dem folgenden Befehl durchführen.

```
kubectl delete -f spark-rbac.yaml
```