Usa Lightning Engine

Lightning Engine es la nueva generación de rendimiento de Apache Spark, que presenta mejoras exclusivas diseñadas para ofrecer mejoras sustanciales en el rendimiento, la rentabilidad y la estabilidad operativa.

Beneficios

Estos son algunos de los beneficios de Lightning Engine:

  • Operaciones de datos aceleradas: Logra importantes aumentos en el rendimiento y ahorros de costos a través de optimizaciones en la interacción con el almacenamiento en la nube, incluido el manejo de metadatos, las cargas de trabajo de escritura y la E/S vectorizada.

  • Ejecución inteligente de consultas: Aprovecha las mejoras avanzadas del optimizador que reducen de forma dinámica los datos analizados, optimizan el procesamiento de datos y generan planes de ejecución más eficientes para consultas más rápidas y rentables.

  • Cargas de trabajo de IA y AA optimizadas: Reduce los tiempos de inicio del clúster para las cargas de trabajo basadas en GPU y simplifica la implementación en entornos seguros con imágenes optimizadas para la IA.

Si bien Lightning Engine ofrece mejoras significativas en el rendimiento, el impacto específico varía según la carga de trabajo. Es más adecuado para tareas que requieren mucha capacidad de procesamiento y que aprovechan las APIs de DataFrame de Spark, las APIs de Dataset de Spark y las consultas de Spark SQL, en lugar de las operaciones vinculadas a la E/S.

Comparación con el motor estándar

Lightning Engine es una alternativa al motor estándar que se usa para ejecutar trabajos de Spark en un clúster de Managed Service para Apache Spark. En la siguiente tabla, se comparan las propiedades de activación del motor, la aplicabilidad de la carga de trabajo y los beneficios clave de Lightning Engine con los del motor estándar.

Función Motor estándar Lightning Engine
Marca de CLI --engine=default o anula la marca --engine=lightning
Ideal para Trabajos de uso general, desarrollo y pruebas Cargas de trabajo a escala empresarial que requieren una aceleración significativa
Beneficios clave Rendimiento de modelo de referencia Interacción optimizada con el almacenamiento en la nube y ejecución inteligente de consultas

Requisitos

Se aplican los siguientes requisitos a la función de Lightning Engine:

  • Versión de la imagen: Lightning Engine se debe usar con la versión de imagen 2.3.3 o posterior de Managed Service para Apache Spark.
  • Trabajos admitidos: Se admiten Spark, PySpark, SparkSQL y SparkR. El motor estándar se ejecuta en otros tipos de trabajos enviados a un clúster de Lightning Engine.

Ejecución de consultas nativas

La ejecución de consultas nativas (NQE) es un componente opcional de Lightning Engine que proporciona un nivel más profundo de aceleración para trabajos específicos. Es un motor nativo basado en Apache Gluten y Velox, optimizado para el hardware de Google, que mejora el rendimiento ejecutando partes de una consulta de Spark fuera de la JVM.

Se recomienda la NQE para las siguientes situaciones:
Tareas que requieren mucha capacidad de procesamiento y que aprovechan las APIs de DataFrame de Spark y las APIs de Dataset de Spark, y consultas de Spark SQL que leen datos de archivos Parquet y ORC. El formato del archivo de salida no afecta su rendimiento.
No se recomienda la NQE para los siguientes casos:
Trabajos que dependen en gran medida de los conjuntos de datos distribuidos resilientes (RDD), las funciones definidas por el usuario (UDF), la mayoría de las bibliotecas de aprendizaje automático (AA) de Spark y las operaciones vinculadas a la E/S con retrasos debido al acceso al almacenamiento

Requisitos

Se aplican los siguientes requisitos a la función de ejecución de consultas nativas:

  • Motor de ejecución: NQE solo está disponible en los clústeres habilitados con el motor Lightning durante la creación del clúster.

  • Sistema operativo: Solo se admiten los sistemas operativos Debian-12 y Ubuntu-22. Los trabajos habilitados para NQE que usen cualquier otro SO fallarán.

  • Trabajos admitidos: Se admiten Spark, PySpark, SparkSQL y SparkR. El motor estándar se ejecutará (sin NQE) en otros tipos de trabajos enviados a un clúster de Lightning Engine.

  • Tipos de máquinas: Solo se admiten las familias de máquinas que usan procesadores Intel o AMD. Los trabajos habilitados para NQE que usan procesadores ARM fallarán (pero pueden beneficiarse de Lightning Engine sin NQE).

  • Sin GPUs ni aceleradores: Los trabajos habilitados para NQE que se envíen en aceleradores de GPU fallarán (pero pueden beneficiarse de Lightning Engine sin NQE).

  • Tipos de datos: No se admiten entradas de los siguientes tipos de datos:

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

Precios

Para obtener información sobre los precios, consulta los precios de Managed Service para Apache Spark.

Crea un clúster de Lightning Engine

En esta sección, se muestra cómo crear un clúster de Managed Service para Apache Spark que habilite Lightning Engine en los trabajos de Spark enviados al clúster.

