Verwendung von RAPIDS Accelerator für Apache Spark mit Amazon EMR in EKS - 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.

Verwendung von RAPIDS Accelerator für Apache Spark mit Amazon EMR in EKS

Mit Amazon EMR in EKS können Sie Aufträge für den Nvidia RAPIDS Accelerator für Apache Spark ausführen. In diesem Tutorial wird beschrieben, wie Spark-Aufträge mit RAPIDS auf EC2-GPU-Instance-Typen (Graphics Processing Unit) ausgeführt werden. Das Tutorial verwendet die folgenden Versionen:

  • Amazon EMR in EKS veröffentlicht Version 6.9.0 und höher

  • Apache Spark 3.x

Sie können Spark mit Amazon-EC2-GPU-Instance-Typen beschleunigen, indem Sie das Plugin Nvidia RAPIDS Accelerator für Apache Spark verwenden. Wenn Sie diese Technologien zusammen verwenden, beschleunigen Sie Ihre Datenwissenschafts-Pipelines, ohne Codeänderungen vornehmen zu müssen. Dies reduziert die für die Datenverarbeitung und das Modelltraining benötigte Laufzeit. Wenn Sie in kürzerer Zeit mehr erledigen, geben Sie weniger für die Infrastruktur aus.

Bevor Sie beginnen, stellen Sie sicher, dass Sie über folgenden Ressourcen verfügen.

  • Amazon EMR in EKS in einem virtuellen Cluster

  • Amazon-EKS-Cluster mit einer GPU-fähigen Knotengruppe

Ein virtueller Amazon-EKS-Cluster ist ein registriertes Handle für den Kubernetes-Namespace auf einem Amazon-EKS-Cluster und wird von Amazon EMR in EKS verwaltet. Das Handle ermöglicht Amazon EMR, den Kubernetes-Namespace als Ziel für die Ausführung von Aufträgen zu verwenden. Weitere Informationen über das Einrichten eines virtuellen Clusters finden Sie Amazon einrichten EMR auf EKS in diesem Handbuch.

Sie müssen den virtuellen Amazon-EKS-Cluster mit einer Knotengruppe konfigurieren, die GPU-Instances enthält. Sie müssen die Knoten mit einem Nvidia-Geräte-Plugin konfigurieren. Weitere Informationen finden Sie unter Verwaltete Knotengruppen.

Gehen Sie wie folgt vor, um Ihren Amazon-EKS-Cluster so zu konfigurieren, dass GPU-fähige Knotengruppen hinzugefügt werden:

Um GPU-fähige Knotengruppen hinzuzufügen
  1. Erstellen Sie eine GPU-fähige Knotengruppe mit dem folgenden Befehl create-nodegroup. Stellen Sie sicher, dass Sie Ihren Amazon-EKS-Cluster durch die richtigen Parameter ersetzen können. Verwenden Sie einen Instance-Typ, der Spark RAPIDS unterstützt, wie P4, P3, G5 oder G4dn.

    aws eks create-nodegroup \ --cluster-name EKS_CLUSTER_NAME \ --nodegroup-name NODEGROUP_NAME \ --scaling-config minSize=0,maxSize=5,desiredSize=2 CHOOSE_APPROPRIATELY \ --ami-type AL2_x86_64_GPU \ --node-role NODE_ROLE \ --subnets SUBNETS_SPACE_DELIMITED \ --remote-access ec2SshKey= SSH_KEY \ --instance-types GPU_INSTANCE_TYPE \ --disk-size DISK_SIZE \ --region AWS_REGION
  2. Installieren Sie das Nvidia-Geräte-Plugin in Ihrem Cluster, um die Anzahl der GPUs auf jedem Knoten Ihres Clusters auszugeben und GPU-fähige Container in Ihrem Cluster auszuführen. Führen Sie den folgenden Code aus, um das Plugin zu installieren:

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
  3. Führen Sie den folgenden Befehl aus, um zu überprüfen, wie viele GPUs auf jedem Knoten Ihres Clusters verfügbar sind:

    kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
