Ir al contenido principal

Presentamos transformWithState en Apache Spark™ Structured Streaming

Cree consultas de streaming con estado flexibles y escalables

Introducing transformWithState in Apache Spark™ Structured Streaming

Summary

  • Procesamiento con estado más flexible: transformWithState mejora Apache Spark™ Structured Streaming con gestión de estado flexible, tipos de datos compuestos y programación basada en eventos.
  • Rendimiento y simplicidad mejorados: características como la expiración de estado basada en TTL, tipos compuestos, encadenamiento de operadores e inicialización de estado sin interrupciones reducen la complejidad y aumentan la eficiencia.
  • Preparado para el futuro y escalable: la evolución nativa del esquema y la integración profunda con las características de Databricks garantizan aplicaciones de streaming fiables y escalables.

Introducción

El procesamiento de flujos con estado se refiere al procesamiento de un flujo continuo de eventos en tiempo real mientras se mantiene un estado basado en los eventos vistos hasta el momento. Esto permite al sistema rastrear cambios y patrones a lo largo del tiempo en el flujo de eventos, y permite tomar decisiones o realizar acciones basadas en esta información.

El procesamiento de flujos con estado en Apache Spark Structured Streaming se admite mediante operadores integrados (como agregación con ventanas, unión de flujos, eliminación de duplicados, etc.) para lógica predefinida y mediante flatMapGroupWithState o mapGroupWithState para lógica arbitraria. La lógica arbitraria permite a los usuarios escribir su código de manipulación de estado personalizado en sus canalizaciones. Sin embargo, a medida que la adopción de streaming crece en la empresa, las aplicaciones de streaming más complejas y sofisticadas exigen varias características adicionales para facilitar a los desarrolladores la escritura de canalizaciones de streaming con estado.

Para admitir estas nuevas y crecientes aplicaciones de streaming con estado o casos de uso operativos, la comunidad de Spark está introduciendo un nuevo operador de Spark llamado transformWithState. Este operador permitirá un modelado de datos flexible, tipos compuestos, temporizadores, TTL, encadenamiento de operadores con estado después de transformWithState, evolución de esquemas, reutilización de estado de una consulta diferente e integración con una gran cantidad de otras características de Databricks como Unity Catalog, Delta Live Tables y Spark Connect. Utilizando este operador, los clientes pueden desarrollar y ejecutar sus casos de uso operativos con estado complejos y críticos para la misión de manera confiable y eficiente en la plataforma Databricks utilizando lenguajes populares como Scala, Java o Python.

Aplicaciones/Casos de Uso que utilizan Procesamiento de Flujos con Estado

Muchas aplicaciones dirigidas por eventos dependen de la realización de cálculos con estado para activar acciones o emitir eventos de salida que generalmente se escriben en otro registro de eventos/bus de mensajes como Apache Kafka/Apache Pulsar/Google Pub-Sub, etc. Estas aplicaciones suelen implementar una máquina de estados que valida reglas, detecta anomalías, rastrea sesiones, etc., y genera los resultados derivados, que generalmente se utilizan para activar acciones en sistemas posteriores, basándose en:

  • Eventos de entrada
  • Estado
  • Tiempo (capacidad de trabajar con tiempo de procesamiento y tiempo de evento)
  • Eventos de salida

Ejemplos de tales aplicaciones incluyen el Seguimiento de la Experiencia del Usuario, la Detección de Anomalías, la Monitorización de Procesos de Negocio y los Árboles de Decisión.

Presentación de transformWithState: Una API de Procesamiento con Estado Más Potente

Apache Spark presenta ahora transformWithState, un operador de procesamiento con estado de próxima generación diseñado para hacer que la construcción de aplicaciones de streaming complejas en tiempo real sea más flexible, eficiente y escalable. Esta nueva API desbloquea capacidades avanzadas para la gestión de estado, el procesamiento de eventos, la gestión de temporizadores y la evolución de esquemas, permitiendo a los usuarios implementar una lógica de streaming sofisticada con facilidad.

Diseño de Alto Nivel

Estamos introduciendo un nuevo enfoque de API en capas, flexible y extensible para abordar las limitaciones mencionadas anteriormente. A continuación, se muestra un diagrama de arquitectura de alto nivel de la arquitectura en capas y las características asociadas en varias capas.

API de Estado en Capas

Como se muestra en la figura, continuamos utilizando los backends de estado disponibles en la actualidad. Actualmente, Apache Spark admite dos backends de almacén de estado:

  • HDFSBackedStateStoreProvider
  • RocksDBStateStoreProvider

El nuevo operador transformWithState será compatible inicialmente solo con el proveedor de almacén de estado RocksDB. Hacemos uso de varias funcionalidades de RocksDB en torno a escaneos de rango, operadores de fusión, etc., para garantizar un rendimiento óptimo para las diversas características utilizadas dentro de transformWithState. Sobre esta capa, construimos otra capa de abstracción que utiliza el StatefulProcessorHandle para trabajar con tipos compuestos, temporizadores, metadatos de consulta, etc. A nivel del operador, permitimos el uso de un StatefulProcessor que puede incrustar la lógica de la aplicación utilizada para ofrecer estas potentes aplicaciones de streaming. Finalmente, puede utilizar el StatefulProcessor dentro de consultas de Apache Spark basadas en las API de DataFrame.

