Ejecución de trabajos en paralelo
Aprenda a ejecutar trabajos en IBM Cloud® Code Engine con eficacia operativa.
Procesamiento eficiente de muchos archivos mediante el procesamiento de trabajos
Supongamos que tiene muchos archivos almacenados en un grupo IBM Cloud Object Storage y desea utilizar el proceso por lotes en Code Engine. El objetivo es leer archivos de un grupo, manipular los archivos y almacenar los archivos en un grupo Object Storage diferente de la forma más eficiente. Supongamos que tiene 2000 archivos en el grupo de entrada cada día. Todos los archivos tienen un nombre de archivo diferente y los nombres de archivo empiezan con un carácter alfabético (A-Z, a-z).
A medida que planifica una solución para este escenario, primero piensa en una solución basada en sucesos. En este caso, para cada archivo que se graba en el grupo Object Storage de entrada, se crea un suceso y se llama a una aplicación Code Engine. Utilizando sucesos, un único archivo puede desencadenar un proceso individual, que puede ser ineficiente para muchos archivos.
¿La ejecución de un trabajo por lotes puede ser un enfoque mejor? ¡Sí, puede! Vamos a ver por qué los trabajos por lotes son más adecuados para manejar varios archivos juntos.
-
Determine un método para dividir el conjunto de archivos en secuencias paralelas. Dividamos los archivos basándose en el primer carácter del nombre de archivo. Con este enfoque, puede tener 26 secuencias, con cada secuencia responsable de los archivos que empieza con un carácter específico. Puede identificar una secuencia específica leyendo la variable de entorno
JOB_INDEXinyectada automáticamente de una instancia de trabajo en ejecución. Consulte Variables de entorno inyectadas automáticamente para trabajos. Para este ejemplo, puede configurar las instancias de trabajo especificando el número de instancias como26o los índices de matriz como0-25.A cada instancia de trabajo en ejecución se le asigna un índice de 0 a 25. En el código, utilice el patrón siguiente para distribuir los datos de entrada a las instancias de trabajo.
- la instancia de trabajo con JOB_INDEX=0 funciona en archivos que empiezan por
Aoa - la instancia de trabajo con JOB_INDEX=1 funciona en archivos que empiezan por
Bob - la instancia de trabajo con JOB_INDEX=2 funciona en archivos que empiezan por
Coc - [
D ... y] - la instancia de trabajo con JOB_INDEX=25 funciona en archivos que empiezan por
Zoz
Puesto que cada corriente está procesando varios archivos, defina la longitud de cola de una corriente como el número de archivos procesados por la corriente única.
- la instancia de trabajo con JOB_INDEX=0 funciona en archivos que empiezan por
-
En Code Engine, cree el trabajo y su configuración.
- Especifique los índices de matriz de trabajos como
0-25, que representa las 26 corrientes paralelas. - Especifique los recursos de CPU y memoria para el trabajo, o tome los valores predeterminados. Cada índice de trabajo obtiene los mismos recursos de CPU y memoria que especifique para el trabajo; por ejemplo, 1 vCPU y 4 GB de memoria.
- Especifique los índices de matriz de trabajos como
-
Ejecute el trabajo. En la consola de Code Engine, puede ver el número de índices de trabajo que están pendientes, en ejecución y completados. El trabajo finaliza cuando el último índice de trabajo finaliza su ejecución.
Procesar un subconjunto de datos y asignar dinámicamente el trabajo a instancias de ejecución de trabajos en paralelo
Supongamos que no desea estar limitado a un número específico de instancias paralelas.
En el escenario anterior, se han definido 26 rutas paralelas y las ejecuciones de trabajos que se han enviado se han ejecutado en las 26 rutas paralelas definidas.
Sin embargo, supongamos que no desea estar limitado a un número específico de instancias paralelas y desea ejecutar un trabajo que asigne dinámicamente secuencias de trabajo a una instancia de ejecución de trabajo determinada. En este caso,
puede utilizar las variables de entorno JOB_INDEX y JOB_ARRAY_SIZE para derivar un valor que determine qué secuencia de trabajo se procesa. Estas variables de entorno se inyectan automáticamente para los trabajos.
- La variable de entorno
JOB_INDEXes el valor del índice de una instancia de ejecución de trabajo específica. - La variable de entorno
JOB_ARRAY_SIZEespecifica el número de instancias de trabajo que se van a ejecutar en paralelo. Este valor se especifica directamente como el tamaño de matriz de ejecución del trabajo, o se calcula contando los índices de matriz especificados.
Por ejemplo, supongamos que ha configurado un tamaño de matriz de 10 de forma que desea que cada instancia de ejecución de trabajo funcione en el 10% de los datos globales (10 instancias de ejecución de trabajo ejecutadas en paralelo). Con este
valor de configuración, la variable de entorno JOB_INDEX determina en cuál de los fragmentos de datos del 10% se trabaja y el valor calculado para JOB_ARRAY_SIZE es 10.
Sin embargo, suponga que desea volver a ejecutar 3 de las 10 instancias de ejecución de trabajo iniciales porque anteriormente han fallado. El otro 70% de los datos se han procesado correctamente. Desea especificar los 3 índices anómalos concretos
cuando vuelva a someter la ejecución del trabajo. Supongamos que desea volver a ejecutar los índices 3, 7 y 9.
Para esta nueva ejecución de trabajo, diga que sólo actualiza los índices de matriz; por ejemplo, "3, 7, 9". Puesto que el valor de la variable de entorno JOB_ARRAY_SIZE se calcula automáticamente cuando se
especifican índices de matriz en lugar del tamaño de matriz, el valor de JOB_ARRAY_SIZE es ahora 3 en lugar de 10, puesto que se han especificado 3 índices de matriz.
En su lugar, para asegurarse de que la acción de envío (o reenvío) de la ejecución del trabajo procesa los fragmentos de datos correctos para los índices especificados 3, 7 y 9, puede alterar temporalmente
el valor calculado automáticamente de la variable de entorno JOB_ARRAY_SIZE utilizando la opción --array-size-var-override en la CLI o especificando un valor personalizado en el campo de entrada JOB_ARRAY_SIZE en la consola.
Al establecer el valor de anulación de tamaño de matriz personalizado en 10, las instancias de ejecución de trabajos calculan correctamente el tamaño de trozo como 10% y las instancias de ejecución de trabajos reenviadas procesan los datos que
usted desea (índices 3, 7 y 9). Puede utilizar esta opción para imponer un valor de tamaño de matriz constante para escenarios de reejecución de trabajos, donde sólo se someten o reenvían algunas instancias
de trabajo.
Después de implementar este enfoque de ejecución de trabajos, puede aumentar o disminuir dinámicamente el número de ejecuciones de trabajos paralelos.
A diferencia del método de asignación de la utilización de la variable de entorno JOB_INDEX para definir la relación de secuencia de trabajo de ejecución de trabajo, este método de alteración temporal de la variable de entorno JOB_ARRAY_SIZE para asignar dinámicamente secuencias de trabajo es más flexible y le permite adaptar una ejecución de trabajo determinada para satisfacer sus necesidades.
Ventajas de ejecutar trabajos por lotes paralelos
Este enfoque de la implementación de trabajos por lotes paralelos ofrece ventajas.
-
Inicialización reducida-Debido a que un índice de trabajo procesa archivos con caracteres iniciales similares, sólo se necesita una inicialización o configuración de conexión por índice de trabajo. Este enfoque ahorra recursos y costes cuando se compara con la inicialización individual por archivo. Con la solución de trabajo paralelo, hay 26 inicializaciones en lugar de 2000 inicializaciones.
-
Uso eficiente de recursos-Al dividir la tarea en secuencias de ejecución más largas en paralelo, esta solución utiliza los recursos disponibles de forma más eficiente, mientras que la velocidad de proceso se maximiza.
Consideraciones al planificar trabajos por lotes paralelos
Tenga en cuenta los puntos siguientes cuando planifique soluciones de trabajos por lotes paralelos.
-
Equilibrio de índices de trabajos paralelos y longitud de cola-Es esencial encontrar un buen equilibrio entre el número de secuencias (índices de trabajos paralelos) y la longitud de cola. Muy pocos índices de trabajo no pueden utilizar completamente los recursos disponibles, mientras que demasiados índices pueden aumentar el proceso de inicialización y aumentar la carga en los servicios de nube, como por ejemplo Object Storage. Este efecto puede dar como resultado límites de velocidad cuando llama a otros servicios de nube.
-
Tiempo de proceso de trabajo similar-Cuando planifique la solución, tenga en cuenta que cada índice de trabajo tarda aproximadamente el mismo tiempo en completar su tarea. Evite escenarios en los que un índice de trabajo tarda mucho más que otros, ya que el tiempo de proceso puede provocar ineficiencias en el uso de recursos y aumentar el tiempo de proceso del trabajo.
-
Uso de varios trabajos-Para el escenario anterior, un enfoque diferente es utilizar varios trabajos. Estos trabajos múltiples no se basan en los índices de matriz configurados. En su lugar, considere la posibilidad de crear 2 trabajos por lotes, uno para los archivos que empiezan por
A - Zy otro para los archivos que empiezan pora - z. Sin cambios en el código, puede desencadenar estos 2 trabajos en paralelo o secuencialmente, en función de los requisitos de proceso y la disponibilidad de recursos. -
Mecanismo de desencadenamiento de trabajos: puede optar por desencadenar el trabajo con una suscripción cron a intervalos específicos, o con una aplicación desencadenante que supervise el grupo Object Storage para archivos nuevos e inicie el proceso por lotes según sea necesario. En función de su escenario, puede optimizar el uso de Code Engine para la eficiencia de costes frente al tiempo de respuesta para la rapidez con la que se procesan los archivos después de que se escriban en el grupo.