Después de hablar con un amigo mío de Google, me gustaría implementar algún tipo de modelo de trabajo/trabajador para actualizar mi conjunto de datos.¿Debo aprender/usar MapReduce, o algún otro tipo de paralelización para esta tarea?
Este conjunto de datos refleja los datos de un servicio de terceros, por lo tanto, para hacer la actualización, debo hacer varias llamadas remotas a su API. Creo que se pasará mucho tiempo esperando respuestas de este servicio de terceros. Me gustaría acelerar las cosas, y hacer un mejor uso de mis horas de cómputo, paralelizando estas solicitudes y manteniendo muchas de ellas abiertas a la vez, mientras esperan sus respuestas individuales.
Antes de explicar mi conjunto de datos específico y entrar en el problema, me gustaría aclarar qué respuestas Busco:
- Es este un flujo que se adapta bien a la paralelización con MapReduce?
- Si sí, ¿sería rentable ejecutar en el módulo mapreduce de Amazon, que factura por hora, y redondea la hora cuando el trabajo está completo? (No estoy seguro de qué es exactamente como un "Trabajo", así que no sé exactamente cómo se me cobrará)
- Si no, ¿Hay algún otro sistema/patrón que deba usar? y ¿Hay alguna biblioteca que me ayude a hacer esto en python (en AWS, use EC2 + EBS)?
- ¿Hay algún problema que vea con la forma en que diseñé este flujo de trabajo?
Ok, ahora en los detalles:
El conjunto de datos consta de los usuarios que tienen los elementos favoritos y que siguen a otros usuarios. El objetivo es poder actualizar la cola de cada usuario: la lista de elementos que el usuario verá cuando carguen la página, en función de los elementos favoritos de los usuarios que ella sigue. Pero, antes de poder analizar los datos y actualizar la cola de un usuario, necesito asegurarme de tener la información más actualizada, que es donde entran las llamadas API.
Hay dos llamadas que puedo hacer :
- conseguir que los usuarios seguido - que devuelve todos los usuarios que están siendo seguidos por el usuario solicita, y
- obtener los elementos favoritos - que devuelve todos los elementos favoritos del usuario solicitado.
Después llamo get seguido usuarios para el usuario se actualiza, es necesario que actualice los elementos favoritos de cada usuario está siguiendo. Solo cuando se devuelven todos los favoritos para todos los usuarios que se están siguiendo puedo comenzar a procesar la cola para ese usuario original. Este flujo se parece a:
Trabajo en este flujo incluyen:
- iniciar la actualización de cola para el usuario - arranca el proceso por ir a buscar los usuarios, seguido por el usuario se actualiza constantemente, almacenándolos, y luego creando Obtiene trabajos de Favoritos para cada usuario.
- Obtener Favoritos para el usuario - Solicita, y almacena, una lista de favoritos para el usuario especificado, del servicio de terceros.
- Calcular nueva cola para el usuario - Procesa una nueva cola, ahora que se han recuperado todos los datos, y luego almacena los resultados en una memoria caché utilizada por la capa de aplicación.
Así, de nuevo, mis preguntas son:
- Es este un flujo que se adapta bien a la paralelización con MapReduce? No sé si me permitiría comenzar el proceso para UserX, buscar todos los datos relacionados y volver al procesamiento de la cola de UserX solo cuando todo haya terminado.
- Si sí, ¿sería rentable ejecutar en el módulo mapreduce de Amazon, que factura por hora, y redondea la hora cuando el trabajo está completo? ¿Hay un límite en la cantidad de "hilos" que puedo esperar para las solicitudes API abiertas si utilizo su módulo?
- Si no, ¿Hay algún otro sistema/patrón que deba usar? y ¿Hay alguna biblioteca que me ayude a hacer esto en python (en AWS, use EC2 + EBS?)?
- ¿Hay algún problema que vea con la forma en que diseñé este flujo de trabajo?
Gracias por leer, espero poder hablar con todos ustedes.
Editar, en respuesta a JimR:
Gracias por una respuesta sólida. En mis lecturas desde que escribí la pregunta original, me he alejado de usar MapReduce. Todavía no he decidido con certeza cómo quiero construir esto, pero estoy empezando a sentir que MapReduce es mejor para distribuir/paralelizar la carga de cómputo cuando realmente estoy buscando paralelizar las solicitudes HTTP.
Lo que habría sido mi tarea de "reducir", la parte que toma todos los datos obtenidos y los comprime en resultados, no es tan intensivo desde el punto de vista informático. Estoy bastante seguro de que terminará siendo una gran consulta SQL que se ejecuta por uno o dos segundos por usuario.
Por lo tanto, lo que yo estoy inclinando hacia es:
- Un no-MapReduce de empleo/trabajador modelo, escrito en Python . Un amigo mío en Google me enseñó a aprender Python para esto, ya que es muy bajo y se escala bien.
- Uso de Amazon EC2 como capa de cálculo. Creo que esto significa que también necesito un segmento de EBS para almacenar mi base de datos.
- Posiblemente utilizando la cola de mensajes simple de Amazon thingy. Parece que este tercer widget de amazon está diseñado para realizar un seguimiento de las colas de trabajos, mover los resultados de una tarea a las entradas de otra y gestionar con elegancia las tareas fallidas. Es muy barato. Puede valer la pena implementarlo en lugar de un sistema personalizado de cola de trabajos.
He utilizado el motor de aplicaciones de Google para solicitudes altamente paralelas y manejo casi en tiempo real de este tipo de problema. MapReduce tuvo una sobrecarga de ciclo de trabajo y arranque mucho mayor de lo que yo estaba buscando. – kevpie
Interesante. Sé que el motor de aplicaciones puede usar Python, que es lo que he estado buscando para escribir estos trabajos, pero no tengo claro de qué otra manera usaría GAE para esto. No estoy familiarizado con el funcionamiento de GAE, ni con cómo expresar este problema, así que no puedo encontrar mis respuestas. ¿Tienes algún otro recurso que debería investigar aquí? ¡Gracias por el consejo! –
De hecho, escribí un proceso de python que utilizaba los hilos y las colas para hacer solicitudes web paralelas y el procesamiento de datos. Funcionó bien, pero no estaba "completamente versado" en la programación o subprocesos de python, para hacerlo realmente confiable o funcionar bien. Después de mucho googlear, algo de frustración y otras tareas que necesitaban prioridad, abandoné el trabajo. Podría recogerlo de nuevo. Llegué a conclusiones similares sobre el trabajo con MapReduce, ya que no estaría aprovechando nada más que el paralelismo incorporado en hadoop. De todos modos, si quieres chatear más sobre enfoques y soluciones, lmk! –