Necesito procesar miles de archivos almacenados en un depósito S3. Mi idea era activar un montón de EC2 VMS (96 núcleos cada uno) y hacer que se comunicaran con una base de datos MySQL a través de Python para obtener 96 rutas S3 a los archivos que necesita procesar. También quiero registrar si está en progreso o ha sido procesado con una columna EN_PROGRESO Y PROCESADO establecida en 0 o 1. Tengo la declaración actual, el problema con el que me encuentro es que actualiza el valor EN_PROGRESO, pero no estoy seguro de cómo seleccionar/devolver los 96 nombres de archivo necesarios para procesar. No puedo ejecutar SELECT * FROM temp, después de ejecutar la actualización devuelve un error.
UPDATE dev_gba.`dev-l1c` as dev SET dev.IN_PROGRESS = 1 WHERE dev.`index` in (SELECT * FROM (SELECT `index` FROM dev_gba.`dev-l1c` WHERE IN_PROGRESS =0 AND PROCESSED =0 ORDER BY RAND() LIMIT 96) temp );Mi otra idea era obtener la identificación de la instancia EC2 usando python, actualizar una columna INSTANCE_ID y luego usar otra declaración para obtener las filas con esa identificación de instancia específica. El otro desafío que parece que no puedo resolver es evitar que otras instancias seleccionen las mismas filas. Si tengo 10 instancias que consultan la base de datos al mismo tiempo para 96 filas aleatorias, me preocupa que pueda haber alguna superposición. Mi pensamiento para resolver esto fue agregar un tiempo de espera aleatorio en mi secuencia de comandos de python.
Su pregunta no es muy clara acerca de dónde obtiene estas instancias, así que supongo un poco.
Pruebe un SQL como este para evitar condiciones de carrera. Asegúrese de utilizar el motor de almacenamiento InnoDB de MySQL; MyISAM y AriaDB no admiten transacciones.
START TRANSACTION; /* get the indexes to process */ CREATE TEMPORARY TABLE to_process SELECT index FROM dev_gba.`dev-l1c` WHERE IN_PROGRESS = 0 AND PROCESSED =0 ORDER BY RAND() LIMIT 96; /* do your update */ UPDATE dev_gba.`dev-l1c` SET IN_PROGRESS = 1 WHERE index IN (SELECT index FROM to_process); /* retrieve the items to process */ SELECT * FROM dev_gba.`dev-l1c` WHERE index IN (SELECT index FROM to_process); /* get rid of the temp table */ DROP TABLE to_process; /* end the transaction */ COMMIT;Algo a tener en cuenta: las máquinas virtuales de AWS suelen estar vinculadas a la E/S y la red. Puede obtener un mejor rendimiento mediante el uso de instancias más pequeñas y considerablemente más baratas, y utilizando menos simultaneidad por instancia. Además, hay mucho trabajo de sistema operativo que hacer cuando se realizan muchas operaciones simultáneas de archivos o de red. Deje al menos un núcleo o dos para ese trabajo.