También puedes habilitar la ejecución de consultas nativas (NQE) en el clúster cuando lo creas o habilitar la NQE más adelante para trabajos específicos de Spark enviados al clúster.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  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. Instala Google Cloud CLI.

  7. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  8. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    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. Instala Google Cloud CLI.

  14. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  15. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init

Roles obligatorios

Se requieren ciertos roles de IAM para crear un clúster de Managed Service para Apache Spark y enviar trabajos a él. Según las políticas de la organización, es posible que el propietario de un proyecto de Cloud o el administrador de servicios ya te hayan otorgado estos roles a ti o a una cuenta de servicio. Para verificar las asignaciones de roles, consulta ¿Necesitas otorgar roles?.

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Roles de usuario

Para obtener los permisos que necesitas para crear un clúster de Managed Service para Apache Spark, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Rol de la cuenta de servicio

Para asegurarte de que la cuenta de servicio predeterminada de Compute Engine tenga los permisos necesarios para crear un clúster de Managed Service for Apache Spark, pídele a tu administrador que otorgue el rol de IAM de trabajador de Dataproc (roles/dataproc.worker) a la cuenta de servicio predeterminada de Compute Engine en el proyecto.

Crea el clúster

En los siguientes ejemplos, se muestra cómo crear un clúster de Lightning Engine con la consola de Google Cloud , Google Cloud CLI, la API de Dataproc, las bibliotecas cliente de Cloud para Python o Terraform. También puedes crear un clúster con Lightning Engine habilitado con las bibliotecas cliente de Cloud de Go, Java y Node.js.

Console

  1. Abre la página Crear clúster.
  2. Haz clic en Configuración adicional para expandir esa sección.
  3. Edita Personalización y otros.
  4. En el panel que se abre, confirma que la casilla de verificación Habilitar Lightning Engine esté seleccionada.
  5. Opcional: Para habilitar el tiempo de ejecución de la ejecución nativa de forma predeterminada para los trabajos de Spark, selecciona la casilla de verificación Habilitar ejecución nativa.
  6. Haz clic en Guardar.
  7. Establece otros parámetros de configuración del clúster según sea necesario.
  8. Haga clic en Crear clúster.

gcloud CLI

  1. Para crear un clúster con Lightning Engine habilitado, ejecuta el comando gcloud dataproc clusters create con la marca --engine=lightning. Para obtener más información, consulta cómo crear un clúster con la CLI de gcloud.

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3
    
  2. Opcional: Para habilitar el entorno de ejecución nativo de forma predeterminada para los trabajos de Spark, incluye la propiedad spark:spark.dataproc.lightningEngine.runtime=native.

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

API

Para crear un clúster con Lightning Engine habilitado, envía una solicitud clusters.create. Para obtener más información, consulta cómo crear un clúster con la API de REST.

  1. En el cuerpo de la solicitud, configura el campo engine como LIGHTNING.

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "engine": "LIGHTNING",
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3"
        }
      }
    }
    
  2. Opcional: Para habilitar el entorno de ejecución nativo de forma predeterminada para todos los trabajos, incluye la propiedad spark:spark.dataproc.lightningEngine.runtime.

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

Python

  1. Para crear un clúster con Lightning Engine habilitado, usa el método create_cluster y configura el campo engine en la configuración del clúster como LIGHTNING. Para obtener más información, consulta cómo crear un clúster con Python.

    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. Opcional: Para habilitar el entorno de ejecución nativo de forma predeterminada para los trabajos de Spark, incluye la propiedad spark:spark.dataproc.lightningEngine.runtime.

    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. En la configuración de tu recurso google_dataproc_cluster, establece el argumento engine en LIGHTNING.
  2. Para obtener más detalles y opciones avanzadas, consulta la documentación oficial de Terraform para el recurso google_dataproc_cluster.

Verifica el motor del clúster

Console

  1. En la consola de Google Cloud , ve a la página Detalles del clúster.
  2. Verifica que el valor de Lightning Engine aparezca en el campo Motor.
  3. Si habilitaste la ejecución de consultas nativas, verifica que native aparezca en el campo Ejecución nativa.

gcloud

  1. Para verificar el motor y la NQE (si está habilitada), ejecuta el comando gcloud dataproc clusters describe:

    gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGION
    
  2. Verifica el resultado de las propiedades engine y lightningEngine.runtime:

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

Envía un trabajo con Lightning Engine

Si habilitaste Lightning Engine cuando creaste un clúster, cuando envíes un trabajo de Spark al clúster, Lightning Engine estará habilitado de forma predeterminada en el trabajo.

Habilita la ejecución de consultas nativas para un trabajo

Si habilitaste la ejecución de consultas nativas (NQE) cuando creaste un clúster de Lightning Engine, todos los trabajos de Spark se ejecutarán con la NQE habilitada, a menos que inhabilite la NQE en un trabajo específico.

Si no habilitaste NQE cuando creaste el clúster de Lightning Engine, puedes habilitar NQE para un trabajo cuando lo envíes, como se muestra en los siguientes ejemplos.

gcloud

