После разговора с моим другом из Google я хотел бы реализовать какую-то модель Job/Worker для обновления моего набора данных.
Этот набор данных отражает данные сторонних служб, поэтому для выполнения обновления мне нужно сделать несколько удаленных вызовов в их API. Я думаю, что много времени будет потрачено на ожидание ответов от этого стороннего сервиса. Я хотел бы ускорить работу и лучше использовать свои вычислительные часы, распараллеливая эти запросы и удерживая многие из них открытыми сразу, так как они ждут своих индивидуальных ответов.
Прежде чем я объясню свой конкретный набор данных и попаду в проблему, я хотел бы уточнить, какие ответы я ищу:
- Это поток, который хорошо подходит для распараллеливания с MapReduce?
- Если да, будет ли это экономически выгодно работать на модуле MapAddirect Amazon, который оплачивается по часам и в течение часа после завершения задания? (Я не уверен точно, что считается "Job", поэтому я точно не знаю, как мне будет выставлен счет)
- Если нет, есть ли другая система/шаблон, который я должен использовать? и Есть ли библиотека, которая поможет мне сделать это в python (на AWS, usign EC2 + EBS)?
- Есть ли проблемы, которые вы видите, с тем, как я разработал этот поток работы?
Хорошо, теперь на детали:
Набор данных состоит из пользователей, у которых есть любимые предметы и которые следуют за другими пользователями. Цель состоит в том, чтобы иметь возможность обновлять каждую пользовательскую очередь - список элементов, которые пользователь увидит при загрузке страницы, на основе избранных элементов пользователей, которых она следует. Но, прежде чем я смогу переломить данные и обновить очередь пользователей, мне нужно убедиться, что у меня есть самые современные данные, в которые входят вызовы API.
Есть два вызова, которые я могу сделать:
- Получить следующих пользователей - что возвращает всех пользователей, за которыми следует запрашиваемый пользователь, и
- Получить избранные элементы - возвращает все любимые элементы запрашиваемого пользователя.
После того, как я позвоню, следуйте за пользователями для обновляемого пользователя, мне нужно обновить любимые элементы для каждого пользователя. Только после того, как все избранные будут возвращены для всех пользователей, которых следует следовать, я могу начать обработку очереди для этого оригинального пользователя. Этот поток выглядит следующим образом:
Работа в этом потоке включает:
- Начать обновление очереди для пользователя - начать процесс, извлекая пользователей, за которыми следует обновляемый пользователь, сохраняя их, а затем создавая задания "Избранное" для каждого пользователя.
- Получить Избранное для пользователя - запрашивает и сохраняет список избранных для указанного пользователя из сторонней службы.
- Вычислить новую очередь для пользователя - обрабатывает новую очередь, теперь, когда все данные были извлечены, а затем сохраняет результаты в кеше, который используется прикладным уровнем.
Итак, опять мои вопросы:
- Это поток, который хорошо подходит для распараллеливания с MapReduce? Я не знаю, разрешит ли я запустить процесс для UserX, получить все связанные данные и вернуться к обработке очереди UserX только после этого.
- Если да, будет ли это экономически выгодно работать на модуле MapAddirect Amazon, который оплачивается по часам и в течение часа после завершения задания? Есть ли ограничение на количество "потоков", которые я могу ожидать от открытых запросов API, если я использую их модуль?
- Если нет, есть ли другая система/шаблон, который я должен использовать? и Есть ли библиотека, которая поможет мне сделать это в python (на AWS, usign EC2 + EBS?)?
- Есть ли проблемы, которые вы видите, с тем, как я разработал этот поток работы?
Спасибо за чтение, я с нетерпением жду обсуждения с вами.
Изменить, в ответ на JimR:
Спасибо за солидный ответ. В моем чтении, так как я написал исходный вопрос, я отступил от использования MapReduce. Я еще не решил точно, как я хочу это сделать, но я начинаю чувствовать, что MapReduce лучше распространяет/распараллеливает вычислительную нагрузку, когда я действительно просто ищу, чтобы распараллелить HTTP-запросы.
Какова была бы моя задача "уменьшить", часть, которая берет все извлеченные данные и сует ее в результаты, не является интенсивной с вычислительной точки зрения. Я уверен, что это закончится тем, что это один большой SQL-запрос, который выполняется на секунду или два на пользователя.
Итак, к чему я склоняюсь:
- Не-MapReduce Работа/Рабочиймодель, написанная на Python. Один мой друг Google превратил меня в изучение Python для этого, так как он низко накладные и хорошо масштабируется.
- Использование Amazon EC2 в качестве вычислительного уровня. Я думаю, это означает, что мне также нужен кусок EBS для хранения моей базы данных.
- Возможно, с помощью простой очереди сообщений Amazon Simple Message. Похоже, что этот 3-й виджет Amazon предназначен для отслеживания очередей заданий, перемещения результатов из одной задачи во входные данные другого и изящного решения неудачных задач. Это очень дешево. Возможно, стоит реализовать вместо собственной системы очереди заданий.