Acelera Google Cloud Serverless for Apache Spark con Lightning Engine

En este documento, se muestra cómo habilitar Lightning Engine para acelerar las cargas de trabajo por lotes y las sesiones interactivas de Serverless for Apache Spark.

Descripción general

Lightning Engine es un acelerador de consultas de alto rendimiento que cuenta con un motor de optimización multicapa que realiza técnicas de optimización habituales, como optimizaciones de consultas y de ejecución, además de optimizaciones seleccionadas en la capa del sistema de archivos y los conectores de acceso a datos.

Como se muestra en la siguiente ilustración, Lightning Engine acelera el rendimiento de la ejecución de consultas de Spark en una carga de trabajo similar a TPC-H (tamaño del conjunto de datos de 10 TB).

Para obtener más información, consulta Presentamos Lightning Engine, la nueva generación de rendimiento de Apache Spark.

Disponibilidad de Lightning Engine

  • Lightning Engine está disponible para su uso con los entornos de ejecución compatibles de Serverless for Apache Spark que se encuentran en disponibilidad general (actualmente, los entornos de ejecución 1.2, 2.2 y 2.3; no está disponible en el entorno de ejecución de Spark 3.0).
  • Lightning Engine solo está disponible con el nivel de precios premium de Serverless for Apache Spark.
    • Cargas de trabajo por lotes: Lightning Engine se habilita automáticamente para las cargas de trabajo por lotes en el nivel premium. No es necesario que realices ninguna acción.
    • Sesiones interactivas: Lightning Engine no está habilitado de forma predeterminada para las sesiones interactivas. Para habilitarlo, consulta Cómo habilitar Lightning Engine.
    • Plantillas de sesión: Lightning Engine no está habilitado de forma predeterminada para las plantillas de sesión. Para habilitarlo, consulta Cómo habilitar Lightning Engine.

Habilita Lightning Engine

En las siguientes secciones, se muestra cómo habilitar Lightning Engine en una carga de trabajo por lotes, una plantilla de sesión y una sesión interactiva de Serverless for Apache Spark.

Carga de trabajo por lotes

Habilita Lightning Engine en una carga de trabajo por lotes

Puedes usar la Google Cloud consola, Google Cloud CLI o la API de Dataproc para habilitar Lightning Engine en una carga de trabajo por lotes.

Console

Usa la consola de Google Cloud para habilitar Lightning Engine en una carga de trabajo por lotes.

  1. En la consola de Google Cloud , haz lo siguiente:

    1. Ir a Lotes de Dataproc
    2. Haz clic en Crear para abrir la página Crear lote.
  2. Selecciona y completa los siguientes campos:

    • Contenedor:
    • Configuración del nivel:

      • Selecciona Premium. Esto habilita y verifica automáticamente la opción "Habilitar LIGHTNING ENGINE para acelerar el rendimiento de Spark".

      Cuando seleccionas el nivel Premium, el Nivel de procesamiento del controlador y el Nivel de procesamiento del ejecutor se establecen en Premium. Estos parámetros de configuración de procesamiento de nivel premium establecidos automáticamente no se pueden anular para los lotes que usan tiempos de ejecución anteriores a 3.0.

      Puedes configurar el nivel de disco del controlador y el nivel de disco del ejecutor en Premium o dejarlos en su valor predeterminado de nivel Standard. Si eliges un nivel de disco Premium, debes seleccionar el tamaño del disco. Para obtener más información, consulta las propiedades de asignación de recursos.

    • Propiedades: Opcional: Ingresa el siguiente par Key (nombre de la propiedad) y Value si deseas seleccionar el tiempo de ejecución de Native Query Execution:

      Clave Valor
      spark.dataproc.lightningEngine.runtime nativo/nativa/indígena/aborigen

  3. Completa, selecciona o confirma otros parámetros de configuración de las cargas de trabajo por lotes. Consulta Envía una carga de trabajo por lotes de Spark.

  4. Haz clic en Enviar para ejecutar la carga de trabajo por lotes de Spark.

gcloud

