Lightning Engine verwenden

Lightning Engine ist die nächste Generation von Apache Spark und bietet exklusive Verbesserungen, die für eine erhebliche Steigerung von Leistung, Kosteneffizienz und Betriebsstabilität sorgen.

Vorteile

Die Lightning Engine bietet unter anderem folgende Vorteile:

  • Beschleunigte Datenvorgänge: Durch Optimierungen der Cloud Storage-Interaktion, einschließlich Metadatenverarbeitung, Schreibarbeitslasten und vektorisierter E/A, lassen sich erhebliche Leistungssteigerungen und Kosteneinsparungen erzielen.

  • Intelligente Abfrageausführung: Nutzen Sie erweiterte Optimierungen, die die gescannten Daten dynamisch reduzieren, die Datenverarbeitung optimieren und effizientere Ausführungspläne für schnellere und kostengünstigere Abfragen generieren.

  • Optimierte KI- und ML-Arbeitslasten: Reduzieren Sie die Cluster-Startzeiten für GPU-basierte Arbeitslasten und vereinfachen Sie die Bereitstellung in sicheren Umgebungen mit nativen KI- und ML-Images.

Lightning Engine bietet zwar erhebliche Leistungssteigerungen, die genauen Auswirkungen variieren jedoch je nach Arbeitslast. Sie eignet sich am besten für rechenintensive Aufgaben, bei denen Spark Dataframe APIs, Spark Dataset APIs und Spark SQL-Abfragen verwendet werden, und nicht für E/A-gebundene Vorgänge.

Vergleich mit der Standard-Engine

Lightning Engine ist eine Alternative zur Standard-Engine, die zum Ausführen von Spark-Jobs in einem Managed Service for Apache Spark-Cluster verwendet wird. In der folgenden Tabelle werden die Aktivierungseigenschaften, die Anwendbarkeit auf Arbeitslasten und die wichtigsten Vorteile von Lightning Engine im Vergleich zur Standard-Engine verglichen.

Funktion Standardmodul Lightning Engine
Aktivierungseigenschaft --engine=default oder das Flag entfernen --engine=lightning
Optimal für Allgemeine Jobs, Entwicklung und Tests Arbeitslasten im Unternehmensmaßstab, die eine erhebliche Beschleunigung erfordern
Hauptvorteile Baseline-Leistung Optimierte Cloud Storage-Interaktion, intelligente Abfrageausführung

Voraussetzungen

Für die Lightning Engine-Funktion gelten die folgenden Anforderungen:

  • Image-Version: Lightning Engine muss mit der Image-Version 2.3.3 oder höher von Managed Service for Apache Spark verwendet werden.
  • Unterstützte Jobs: Spark, PySpark, SparkSQL und SparkR werden unterstützt. Die Standard-Engine wird für andere Jobtypen ausgeführt, die an einen Lightning Engine-Cluster gesendet werden.

Native Abfrageausführung

Die Ausführung nativer Abfragen (Native Query Execution, NQE) ist eine optionale Komponente von Lightning Engine, die eine höhere Beschleunigung für bestimmte Jobs bietet. Es handelt sich um eine native Engine, die auf Apache Gluten und Velox basiert und für Google-Hardware optimiert ist. Sie steigert die Leistung, indem Teile einer Spark-Abfrage außerhalb der JVM ausgeführt werden.

NQE wird empfohlen für:
Rechenintensive Aufgaben (im Gegensatz zu E/A-gebundenen Vorgängen), bei denen Spark-Dataframe-APIs, Spark-Dataset-APIs und Spark SQL-Abfragen verwendet werden, mit denen Daten aus Parquet- und ORC-Dateien gelesen werden. Das Ausgabedateiformat hat keine Auswirkungen auf die Leistung.
NQE wird nicht empfohlen für:
Jobs, die stark auf Resilient Distributed Datasets (RDDs), benutzerdefinierten Funktionen (User-Defined Functions, UDFs) oder den meisten Spark ML-Bibliotheken (Machine Learning) basieren.

Voraussetzungen

