Compartir vía


Motor de ejecución nativo para Fabric Spark

El motor de ejecución nativo es una mejora innovadora para las ejecuciones de trabajos de Apache Spark en Microsoft Fabric. Este motor vectorizado optimiza el rendimiento y la eficacia de las consultas de Spark ejecutándolas directamente en la infraestructura del almacén de lago. Gracias a la fácil integración del motor, no es necesario realizar modificaciones de código y puede evitar el bloqueo del proveedor. Admite las API de Apache Spark y es compatible con Runtime 1.2 (Spark 3.4) y Runtime 1.3 (Spark 3.5) y funciona con formatos Parquet y Delta. Independientemente de la ubicación de los datos en OneLake, o si accede a los datos a través de accesos directos, el motor de ejecución nativo maximiza la eficiencia y el rendimiento.

El motor de ejecución nativo mejora significativamente el rendimiento de las consultas al tiempo que minimiza los costos operativos. Ofrece una mejora notable de velocidad, ya que logra un rendimiento hasta cuatro veces más rápido en comparación con un sistema operativo tradicional (software código abierto) de Spark, tal como se puede comprobar en el punto de referencia TPC-DS 1TB. El motor es capaz de administrar una amplia gama de escenarios de procesamiento de datos, que van desde la ingesta de datos rutinaria, los trabajos por lotes y las tareas ETL (extracción, transformación y carga) hasta los análisis complejos de ciencia de datos y las consultas interactivas con capacidad de respuesta. Los usuarios pueden beneficiarse de tiempos de procesamiento acelerados, un mayor rendimiento y un uso optimizado de recursos.

El motor de ejecución nativo se basa en dos componentes clave del OSS: Velox, una biblioteca de aceleración de bases de datos de C++ introducida por Meta y Apache Gluten (incubación), una capa intermedia responsable de descargar la ejecución de motores SQL basados en JVM en motores nativos introducidos por Intel.

Nota:

En estos momentos, el motor de ejecución nativa está en versión preliminar pública. Para obtener más información, consulte Limitaciones actuales. Le recomendamos que habilite el motor de ejecución nativo en las cargas de trabajo sin costo adicional. Podrá ejecutar más rápidamente el trabajo sin pagar más: en efecto, pagará menos por el mismo trabajo.

Cuándo usar el motor de ejecución nativo

El motor de ejecución nativo le ofrece una solución para ejecutar consultas en conjuntos de datos a gran escala; optimiza el rendimiento mediante las funcionalidades nativas de los orígenes de datos subyacentes y minimiza la sobrecarga que normalmente se asocia con el movimiento y la serialización de datos en entornos tradicionales de Spark. El motor admite varios operadores y tipos de datos, incluidos el agregado de hash acumulativo, la combinación de bucle anidado de difusión (BNLJ) y formatos de marca de tiempo precisos. Sin embargo, para beneficiarse completamente de las funcionalidades del motor, debe tener en cuenta sus casos de uso óptimos:

  • El motor es eficaz al trabajar con datos que estén en los formatos Parquet y Delta; puede procesar estos formatos de forma nativa y eficaz.
  • Las consultas que implican transformaciones y agregaciones complejas se benefician significativamente de las funcionalidades de procesamiento de columnas y vectorización del motor.
  • La mejora del rendimiento es más notable en escenarios en los que las consultas no desencadenan el mecanismo de reserva, ya que así se evitan características o expresiones no admitidas.
  • El motor es adecuado para las consultas que requieren un uso intensivo de cálculos, en lugar de consultas simples o enlazadas a E/S.

Para obtener información sobre los operadores y funciones compatibles con el motor de ejecución nativo, consulte la documentación de Apache Gluten.

Habilitación del motor de ejecución nativo

Para usar las funcionalidades completas del motor de ejecución nativo durante la fase de versión preliminar, necesita configuraciones específicas. En los procedimientos siguientes se muestra cómo activar esta característica para cuadernos, definiciones de trabajos de Spark y entornos completos.

Importante

El motor de ejecución nativo admite la versión más reciente del entorno de ejecución de disponibilidad general, que es Runtime 1.3 (Apache Spark 3.5, Delta Lake 3.2), y la versión anterior: Runtime 1.2 (Apache Spark 3.4, Delta Lake 2.4).

Habilitación del nivel de entorno