Configura las siguientes marcas del comando gcloud dataproc batches submit spark de gcloud CLI para habilitar un Lightning Engine en una carga de trabajo por lotes.

gcloud dataproc batches submit spark \
    --project=PROJECT_ID \
    --region=REGION \
    --properties=dataproc.tier=premium \
    OTHER_FLAGS_AS_NEEDED

Notas:

  • PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs del proyecto se enumeran en la sección Información del proyecto del panel de la consola Google Cloud .
  • REGION: Es una región de Compute Engine disponible para ejecutar la carga de trabajo.
  • --properties=dataproc.tier=premium. Cuando se establece el nivel premium, se configuran automáticamente las siguientes propiedades en la carga de trabajo por lotes:

    • spark.dataproc.engine=lightningEngine selecciona Lightning Engine para la carga de trabajo por lotes.
    • spark.dataproc.driver.compute.tier y spark.dataproc.executor.compute.tier se configuran como premium (consulta las propiedades de asignación de recursos). Estos parámetros de configuración de procesamiento de nivel premium establecidos automáticamente no se pueden anular para los lotes que usan tiempos de ejecución anteriores a 3.0.
  • Otras propiedades

    • Native Query Engine: spark.dataproc.lightningEngine.runtime=native Agrega esta propiedad si deseas seleccionar el tiempo de ejecución de Native Query Execution.

    • Niveles y tamaños de disco: De forma predeterminada, los tamaños de disco del controlador y del ejecutor se establecen en niveles y tamaños de standard. Puedes agregar propiedades para seleccionar niveles y tamaños de disco premium (en múltiplos de 375 GiB).
      Para obtener más información, consulta propiedades de asignación de recursos.

  • OTHER_FLAGS_AS_NEEDED: Consulta Envía una carga de trabajo por lotes de Spark.

API

Para habilitar Lightning Engine en una carga de trabajo por lotes, agrega "dataproc.tier":"premium" a RuntimeConfig.properties como parte de tu solicitud batches.create. Cuando se establece el nivel premium, se configuran automáticamente las siguientes propiedades en la carga de trabajo por lotes:

  • spark.dataproc.engine=lightningEngine selecciona Lightning Engine para la carga de trabajo por lotes.
  • spark.dataproc.driver.compute.tier y spark.dataproc.executor.compute.tier se configuran como premium (consulta las propiedades de asignación de recursos). Estos parámetros de configuración de procesamiento de nivel premium establecidos automáticamente no se pueden anular para los lotes que usan tiempos de ejecución anteriores a 3.0.

Otro RuntimeConfig.properties:

  • Native Query Engine: spark.dataproc.lightningEngine.runtime:native. Agrega esta propiedad si deseas seleccionar el entorno de ejecución de Native Query Execution.

  • Niveles y tamaños de disco: De forma predeterminada, los tamaños de disco del controlador y del ejecutor se establecen en niveles y tamaños de standard. Puedes agregar propiedades para seleccionar niveles y tamaños de premium (en múltiplos de premium).
    Para obtener más información, consulta propiedades de asignación de recursos.375 GiB

Consulta Envía una carga de trabajo por lotes de Spark para configurar otros campos de la API de carga de trabajo por lotes.

Plantilla de sesión

Habilita Lightning Engine en una plantilla de sesión

Puedes usar la Google Cloud consola, Google Cloud CLI o la API de Dataproc para habilitar Lightning Engine en una plantilla de sesión para una sesión de Jupyter o Spark Connect.

Console

Usa la consola de Google Cloud para habilitar Lightning Engine en una carga de trabajo por lotes.

  1. En la consola de Google Cloud , haz lo siguiente:

    1. Ve a Plantillas de sesiones de Dataproc.
    2. Haz clic en Crear para abrir la página Crear plantilla de sesión.
  2. Selecciona y completa los siguientes campos:

    • Información de la plantilla de sesión:
      • Selecciona "Habilitar Lightning Engine para acelerar el rendimiento de Spark".
    • Configuración de ejecución:
    • Propiedades: Ingresa los siguientes pares de Key (nombre de la propiedad) y Value para seleccionar el nivel Premium:

      Clave Valor
      dataproc.tier premium
      spark.dataproc.engine lightningEngine

      Opcional: Ingresa el siguiente par de Key (nombre de la propiedad) y Value para seleccionar el tiempo de ejecución de Native Query Execution:

      Clave Valor
      spark.dataproc.lightningEngine.runtime native

  3. Completa, selecciona o confirma otros parámetros de configuración de la plantilla de sesión. Consulta Crea una plantilla de sesión.

  4. Haz clic en Enviar para crear la plantilla de sesión.