Für die Funktion „Ausführung nativer Abfragen“ gelten die folgenden Anforderungen:

  • Ausführungs-Engine: NQE ist nur für Cluster verfügbar, die bei der Clustererstellung mit der Lightning-Engine aktiviert wurden.

  • Betriebssystem: Es werden nur Debian-12-Bilder unterstützt. NQE-fähige Jobs, die ein anderes Betriebssystem verwenden, schlagen fehl.

  • Unterstützte Jobs: Spark, PySpark, SparkSQL und SparkR werden unterstützt. Die Standard-Engine wird (ohne NQE) für andere Jobtypen ausgeführt, die an einen Lightning Engine-Cluster gesendet werden.

  • Maschinentypen: Es werden nur Maschinenfamilien mit Intel- oder AMD-Prozessoren unterstützt. Für NQE-fähige Jobs mit ARM-Prozessoren tritt ein Fehler auf. Sie können jedoch von Lightning Engine ohne NQE profitieren.

  • Keine GPUs und Beschleuniger: NQE-fähige Jobs, die auf GPU-Beschleunigern eingereicht werden, schlagen fehl (können aber ohne NQE von Lightning Engine profitieren).

  • Datentypen: Eingaben der folgenden Datentypen werden nicht unterstützt:

    • Byte: ORC und Parquet
    • Struct, Array, Map: Parquet

Preise

Informationen zur Preisgestaltung finden Sie unter Preise für Managed Service for Apache Spark in Compute Engine.

Lightning Engine-Cluster erstellen

In diesem Abschnitt erfahren Sie, wie Sie einen Managed Service for Apache Spark-Cluster erstellen, der die Lightning Engine für Spark-Jobs aktiviert, die an den Cluster gesendet werden.

Sie können die Ausführung nativer Abfragen (Native Query Execution, NQE) auch beim Erstellen des Clusters aktivieren. Alternativ können Sie NQE später für bestimmte Spark-Jobs aktivieren, die an den Cluster gesendet werden.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that you have the permissions required to complete this guide.

  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the Dataproc API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  6. Installieren Sie die Google Cloud CLI.

  7. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  8. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  9. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. Verify that you have the permissions required to complete this guide.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Dataproc API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  13. Installieren Sie die Google Cloud CLI.

  14. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  15. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init

Erforderliche Rollen

Bestimmte IAM-Rollen sind erforderlich, um einen Managed Service for Apache Spark-Cluster zu erstellen und Jobs an den Cluster zu senden. Je nach Organisationsrichtlinien wurden diese Rollen möglicherweise bereits gewährt. Informationen zum Prüfen von Rollenzuweisungen finden Sie unter Müssen Sie Rollen zuweisen?.

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Nutzerrollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen eines Managed Service for Apache Spark-Clusters benötigen:

Rolle des Dienstkontos

Bitten Sie Ihren Administrator, dem Compute Engine-Standarddienstkonto die IAM-Rolle Managed Service for Apache Spark Worker (roles/dataproc.worker) für das Projekt zuzuweisen, damit das Compute Engine-Standarddienstkonto die erforderlichen Berechtigungen zum Erstellen eines Managed Service for Apache Spark-Clusters hat.

Cluster erstellen

In den folgenden Beispielen wird gezeigt, wie Sie einen Lightning Engine-Cluster mit der Google Cloud Console, der Google Cloud CLI, der Dataproc API, Python oder Terraform erstellen. Sie können auch einen Managed Service for Apache Spark-Cluster mit aktivierter Lightning Engine mithilfe der Go-, Java- und Node.js-Clientbibliotheken erstellen.

Console

  1. Rufen Sie in der Google Cloud Console Apache Spark-Cluster in Compute Engine erstellen auf. Weitere Informationen finden Sie unter Cluster mit der Google Cloud Konsole erstellen.

    Apache Spark-Cluster in Compute Engine erstellen

  2. Wählen Sie unter Cluster definieren das Kästchen Lightning Engine aktivieren aus, um einen Cluster mit aktivierter Lightning Engine zu erstellen.

  3. Optional: Wenn Sie die native Ausführungs-Laufzeit standardmäßig für Spark-Jobs aktivieren möchten, klicken Sie das Kästchen Native Execution aktivieren an.

  4. Konfigurieren Sie bei Bedarf weitere Clustereinstellungen.

  5. Klicken Sie auf Erstellen.