Para garantizar una mejora uniforme del rendimiento, habilite el motor de ejecución nativo en todos los trabajos y cuadernos asociados a su entorno:

  1. Acceda a la configuración de su entorno.

  2. Vaya a Proceso de Spark.

  3. Vaya a la pestaña Aceleración.

  4. Active la casilla denominada Habilitar motor de ejecución nativo.

  5. Guarde y publique los cambios.

    Captura de pantalla que muestra cómo habilitar el motor de ejecución nativo en el elemento de entorno.

Cuando se habilita en el nivel de entorno, todos los trabajos y cuadernos posteriores heredan la configuración. Esta herencia garantiza que las nuevas sesiones o recursos creados en el entorno se beneficien automáticamente de las funcionalidades de ejecución mejoradas.

Habilitación de un cuaderno o definición de trabajo de Spark

Para habilitar el motor de ejecución nativo en un único cuaderno o definición de trabajo de Spark, debe incorporar las configuraciones necesarias al principio del script de ejecución:

%%configure 
{ 
   "conf": {
       "spark.native.enabled": "true", 
       "spark.shuffle.manager": "org.apache.spark.shuffle.sort.ColumnarShuffleManager" 
   } 
} 

En el caso de los cuadernos, inserte los comandos de configuración necesarios en la primera celda. En el caso de las definiciones de trabajo de Spark, incluya las configuraciones en la primera línea de la definición del trabajo de Spark.

Captura de pantalla que muestra cómo habilitar el motor de ejecución nativo en el cuaderno.

El motor de ejecución nativo se integra con los grupos activos, por lo que, una vez habilitada la característica, surte efecto inmediatamente sin necesidad de iniciar una nueva sesión.

Importante

La configuración del motor de ejecución nativo debe realizarse antes del inicio de la sesión de Spark. Una vez iniciada la sesión de Spark, la configuración spark.shuffle.manager es inmutable y no se puede cambiar. Asegúrese de que estas configuraciones se establecen dentro del bloque %%configure enlos cuadernos o en el generador de sesiones de Spark para las definiciones de trabajos de Spark.

Control en el nivel de consulta

Los mecanismos para habilitar el motor de ejecución nativo a nivel de inquilino, de área de trabajo y de entorno, integrados sin problemas con la interfaz de usuario, están en desarrollo activo. Mientras tanto, puede deshabilitar el motor de ejecución nativo para consultas específicas, especialmente si implican operadores que no se admiten actualmente (consulte limitaciones). Para deshabilitarlo, establezca la configuración de Spark spark.native.enabled en false en la celda específica que contiene la consulta.

%%sql 
SET spark.native.enabled=FALSE; 

Captura de pantalla que muestra cómo deshabilitar el motor de ejecución nativo en un cuaderno.

Después de ejecutar la consulta en la que está deshabilitado el motor de ejecución nativo, debe volver a habilitarlo para las celdas posteriores estableciendo spark.native.enabled en true. Este paso es necesario porque Spark ejecuta celdas de código de manera secuencial.

%%sql 
SET spark.native.enabled=TRUE; 

Identificación de las operaciones ejecutadas por el motor

Hay varios métodos para determinar si un operador del trabajo de Apache Spark se procesó mediante el motor de ejecución nativo.

Interfaz de usuario de Spark y servidor de historial de Spark

Acceda a la interfaz de usuario de Spark o al servidor de historial de Spark para buscar la consulta que quiere inspeccionar. En el plan de consulta que se muestra en la interfaz, busque los nombres de nodo que terminan con el sufijo Transformer, NativeFileScan o VeloxColumnarToRowExec. Este sufijo indica que el motor de ejecución nativo ejecutó la operación. Por ejemplo, los nodos pueden etiquetarse como RollUpHashAggregateTransformer, ProjectExecTransformer, BroadcastHashJoinExecTransformer, ShuffledHashJoinExecTransformer o BroadcastNestedLoopJoinExecTransformer.

Captura de pantalla que muestra cómo comprobar una visualización de DAG que termina con el sufijo Transformer.

Explicación de DataFrame

Como alternativa, puede ejecutar el comando df.explain() en el cuaderno para ver el plan de ejecución. En la salida, busque los mismos sufijos Transformer, NativeFileScan o VeloxColumnarToRowExec. Este método proporciona una manera rápida de confirmar si el motor de ejecución nativo administra operaciones específicas.