So führen Sie einen Spark-RAPIDS-Auftrag aus
  1. Senden Sie einen Spark-RAPIDS-Auftrag an Ihren Cluster von Amazon EMR in EKS. Der folgende Code zeigt ein Beispiel für einen Befehl zum Starten der Aufgabe. Wenn Sie den Auftrag zum ersten Mal ausführen, kann es einige Minuten dauern, bis das Bild heruntergeladen und auf dem Knoten zwischengespeichert ist.

    aws emr-containers start-job-run \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --execution-role-arn JOB_EXECUTION_ROLE \ --release-label emr-6.9.0-spark-rapids-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar","entryPointArguments": ["10000"], "sparkSubmitParameters":"--class org.apache.spark.examples.SparkPi "}}' \ ---configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults","properties": {"spark.executor.instances": "2","spark.executor.memory": "2G"}}],"monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "LOG_GROUP _NAME"},"s3MonitoringConfiguration": {"logUri": "LOG_GROUP_STREAM"}}}'
  2. Um zu überprüfen, ob der Spark RAPIDS Accelerator aktiviert ist, überprüfen Sie die Spark-Treiberprotokolle. Diese Protokolle werden entweder in CloudWatch oder an dem S3-Speicherort gespeichert, den Sie bei der Ausführung des start-job-run-Befehls angeben. Das folgende Beispiel zeigt im Allgemeinen, wie die Protokollzeilen aussehen:

    22/11/15 00:12:44 INFO RapidsPluginUtils: RAPIDS Accelerator build: {version=22.08.0-amzn-0, user=release, url=, date=2022-11-03T03:32:45Z, revision=, cudf_version=22.08.0, branch=}
    22/11/15 00:12:44 INFO RapidsPluginUtils: RAPIDS Accelerator JNI build: {version=22.08.0, user=, url=https://github.com/NVIDIA/spark-rapids-jni.git, date=2022-08-18T04:14:34Z, revision=a1b23cd_sample, branch=HEAD}
    22/11/15 00:12:44 INFO RapidsPluginUtils: cudf build: {version=22.08.0, user=, url=https://github.com/rapidsai/cudf.git, date=2022-08-18T04:14:34Z, revision=a1b23ce_sample, branch=HEAD}
    22/11/15 00:12:44 WARN RapidsPluginUtils: RAPIDS Accelerator 22.08.0-amzn-0 using cudf 22.08.0.
    22/11/15 00:12:44 WARN RapidsPluginUtils: spark.rapids.sql.multiThreadedRead.numThreads is set to 20.
    22/11/15 00:12:44 WARN RapidsPluginUtils: RAPIDS Accelerator is enabled, to disable GPU support set `spark.rapids.sql.enabled` to false.
    22/11/15 00:12:44 WARN RapidsPluginUtils: spark.rapids.sql.explain is set to `NOT_ON_GPU`. Set it to 'NONE' to suppress the diagnostics logging about the query placement on the GPU.
  3. Um zu sehen, welche Operationen auf einer GPU ausgeführt werden, führen Sie die folgenden Schritte durch, um die zusätzliche Protokollierung zu aktivieren. Beachten Sie die „spark.rapids.sql.explain : ALL“-Konfiguration.

    aws emr-containers start-job-run \ --virtual-cluster-id VIRTUAL_CLUSTER_ID \ --execution-role-arn JOB_EXECUTION_ROLE \ --release-label emr-6.9.0-spark-rapids-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar","entryPointArguments": ["10000"], "sparkSubmitParameters":"--class org.apache.spark.examples.SparkPi "}}' \ ---configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults","properties": {"spark.rapids.sql.explain":"ALL","spark.executor.instances": "2","spark.executor.memory": "2G"}}],"monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "LOG_GROUP_NAME"},"s3MonitoringConfiguration": {"logUri": "LOG_GROUP_STREAM"}}}'

    Der vorherige Befehl ist ein Beispiel für einen Auftrag, der die GPU verwendet. Die Ausgabe würde ungefähr so aussehen wie im folgenden Beispiel. Anhand dieses Schlüssels können Sie die Ausgabe besser verstehen:

    • * – markiert einen Vorgang, der auf einer GPU funktioniert

    • ! – markiert einen Vorgang, der nicht auf einer GPU ausgeführt werden kann

    • @ – markiert einen Vorgang, der auf einer GPU funktioniert, aber nicht ausgeführt werden kann, weil er Teil eines Plans ist, der auf einer GPU nicht ausgeführt werden kann

     22/11/15 01:22:58 INFO GpuOverrides: Plan conversion to the GPU took 118.64 ms
     22/11/15 01:22:58 INFO GpuOverrides: Plan conversion to the GPU took 4.20 ms
     22/11/15 01:22:58 INFO GpuOverrides: GPU plan transition optimization took 8.37 ms
     22/11/15 01:22:59 WARN GpuOverrides:
        *Exec <ProjectExec> will run on GPU
          *Expression <Alias> substring(cast(date#149 as string), 0, 7) AS month#310 will run on GPU
            *Expression <Substring> substring(cast(date#149 as string), 0, 7) will run on GPU
              *Expression <Cast> cast(date#149 as string) will run on GPU
          *Exec <SortExec> will run on GPU
            *Expression <SortOrder> date#149 ASC NULLS FIRST will run on GPU
            *Exec <ShuffleExchangeExec> will run on GPU
              *Partitioning <RangePartitioning> will run on GPU
                *Expression <SortOrder> date#149 ASC NULLS FIRST will run on GPU
              *Exec <UnionExec> will run on GPU
                !Exec <ProjectExec> cannot run on GPU because not all expressions can be replaced
                  @Expression <AttributeReference> customerID#0 could run on GPU
                  @Expression <Alias> Charge AS kind#126 could run on GPU
                    @Expression <Literal> Charge could run on GPU
                  @Expression <AttributeReference> value#129 could run on GPU
                  @Expression <Alias> add_months(2022-11-15, cast(-(cast(_we0#142 as bigint) + last_month#128L) as int)) AS date#149 could run on GPU
                    ! <AddMonths> add_months(2022-11-15, cast(-(cast(_we0#142 as bigint) + last_month#128L) as int)) cannot run on GPU because GPU does not currently support the operator class org.apache.spark.sql.catalyst.expressions.AddMonths
                      @Expression <Literal> 2022-11-15 could run on GPU
                      @Expression <Cast> cast(-(cast(_we0#142 as bigint) + last_month#128L) as int) could run on GPU
                        @Expression <UnaryMinus> -(cast(_we0#142 as bigint) + last_month#128L) could run on GPU
                          @Expression <Add> (cast(_we0#142 as bigint) + last_month#128L) could run on GPU
                            @Expression <Cast> cast(_we0#142 as bigint) could run on GPU
                              @Expression <AttributeReference> _we0#142 could run on GPU
                            @Expression <AttributeReference> last_month#128L could run on GPU