gcloud-CLI

  1. Führen Sie den Befehl gcloud dataproc clusters create mit dem Flag --engine=lightning aus, um einen Cluster mit aktivierter Lightning Engine zu erstellen. Weitere Informationen finden Sie unter Cluster mit der gcloud CLI erstellen.

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3
    
  2. Optional: Wenn Sie die native Ausführungslaufzeit standardmäßig für Spark-Jobs aktivieren möchten, fügen Sie das Attribut spark:spark.dataproc.lightningEngine.runtime=native hinzu.

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3 \
        --properties='spark:spark.dataproc.lightningEngine.runtime=native'
    

API

Wenn Sie einen Cluster mit aktivierter Lightning Engine erstellen möchten, senden Sie eine clusters.create-Anfrage. Weitere Informationen finden Sie unter Cluster mit der REST API erstellen.

  1. Setzen Sie im Anfragetext das Feld engine auf LIGHTNING.

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3"
        }
      },
      "engine": "LIGHTNING"
    }
    
  2. Optional: Wenn Sie die native Ausführungslaufzeit standardmäßig für alle Jobs aktivieren möchten, fügen Sie das Attribut spark:spark.dataproc.lightningEngine.runtime hinzu.

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3",
          "properties": {
            "spark:spark.dataproc.lightningEngine.runtime": "native"
          }
        }
      },
      "engine": "LIGHTNING"
    }
    

Python

  1. Wenn Sie einen Cluster mit aktivierter Lightning Engine erstellen möchten, verwenden Sie die Methode create_cluster und legen Sie das Feld engine in der Clusterkonfiguration auf LIGHTNING fest. Weitere Informationen finden Sie unter Cluster mit Python erstellen.

    from google.cloud import dataproc_v1
    
    def create_lightning_cluster(project_id, region, cluster_name):
        client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"}
        cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options)
    
        cluster = {
            "project_id": project_id,
            "cluster_name": cluster_name,
            "config": {
                "engine": "LIGHTNING",
                "software_config": {
                    "image_version": "2.3-debian12",
                },
            }
        }
    
        operation = cluster_client.create_cluster(
            project_id=project_id,
            region=region,
            cluster=cluster
        )
        result = operation.result()
        print(f"Cluster created successfully: {result.cluster_name}")
    
  2. Optional: Wenn Sie die native Ausführungslaufzeit standardmäßig für Spark-Jobs aktivieren möchten, fügen Sie das Attribut spark:spark.dataproc.lightningEngine.runtime hinzu.

    from google.cloud import dataproc_v1
    
    def create_lightning_native_cluster(project_id, region, cluster_name):
        client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"}
        cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options)
    
        cluster = {
            "project_id": project_id,
            "cluster_name": cluster_name,
            "config": {
                "engine": "LIGHTNING",
                "software_config": {
                    "image_version": "2.3-debian12",
                    "properties": {
                        "spark:spark.dataproc.lightningEngine.runtime": "native"
                    }
                }
            }
        }
    
        operation = cluster_client.create_cluster(
            project_id=project_id,
            region=region,
            cluster=cluster
        )
        result = operation.result()
        print(f"Cluster created successfully: {result.cluster_name}")
    

Terraform

  1. Legen Sie in der Konfiguration der google_dataproc_cluster-Ressource das Argument engine auf LIGHTNING fest.
  2. Weitere Informationen und erweiterte Optionen finden Sie in der offiziellen Terraform-Dokumentation zur Ressource google_dataproc_cluster.

Cluster-Engine prüfen

Console

  1. Rufen Sie in der Google Cloud Console die Seite Clusterdetails auf.
  2. Prüfen Sie, ob der Wert Lightning Engine im Feld Engine aufgeführt ist.
  3. Wenn Sie die native Abfrageausführung aktiviert haben, prüfen Sie, ob native im Feld Native Execution (Native Ausführung) aufgeführt ist.

