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
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
Bevor Sie eines der Beispiele in dieser Dokumentation ausprobieren, stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllt haben:
-
Es wurde ein S3-Bucket erstellt und das Spark-Anwendungs-JAR hochgeladen
Konfiguration eines Kubernetes-Dienstkontos für die Übernahme einer IAM-Rolle
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.
-
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 -
Erstellen Sie die IAM-Richtlinie.
aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json -
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 -
Erstellen Sie eine YAML-Datei mit den erforderlichen Berechtigungen 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 -
Wenden Sie die Bindungskonfigurationen für die Clusterrolle an.
kubectl apply -f spark-rbac.yaml -
Der
kubectlBefehl 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
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:
-
Stellen Sie sicher, dass Sie die Schritte unter Spark-Submit für Amazon EMR auf EKS einrichten abgeschlossen haben.
-
Legen Sie die Werte der folgenden Umgebungsvariablen fest:
export SPARK_HOME=spark-home export MASTER_URL=k8s://Amazon EKS-cluster-endpoint -
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 -
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
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