gcloud

No puedes crear directamente una plantilla de sesión de Serverless for Apache Spark con gcloud CLI. En cambio, puedes usar el comando gcloud beta dataproc session-templates import para importar una plantilla de sesión existente, editar la plantilla importada para habilitar Lightning Engine y, de manera opcional, el entorno de ejecución de Native Query, y, luego, exportar la plantilla editada con el comando gcloud beta dataproc session-templates export.

API

Para habilitar Lightning Engine en una plantilla de sesión, agrega "dataproc.tier":"premium" y "spark.dataproc.engine":"lightningEngine" a RuntimeConfig.properties como parte de tu solicitud de sessionTemplates.create.

Otro RuntimeConfig.properties:

  • Native Query Engine: spark.dataproc.lightningEngine.runtime:native: Agrega esta propiedad a RuntimeConfig.properties para seleccionar el tiempo de ejecución de Native Query Execution.

Consulta Crea una plantilla de sesión para configurar otros campos de la API de plantilla de sesión.

Sesión interactiva

Habilita Lightning Engine en una sesión interactiva

Puedes usar Google Cloud CLI o la API de Dataproc para habilitar Lightning Engine en una sesión interactiva de Serverless para Apache Spark. También puedes habilitar Lightning Engine en una sesión interactiva en un notebook de BigQuery Studio.

gcloud

Configura las siguientes marcas del comando gcloud beta dataproc sessions create spark de gcloud CLI para habilitar Lightning Engine en una sesión interactiva.

gcloud beta dataproc sessions create spark \
    --project=PROJECT_ID \
    --location=REGION \
    --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine \
    OTHER_FLAGS_AS_NEEDED

Notas:

  • PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs del proyecto se enumeran en la sección Información del proyecto del panel de la consola Google Cloud .
  • REGION: Es una región de Compute Engine disponible para ejecutar la carga de trabajo.
  • --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine. Estas propiedades habilitan Lightning Engine en la sesión.

  • Otras propiedades:

    • Native Query Engine: spark.dataproc.lightningEngine.runtime=native: Agrega esta propiedad para seleccionar el tiempo de ejecución de Native Query Execution.
  • OTHER_FLAGS_AS_NEEDED: Consulta Cómo crear una sesión interactiva.

API

Para habilitar Lightning Engine en una sesión, agrega "dataproc.tier":"premium" y "spark.dataproc.engine":"lightningEngine" a RuntimeConfig.properties como parte de tu solicitud de sessions.create.

Otro RuntimeConfig.properties:

* Native Query Engine: spark.dataproc.lightningEngine.runtime:native: Agrega esta propiedad a RuntimeConfig.properties si deseas seleccionar el tiempo de ejecución de Native Query Execution.

Consulta Cómo crear una sesión interactiva para configurar otros campos de la API de plantillas de sesión.

Notebook de BigQuery

Puedes habilitar Lightning Engine cuando creas una sesión en un notebook de PySpark de BigQuery Studio.

from google.cloud.dataproc_spark_connect import DataprocSparkSession
from google.cloud.dataproc_v1 import Session
session = Session()

# Enable Lightning Engine.
session.runtime_config.properties["dataproc.tier"] = "premium"
session.runtime_config.properties["spark.dataproc.engine"] = "lightningEngine"

# Enable THE Native Query Execution runtime.
session.runtime_config.properties["spark.dataproc.lightningEngine.runtime"] = "native"

# Create the Spark session.
spark = (
   DataprocSparkSession.builder
     .appName("APP_NAME")
     .dataprocSessionConfig(session)
     .getOrCreate())