Aquí hay un ejemplo de una consulta de streaming de Apache Spark que utiliza el operador transformWithState:

LÍDER 5X

Gartner®: Databricks, líder en bases de datos en la nube

Características Clave con transformWithState

Modelado de Datos Flexible con Variables de Estado

Con transformWithState, los usuarios ahora pueden definir múltiples variables de estado independientes dentro de un StatefulProcessor basándose en el modelo de programación orientada a objetos. Estas variables funcionan como miembros privados de clase, permitiendo una gestión de estado granular sin requerir una estructura de estado monolítica. Esto facilita la evolución de la lógica de la aplicación a lo largo del tiempo mediante la adición o modificación de variables de estado sin reiniciar consultas desde un nuevo directorio de puntos de control.

Temporizadores y Retrollamadas para Procesamiento Dirigido por Eventos

Los usuarios ahora pueden registrar temporizadores para activar la lógica de la aplicación dirigida por eventos. La API admite temporizadores de tiempo de procesamiento (basado en el reloj de pared) y de tiempo de evento (basado en columnas). Cuando un temporizador se activa, se emite una retrollamada, lo que permite un manejo eficiente de eventos, actualizaciones de estado y generación de salidas. La capacidad de listar, registrar y eliminar temporizadores garantiza un control preciso sobre el procesamiento de eventos.

Soporte Nativo para Tipos de Datos Compuestos

La gestión del estado es ahora más intuitiva con el soporte integrado para estructuras de datos compuestas:

  • ValueState: Almacena un único valor por clave de agrupación.
  • ListState: Mantiene una lista de valores por clave, admitiendo operaciones de adición eficientes.
  • MapState: Permite el almacenamiento de clave-valor dentro de cada clave de agrupación con búsquedas puntuales eficientes.

Spark codifica y persiste automáticamente estos tipos de estado, reduciendo la necesidad de serialización manual y mejorando el rendimiento.

Expiración Automática de Estado con TTL

Para el cumplimiento y la eficiencia operativa, transformWithState introduce el soporte nativo de tiempo de vida (TTL) para las variables de estado. Esto permite a los usuarios definir políticas de expiración, asegurando que los datos de estado antiguos se eliminen automáticamente sin requerir limpieza manual.

Encadenamiento de Operadores Después de transformWithState

Con esta nueva API, los operadores con estado ahora se pueden encadenar después de transformWithState, incluso cuando se utiliza el tiempo de evento como modo de tiempo. Al hacer referencia explícita a columnas de tiempo de evento en el esquema de salida, los operadores posteriores pueden realizar filtrado de registros tardíos y desalojo de estado sin problemas, eliminando la necesidad de soluciones alternativas complejas que involucren múltiples canalizaciones y almacenamiento externo.

Inicialización Simplificada del Estado

Los usuarios pueden inicializar el estado a partir de consultas existentes, lo que facilita el reinicio o la clonación de trabajos de streaming. La API permite una integración fluida con el lector de fuentes de datos de estado, lo que permite a las nuevas consultas aprovechar el estado escrito previamente sin procesos de migración complejos.

Evolución de Esquemas para Consultas con Estado

transformWithState admite la evolución de esquemas, lo que permite cambios como:

  • Añadir o eliminar campos
  • Reordenar campos
  • Actualizar tipos de datos

Apache Spark detecta y aplica automáticamente actualizaciones de esquemas compatibles, asegurando que las consultas puedan continuar ejecutándose dentro del mismo directorio de puntos de control. Esto elimina la necesidad de reconstrucciones completas del estado y reprocesamiento, reduciendo significativamente el tiempo de inactividad y la complejidad operativa.

Integración Nativa con el Lector de Fuentes de Datos de Estado

Para facilitar la depuración y la observabilidad, transformWithState se integra de forma nativa con el lector de origen de datos de estado. Los usuarios pueden inspeccionar las variables de estado y consultar los datos de estado directamente, lo que agiliza la resolución de problemas y el análisis, incluidas funciones avanzadas como readChangeFeed, etc.

Disponibilidad

La API transformWithState ya está disponible con la versión 16.2 de Databricks Runtime en clústeres dedicados sin aislamiento y con Unity Catalog. Próximamente se añadirá compatibilidad con clústeres estándar de Unity Catalog y cómputo sin servidor. La API también está programada para estar disponible en código abierto con la versión 4.0 de Apache Spark™.

Conclusión

Creemos que todas las mejoras de funciones incluidas en la nueva API transformWithState permitirán crear una nueva clase de cargas de trabajo operativas fiables, escalables y críticas para la misión que impulsarán los casos de uso más importantes para nuestros clientes y usuarios, todo ello dentro de la comodidad y facilidad de uso de las API de Apache Spark DataFrame. Es importante destacar que estos cambios también sientan las bases para futuras mejoras en los operadores con estado integrados y nuevos en Apache Spark Structured Streaming. Estamos entusiasmados con las mejoras en la gestión de estado en Apache Spark™ Structured Streaming en los últimos años y esperamos las evoluciones planificadas en la hoja de ruta en esta área en un futuro próximo.

Puede leer más sobre el procesamiento de flujos con estado y transformWithState en Databricks aquí.

(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original

No te pierdas ninguna publicación de Databricks.

Suscríbete a nuestro blog y recibe las últimas publicaciones en tu bandeja de entrada.