Para habilitar la ejecución de consultas nativas cuando envíes un trabajo de Spark, incluye la propiedad spark.dataproc.lightningEngine.runtime=native:

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

API

Para habilitar la ejecución de consultas nativas cuando envíes un trabajo de Spark, incluye la propiedad spark.dataproc.lightningEngine.runtime en tu solicitud:

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

Inhabilita la ejecución de consultas nativas para un trabajo

Si habilitaste la ejecución de consultas nativas (NQE) cuando creaste un clúster de Lightning Engine, todos los trabajos de Spark se ejecutarán con la NQE habilitada, a menos que la inhabilite en un trabajo específico.

Puedes inhabilitar la NQE para un trabajo de Spark específico cuando envíes el trabajo, como se muestra en los siguientes ejemplos.

gcloud

Para inhabilitar la ejecución de consultas nativas cuando envías un trabajo de Spark a un clúster de Lightning Engine, incluye la propiedad spark.dataproc.lightningEngine.runtime=default:

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

API

Para inhabilitar la ejecución de consultas nativas cuando envías un trabajo de Spark a un clúster de Lightning Engine, incluye la propiedad spark.dataproc.lightningEngine.runtime=default:

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

Verifica la ejecución de consultas nativas para un trabajo

Después de enviar un trabajo a un clúster de Lightning Engine, puedes verificar que la ejecución de consultas nativas esté habilitada para el trabajo.

Console

  1. En la consola de Google Cloud , ve a la página Trabajos.
  2. Haz clic en el ID del trabajo para abrir la página Detalles del trabajo.
  3. Verifica que native aparezca en el campo Ejecución nativa.

gcloud

  1. Ejecuta el comando gcloud dataproc jobs describe:

    gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGION
    
  2. Verifica el resultado de lightningEngine.runtime en la sección Propiedades:

    lightningEngine.runtime: native
    

Parámetros de configuración

En la siguiente tabla, se resumen los principales parámetros de configuración de Lightning Engine y Native Query Execution.

Nombre del parámetro Descripción Motores aplicables Valor predeterminado Valor predeterminado (Lightning Engine) Se puede anular el usuario (a nivel del trabajo) Alcance
--engine Es un parámetro de configuración a nivel del clúster para seleccionar el motor durante la creación del clúster. En todo el clúster default lightning No Clúster
spark:spark.dataproc.lightningEngine.runtime Es un parámetro de configuración a nivel del clúster para seleccionar el tiempo de ejecución del motor de Lightning durante la creación del clúster. Solo Lightning default default No Clúster
spark.dataproc.lightningEngine.runtime Habilita o inhabilita la ejecución de consultas nativas (NQE) en Lightning Engine. Solo Lightning default default Sí. Se puede establecer en native o default. Trabajo

Limitaciones

Habilitar la ejecución de consultas nativas en las siguientes situaciones puede provocar excepciones, incompatibilidades con Spark o que la carga de trabajo recurra al motor de Spark predeterminado.

Resguardos

La ejecución de consultas nativas en las siguientes situaciones puede hacer que una carga de trabajo recurra al motor de ejecución de Spark:

  • ANSI: Si el modo ANSI está habilitado, la ejecución se revierte a Spark.
  • Modo que distingue mayúsculas de minúsculas: La ejecución de consultas nativas solo admite el modo predeterminado de Spark que no distingue mayúsculas de minúsculas. Si el modo sensible a mayúsculas y minúsculas está habilitado, se pueden producir resultados incorrectos.
  • Análisis de tablas particionadas: La ejecución de consultas nativas admite el análisis de tablas particionadas solo cuando la ruta contiene la información de partición. De lo contrario, la carga de trabajo recurre al motor de ejecución de Spark.

Comportamiento incompatible

Se puede producir un comportamiento incompatible o resultados incorrectos cuando usas la ejecución de consultas nativas en los siguientes casos:

  • Funciones JSON: La ejecución de consultas nativas admite cadenas entre comillas dobles, no comillas simples. Los resultados incorrectos se producen con comillas simples. Usar * en la ruta de acceso con la función get_json_object devuelve NULL.
  • Configuración de lectura de Parquet:
    • La ejecución de consultas nativas trata spark.files.ignoreCorruptFiles como si estuviera configurado en el valor predeterminado false, incluso cuando se establece en true.
    • La ejecución de consultas nativas ignora spark.sql.parquet.datetimeRebaseModeInRead y solo devuelve el contenido del archivo Parquet. No se consideran las diferencias entre el calendario híbrido heredado y el calendario gregoriano proléptico. Los resultados de Spark pueden variar.
  • NaN: No se admite. Por ejemplo, pueden producirse resultados inesperados cuando usas NaN en una comparación numérica.
  • Lectura columnar de Spark: Se puede producir un error grave porque el vector columnar de Spark es incompatible con la ejecución de consultas nativas.
  • Desbordamiento: Cuando estableces una gran cantidad de particiones de aleatorización, la función de desbordamiento en disco puede activar un OutOfMemoryException. Si esto ocurre, reducir la cantidad de particiones puede eliminar esta excepción.

¿Qué sigue?