Captura de pantalla que muestra cómo comprobar el plan físico de la consulta y ver si el motor de ejecución nativo ejecutó la consulta.

Mecanismo de reserva

En algunos casos, es posible que el motor de ejecución nativo no pueda ejecutar una consulta debido a motivos como características no admitidas. En estos casos, la operación vuelve al motor de Spark tradicional. Este mecanismo de reserva garantiza que no haya ninguna interrupción en el flujo de trabajo.

Captura de pantalla que muestra el mecanismo de reserva.

Captura de pantalla que muestra cómo puede comprobar los registros asociados al mecanismo de reserva.

Supervisión de consultas y operaciones de DataFrame ejecutadas por el motor

Para comprender mejor cómo se aplica el motor de ejecución nativa a las consultas SQL y a las operaciones de DataFrame, así como para explorar en profundidad los niveles de fase y operador, puede consultar la interfaz de usuario de Spark y el servidor de historial de Spark para obtener información más detallada sobre la ejecución del motor nativo.

Pestaña del motor de ejecución nativo

Puede ir a la nueva pestaña "Gluten SQL / DataFrame" para ver la información de compilación de Gluten y consultar los detalles de ejecución. La tabla Consultas proporciona información sobre el número de nodos que se ejecutan en el motor nativo y los que se revierten a la JVM para cada consulta.

Captura de pantalla donde se muestra la pestaña del motor de ejecución nativo.

Gráfico de ejecución de consultas

También puede hacer clic en la descripción de la consulta para visualizar el plan de ejecución de consultas de Apache Spark. El gráfico de ejecución proporciona detalles de la ejecución nativa en las distintas fases y sus respectivas operaciones. Los colores de fondo permiten distinguir los motores de ejecución: el verde representa el motor de ejecución nativo, mientras que el azul claro indica que la operación se está ejecutando en el motor de JVM predeterminado.

Captura de pantalla donde se muestra el gráfico de ejecución de consultas.

Limitaciones

Aunque el motor de ejecución nativo mejora el rendimiento de los trabajos de Apache Spark, tenga en cuenta sus limitaciones actuales.

  • Aún no se admiten algunas operaciones específicas de Delta, incluidas las operaciones de combinación, los exámenes de punto de control y los vectores de eliminación.
  • Algunas características y expresiones de Spark no son compatibles con el motor de ejecución nativo, como funciones definidas por el usuario (UDF) y la función array_contains, así como el streaming estructurado de Spark. El uso de estas operaciones o funciones incompatibles como parte de una biblioteca importada también provocará la vuelta al motor Spark.
  • No se admiten exámenes de soluciones de almacenamiento que usan puntos de conexión privados.
  • El motor no admite el modo ANSI, por lo que lo busca y, una vez habilitado el modo ANSI, vuelve a la versión Vanilla de Spark.

Al usar filtros de fecha en consultas, es esencial asegurarse de que los tipos de datos de ambos lados de la comparación coincidan para evitar problemas de rendimiento. Es posible que los tipos de datos no coincidentes no incorporen la mejora de la ejecución de consultas y pueden requerir una conversión explícita. Asegúrese siempre de que los tipos de datos del lado izquierdo (LHS) y del lado derecho (RHS) de una comparación sean idénticos, ya que los tipos no coincidentes no siempre se convertirán automáticamente. Si un error de coincidencia de tipos es inevitable, use la conversión explícita para buscar coincidencias con los tipos de datos, como CAST(order_date AS DATE) = '2024-05-20'. El motor de ejecución nativo no acelerará las consultas con tipos de datos no coincidentes que requieran una conversión, por lo que es fundamental garantizar la coherencia del tipo para mantener el rendimiento. Por ejemplo, en lugar de order_date = '2024-05-20' donde order_date es DATETIME y la cadena es DATE, order_date se convierte explícitamente a DATE para garantizar que los tipos de datos sean coherentes y mejorar el rendimiento.

Nota:

El motor de ejecución nativo está actualmente en versión preliminar y su opinión es importante para nosotros. Le invitamos a compartir sus comentarios y los resultados de su evaluación directamente con nuestro equipo de productos. Rellene el formulario de comentarios. Esperamos sus valiosos comentarios y estaremos encantados de analizar sus hallazgos en detalle.