gcloud

  1. Führen Sie den Befehl gcloud dataproc clusters describe aus, um die Engine und NQE (falls aktiviert) zu prüfen:

    gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGION
    
  2. Prüfen Sie die Ausgabe auf die Attribute engine und lightningEngine.runtime:

    clusterName: lightning-engine-cluster
    engine: lightningEngine
    lightningEngine.runtime: native
    

Job mit Lightning Engine senden

Nachdem Sie einen Lightning Engine-Cluster erstellt haben, wird Lightning Engine automatisch für den Job aktiviert, wenn Sie einen Spark-Job an den Cluster senden.

Native Abfrageausführung für einen Job aktivieren

Wenn Sie die Ausführung nativer Abfragen (Native Query Execution, NQE) beim Erstellen eines Lightning Engine-Clusters aktiviert haben, werden alle Spark-Jobs mit aktivierter NQE ausgeführt, sofern Sie NQE nicht für einen bestimmten Job deaktivieren.

Wenn Sie NQE beim Erstellen des Lightning Engine-Clusters nicht aktiviert haben, können Sie NQE für einen bestimmten Job aktivieren, wenn Sie den Job einreichen, wie in den folgenden Beispielen gezeigt.

gcloud

Wenn Sie die Ausführung nativer Abfragen beim Senden eines Spark-Jobs aktivieren möchten, fügen Sie das Attribut spark.dataproc.lightningEngine.runtime=native ein:

```none
gcloud dataproc jobs submit spark \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=spark.dataproc.lightningEngine.runtime=native \
    -- ...
```

API

Wenn Sie die Ausführung nativer Abfragen beim Senden eines Spark-Jobs aktivieren möchten, fügen Sie das Attribut spark.dataproc.lightningEngine.runtime in Ihre Anfrage ein:

```json
{
  "job":{
    "placement":{
      "clusterName": ...
    },
    "sparkJob":{
      "mainClass": ...,
      "properties":{
         "spark.dataproc.lightningEngine.runtime":"native"
      }
    }
  }
}
```

Native Abfrageausführung für einen Job deaktivieren

Wenn Sie die Ausführung nativer Abfragen (Native Query Execution, NQE) beim Erstellen eines Lightning Engine-Clusters aktiviert haben, werden alle Spark-Jobs mit aktivierter NQE ausgeführt, sofern Sie NQE nicht für einen bestimmten Job deaktivieren.

Sie können NQE für einen bestimmten Spark-Job deaktivieren, wenn Sie den Job einreichen, wie in den folgenden Beispielen gezeigt.

gcloud

Wenn Sie die native Ausführung von Abfragen deaktivieren möchten, wenn Sie einen Spark-Job an einen Lightning Engine-Cluster senden, fügen Sie das Attribut spark.dataproc.lightningEngine.runtime=default ein:

```shell
gcloud dataproc jobs submit spark \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=spark.dataproc.lightningEngine.runtime=default \
    -- ...
```

API

Wenn Sie die Ausführung nativer Abfragen deaktivieren möchten, wenn Sie einen Spark-Job an einen Lightning Engine-Cluster senden, fügen Sie das Attribut spark.dataproc.lightningEngine.runtime=default ein:

```json
{
  "job":{
    "placement":{
      "clusterName": ...
    },
    "sparkJob":{
      "mainClass": ...,
      "properties":{
         "spark.dataproc.lightningEngine.runtime":"default"
      }
    }
  }
}
```

Ausführung nativer Abfragen für einen Job prüfen

Nachdem Sie einen Job an einen Lightning Engine-Cluster gesendet haben, können Sie prüfen, ob die native Abfrageausführung für den Job aktiviert ist.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Jobdetails auf.
  2. Prüfen Sie, ob native im Feld Native Execution (Native Ausführung) aufgeführt ist.

gcloud

  1. Führen Sie den Befehl gcloud dataproc jobs describe aus:

    gcloud dataproc clusters describe JOB_ID --project=PROJECT_ID --region=REGION
    
  2. Prüfen Sie die Ausgabe auf lightningEngine.runtime im Abschnitt Properties (Eigenschaften):

    lightningEngine.runtime: native
    

Konfigurationsparameter