# Add Spark application code here:

Verifica la configuración de Lightning Engine

Puedes usar la Google Cloud consola, Google Cloud CLI o la API de Dataproc para verificar la configuración de Lightning Engine en una carga de trabajo por lotes, una plantilla de sesión o una sesión interactiva.

Carga de trabajo por lotes

  • Para verificar que el nivel de procesamiento por lotes esté configurado como premium y que el motor esté configurado como Lightning Engine, haz lo siguiente:

    • Google Cloud Consola: En la página Lotes, consulta las columnas Nivel y Motor del lote. También puedes hacer clic en el ID de lote para ver estos parámetros de configuración en la página de detalles del lote.
    • Gcloud CLI: Ejecuta el comando gcloud dataproc batches describe.
    • API: Envía una solicitud batches.get.

Plantilla de sesión

  • Para verificar que engine esté configurado como Lightning Engine para una plantilla de sesión, haz lo siguiente:

    • Consola deGoogle Cloud : En la página Plantillas de sesión, consulta la columna Motor de tu plantilla. También puedes hacer clic en el Nombre de la plantilla de sesión para ver este parámetro de configuración en la página de detalles de la plantilla de sesión.
    • Gcloud CLI: Ejecuta el comando gcloud beta dataproc session-templates describe.
    • API: Envía una solicitud sessionTemplates.get.

Sesión interactiva

  • El motor se establece en Lightning Engine para una sesión interactiva:

    • Consola deGoogle Cloud : En la página Sesiones interactivas, consulta la columna Motor de la plantilla. También puedes hacer clic en el ID de sesión interactiva para ver este parámetro de configuración en la página de detalles de la plantilla de sesión.
    • Gcloud CLI: Ejecuta el comando gcloud beta dataproc sessions describe.
    • API: Envía una solicitud sessions.get.

Ejecución de consultas nativas

La ejecución de consultas nativas (NQE) es una función opcional de Lightning Engine que mejora el rendimiento a través de una implementación nativa basada en Apache Gluten y Velox, diseñada para el hardware de Google.

El tiempo de ejecución de Native Query Execution incluye una administración de memoria unificada para el cambio dinámico entre la memoria fuera del heap y la memoria en el heap sin necesidad de cambiar la configuración existente de Spark. NQE incluye compatibilidad expandida para operadores, funciones y tipos de datos de Spark, así como inteligencia para identificar automáticamente oportunidades de usar el motor nativo para operaciones de envío óptimas.

Identifica las cargas de trabajo de ejecución de consultas nativas

Usa la ejecución de consultas nativas en los siguientes casos:

  • APIs de DataFrame de Spark, 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 el rendimiento de la ejecución de consultas nativas.

  • Son las cargas de trabajo que recomienda la herramienta de calificación de ejecución de consultas nativas.

No se recomienda la ejecución de consultas nativas para cargas de trabajo con entradas de los siguientes tipos de datos:

  • Byte: ORC y Parquet
  • Marca de tiempo: ORC
  • Struct, Array y Map: Parquet

Limitaciones de la ejecución de consultas nativas

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 la siguiente ejecución puede hacer que la carga de trabajo vuelva al motor de ejecución de Spark, lo que genera una regresión o una falla.

  • ANSI: Si el modo ANSI está habilitado, la ejecución se revierte a Spark.

  • Modo sensible a mayúsculas y 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 tabla particionada: 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

El uso de la ejecución de consultas nativas puede generar un comportamiento incompatible o resultados incorrectos 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 (juliano gregoriano) y el calendario gregoriano proléptico. Los resultados de Spark pueden variar.
  • NaN: No compatible. Por ejemplo, pueden producirse resultados inesperados cuando se usa NaN en una comparación numérica.

  • Lectura columnar de Spark: Se puede producir un error fatal, ya que el vector columnar de Spark es incompatible con la ejecución de consultas nativas.

  • Volcado: Cuando las particiones de la mezcla se establecen en una cantidad grande, la función de volcado en disco puede activar un OutOfMemoryException. Si esto ocurre, reducir la cantidad de particiones puede eliminar esta excepción.