Hola a todos, soy Cai Shunfeng, ingeniero de datos sénior en WhaleOps y miembro del comité de gestión de proyectos de la comunidad Apache DolphinScheduler. Hoy explicaré cómo funciona la tarea Worker de Apache DolphinScheduler.
Esta explicación se dividirá en tres secciones:
Apache DolphinScheduler es un sistema de programación de flujo de trabajo visual, distribuido y de código abierto, fácilmente extensible, adecuado para escenarios de nivel empresarial.
Proporciona las siguientes funcionalidades clave, ofreciendo una solución de procesamiento de datos de ciclo de vida completo para flujos de trabajo y tareas a través de operaciones visuales.
Fácil de usar
Operaciones DAG visuales: los usuarios pueden arrastrar y soltar componentes en la página para organizarlos en un DAG (gráfico acíclico dirigido).
Sistema de complementos: incluye complementos de tareas, complementos de fuentes de datos, complementos de alerta, complementos de almacenamiento, complementos de centro de registro y complementos de trabajos cron, etc. Los usuarios pueden ampliar fácilmente los complementos según sea necesario para satisfacer sus requisitos comerciales.
Escenarios de uso enriquecido
Configuración estática: incluye programación de flujo de trabajo, operaciones en línea y fuera de línea, gestión de versiones y funciones de reposición.
Operaciones en tiempo de ejecución: proporciona funcionalidades como pausar, detener, reanudar y sustitución de parámetros.
Tipos de dependencia: admite un amplio conjunto de opciones y estrategias de dependencia, adaptándose a más escenarios.
Paso de parámetros: admite parámetros de inicio a nivel de flujo de trabajo, parámetros globales, parámetros locales a nivel de tarea y paso de parámetros dinámicos.
Alta confiabilidad
Diseño descentralizado: todos los servicios no tienen estado y pueden escalarse horizontalmente para aumentar el rendimiento del sistema.
Protección contra sobrecarga y tolerancia a fallos de instancia:
Protección contra sobrecarga: durante la operación, el maestro y el trabajador monitorean su propio uso de CPU y memoria, así como el volumen de tareas. Si se sobrecargan, pausan el flujo de trabajo o el procesamiento de tareas actuales y lo reanudan después de la recuperación.
Tolerancia a fallas de instancia: cuando los nodos maestros o de trabajo fallan, el centro de registro detecta que el nodo de servicio está fuera de línea y realiza tolerancia a fallas para instancias de flujo de trabajo o tareas, lo que garantiza la capacidad de autorrecuperación del sistema tanto como sea posible.
A continuación, presentamos el contexto general del diseño. A continuación, se muestra el diagrama de la arquitectura de diseño que se proporciona en el sitio web oficial.
Desde el diagrama de arquitectura, podemos ver que Apache DolphinScheduler se compone de varios componentes principales:
Componente API: El servicio API administra principalmente metadatos, interactúa con la UI a través del servicio API o llama a interfaces API para crear tareas de flujo de trabajo y diversos recursos necesarios para el flujo de trabajo.
Componente maestro: el maestro es el controlador de las instancias de flujo de trabajo, responsable de consumir comandos, convertirlos en instancias de flujo de trabajo, realizar la división de DAG, enviar tareas en orden y distribuir tareas a los trabajadores.
Componente de trabajador: el trabajador es el ejecutor de tareas específicas. Después de recibir tareas, las procesa según diferentes tipos de tareas, interactúa con el maestro e informa el estado de la tarea. Cabe destacar que el servicio de trabajador no interactúa con la base de datos; solo los servicios API, maestro y de alerta interactúan con la base de datos.
Servicio de alerta: el servicio de alerta envía alertas a través de diferentes complementos de alerta. Estos servicios se registran en el centro de registro y el maestro y el trabajador informan periódicamente los latidos y el estado actual para garantizar que puedan recibir tareas con normalidad.
El proceso de interacción entre el patrón y el trabajador es el siguiente:
Envío de tareas: una vez que el maestro completa la división de DAG, envía tareas a la base de datos y selecciona un grupo de trabajadores apropiado para distribuir tareas según diferentes estrategias de distribución.
Recepción de la tarea: después de que el trabajador recibe una tarea, decide si la acepta en función de su condición. Se le proporciona retroalimentación sobre si la aceptación es exitosa o no.
Ejecución de la tarea: el trabajador procesa la tarea, actualiza el estado a "en ejecución" y envía la información al maestro. El maestro actualiza el estado de la tarea y la información de la hora de inicio en la base de datos.
Finalización de la tarea: una vez finalizada la tarea, el trabajador envía una notificación de evento de finalización al maestro, y este devuelve una confirmación ACK. Si no se recibe ninguna confirmación ACK, el trabajador volverá a intentarlo para asegurarse de que no se pierda el evento de la tarea.
Cuando el trabajador recibe una tarea, se realizan las siguientes operaciones:
El trabajador verifica si está sobrecargado y, en caso afirmativo, rechaza la tarea. Después de recibir la retroalimentación de falla en la distribución de tareas, el maestro continúa eligiendo otro trabajador para la distribución de tareas según la estrategia de distribución.
El proceso de ejecución específico de las tareas del trabajador incluye los siguientes pasos:
A continuación, detallaremos el proceso específico de ejecución de la tarea.
Antes de que comience la ejecución de la tarea, primero se inicializa un contexto. En este punto, se establece la hora de inicio de la tarea. Para garantizar la precisión de la tarea, es necesario sincronizar la hora entre el maestro y el trabajador para evitar desfases de tiempo.
Posteriormente, el estado de la tarea se establece en ejecución y se envía al maestro para notificar que la tarea ha comenzado a ejecutarse.
Dado que la mayoría de las tareas se ejecutan en el sistema operativo Linux, se requiere procesamiento de archivos e inquilinos:
Después de procesar el inquilino, el trabajador crea el directorio de ejecución específico. El directorio raíz del directorio de ejecución es configurable y requiere la autorización correspondiente. De manera predeterminada, los permisos del directorio están configurados en 755.
Durante la ejecución de la tarea, es posible que se necesiten varios archivos de recursos, como la obtención de archivos de clústeres de AWS S3 o HDFS. El sistema descarga estos archivos en el directorio temporal del trabajador para su uso posterior en tareas.
En Apache DolphinScheduler, las variables de parámetros se pueden reemplazar. Las categorías principales incluyen:
Mediante los pasos anteriores, el entorno de ejecución de la tarea y los recursos necesarios están listos, y la tarea puede comenzar oficialmente a ejecutarse.
En Apache DolphinScheduler se admiten varios tipos de tareas, cada una aplicable a diferentes escenarios y requisitos. A continuación, presentamos varios tipos de tareas principales y sus componentes específicos.
Estos componentes se utilizan comúnmente para ejecutar archivos de script, adecuados para varios lenguajes y protocolos de script:
La versión comercial (WhaleScheduler) también admite la ejecución de aplicaciones Java mediante la ejecución de paquetes JAR.
Estos componentes se utilizan para implementar el control lógico y la gestión del flujo de trabajo:
Estos componentes se utilizan principalmente para el procesamiento y análisis de grandes volúmenes de datos:
Estos componentes se utilizan para ejecutar tareas en un entorno de contenedor:
Se utiliza para garantizar la calidad de los datos:
Estos componentes se utilizan para interactuar con entornos de ciencia de datos y aprendizaje automático:
Estos componentes se utilizan para la gestión y ejecución de tareas de aprendizaje automático:
En general, Apache DolphinScheduler admite entre tres y cuatro docenas de componentes que abarcan áreas que van desde la ejecución de scripts y el procesamiento de big data hasta el aprendizaje automático. Para obtener más información, visite el sitio web oficial para ver la documentación detallada.
En Apache DolphinScheduler, los tipos de tareas se abstraen en múltiples modos de procesamiento para adaptarse a diversos entornos de ejecución y necesidades.
A continuación presentamos en detalle el proceso de abstracción y ejecución de tipos de tareas.
El trabajador es un servicio JVM implementado en un servidor. Para algunos componentes de script (como Shell y Python) y tareas ejecutadas localmente (como Spark Local), iniciarán un proceso independiente para ejecutarse.
En este punto, el trabajador interactúa con estas tareas a través del ID de proceso (PID).
Diferentes fuentes de datos pueden requerir diferentes adaptaciones. Para las tareas de SQL y procedimientos almacenados, hemos abstraído el manejo de diferentes fuentes de datos, como MySQL, PostgreSQL, AWS Redshift, etc. Esta abstracción permite una adaptación y expansión flexibles de diferentes tipos de bases de datos.
Las tareas remotas se refieren a las tareas que se ejecutan en clústeres remotos, como AWS EMR, clústeres SeaTunnel, clústeres Kubernetes, etc. El Worker no ejecuta estas tareas localmente, sino que las envía a los clústeres remotos y monitorea su estado y mensajes. Este modo es especialmente adecuado para entornos de nube donde se requiere escalabilidad.
Recopilación de registros
Los distintos complementos utilizan distintos modos de procesamiento y, por lo tanto, la recopilación de registros varía en consecuencia:
Procesos locales: Se registran registros monitoreando la salida del proceso.
Tareas remotas: los registros se recopilan verificando periódicamente el estado de la tarea y la salida del clúster remoto (por ejemplo, AWS EMR) y registrándolos en los registros de tareas locales.
Sustitución de variable de parámetro
El sistema analiza los registros de tareas para identificar las variables de parámetros que deben reemplazarse dinámicamente. Por ejemplo, la tarea A en el DAG puede generar algunos parámetros de salida que deben pasarse a la tarea B posterior.
Durante este proceso, el sistema lee los registros y sustituye las variables de parámetros según sea necesario.
Recuperando el ID de la tarea
La conservación de estos identificadores de tareas permite realizar más consultas de datos y operaciones de tareas remotas. Por ejemplo, cuando se detiene un flujo de trabajo, se puede llamar a la API de cancelación correspondiente utilizando el identificador de tarea para finalizar la tarea en ejecución.
Manejo de tolerancia a fallas
Después de ejecutar una tarea, se requieren varias acciones de finalización:
Comprobación de finalización de la tarea: el sistema comprobará si es necesario enviar una alerta. Por ejemplo, en el caso de una tarea SQL, si los resultados de la consulta activan una alerta, el sistema interactuará con el servicio de alertas a través de RPC para enviar el mensaje de alerta.
Retroalimentación del evento: el trabajador enviará el evento de finalización de la tarea (evento de finalización) al maestro. El maestro actualiza el estado de la tarea en la base de datos y procede con la transición del estado del DAG.
Limpieza de contexto: el Worker eliminará de la memoria el contexto de tarea que se creó al inicio de la tarea. También limpiará las rutas de archivo generadas durante la ejecución de la tarea. Si está en modo de depuración (modo de desarrollo), estos archivos no se limpiarán, lo que permitirá la resolución de problemas de tareas fallidas.
Mediante estos pasos se completa todo el proceso de ejecución de una instancia de tarea.
Si está interesado en Apache DolphinScheduler y desea contribuir a la comunidad de código abierto, le invitamos a consultar nuestras pautas de contribución.
La comunidad fomenta las contribuciones activas, que incluyen, entre otras:
Los nuevos colaboradores pueden buscar problemas etiquetados como good first issue
en los problemas de GitHub de la comunidad. Estos problemas suelen ser más simples y adecuados para los usuarios que realizan su primera contribución.
En resumen, hemos aprendido sobre el diseño general de Apache DolphinScheduler y el proceso de ejecución detallado de las tareas de Worker.
Espero que este contenido te ayude a comprender y utilizar mejor Apache DolphinScheduler. Si tienes alguna pregunta, no dudes en ponerte en contacto conmigo en la sección de comentarios.