In der folgenden Tabelle sind die wichtigsten Konfigurationsparameter für Lightning Engine und die Ausführung nativer Abfragen zusammengefasst.

Parametername Beschreibung Anwendbare Engines Standardwert Standardwert (Lightning Engine) Überschreibbar durch Nutzer (Jobebene) Umfang
--engine Einstellung auf Clusterebene, um die Engine beim Erstellen des Clusters auszuwählen. Clusterweit default lightning Nein Cluster
spark:spark.dataproc.lightningEngine.runtime Einstellung auf Clusterebene, um die Lightning-Engine-Laufzeit bei der Clustererstellung auszuwählen. Nur Lightning default default Nein Cluster
spark.dataproc.lightningEngine.runtime Aktiviert oder deaktiviert die native Ausführung von Abfragen (Native Query Execution, NQE) in der Lightning-Engine. Nur Lightning default default Ja. Kann auf native oder default festgelegt werden. Job

Beschränkungen

Das Aktivieren der Ausführung nativer Abfragen in den folgenden Szenarien kann zu Ausnahmen, Spark-Inkompatibilitäten oder einem Fallback der Arbeitslast auf die standardmäßige Spark-Engine führen.

Fallbacks

Die Ausführung nativer Abfragen in den folgenden Szenarien kann dazu führen, dass für einen Arbeitslast-Fallback die Spark-Ausführungs-Engine verwendet wird:

  • ANSI: Wenn der ANSI-Modus aktiviert ist, wird die Ausführung auf Spark zurückgesetzt.
  • Modus mit Berücksichtigung der Groß-/Kleinschreibung: Die Ausführung nativer Abfragen unterstützt nur den Spark-Standardmodus ohne Berücksichtigung der Groß-/Kleinschreibung. Wenn der Modus „Groß-/Kleinschreibung beachten“ aktiviert ist, können falsche Ergebnisse auftreten.
  • Scan partitionierter Tabellen: Die native Abfrageausführung unterstützt den Scan partitionierter Tabellen nur, wenn der Pfad die Partitionsinformationen enthält. Andernfalls wird für die Arbeitslast die Spark-Ausführungs-Engine verwendet.

Inkompatibles Verhalten

Inkompatibles Verhalten oder falsche Ergebnisse können auftreten, wenn Sie die Ausführung nativer Abfragen in den folgenden Fällen verwenden:

  • JSON-Funktionen: Bei der Ausführung nativer Abfragen werden Strings unterstützt, die von doppelten Anführungszeichen umschlossen sind, nicht von einfachen Anführungszeichen. Bei einfachen Anführungszeichen werden falsche Ergebnisse angezeigt. Wenn Sie * im Pfad mit der Funktion get_json_object verwenden, wird NULL zurückgegeben.
  • Konfiguration für das Lesen von Parquet-Dateien:
    • Bei der Ausführung nativer Abfragen wird spark.files.ignoreCorruptFiles als auf den Standardwert false festgelegt behandelt, auch wenn true festgelegt ist.
    • Bei der Ausführung nativer Abfragen wird spark.sql.parquet.datetimeRebaseModeInRead ignoriert und es werden nur die Inhalte der Parquet-Datei zurückgegeben. Unterschiede zwischen dem Legacy-Hybridkalender und dem proleptischen gregorianischen Kalender werden nicht berücksichtigt. Die Ergebnisse von Spark können abweichen.
  • NaN: Nicht unterstützt. Unerwartete Ergebnisse können beispielsweise auftreten, wenn Sie NaN in einem numerischen Vergleich verwenden.
  • Spaltenweises Lesen in Spark: Es kann ein schwerwiegender Fehler auftreten, weil der spaltenweise Spark-Vektor nicht mit der nativen Abfrageausführung kompatibel ist.
  • Spill: Wenn Sie die Anzahl der Shuffle-Partitionen auf einen hohen Wert festlegen, kann die Funktion „Spill-to-Disk“ einen OutOfMemoryException auslösen. Wenn dies der Fall ist, kann diese Ausnahme durch Reduzieren der Anzahl der Partitionen behoben werden.

Nächste Schritte