Гарантируется ли с помощью MapReduce, что ВСЕ значения с одним и тем же ключом перейдут к одному и тому же редюсеру?

У меня есть проект MapReduce, над которым я работаю (в частности, я использую Python и библиотеку MrJob и планируйте использовать Amazon EMR). Вот пример, чтобы подвести итог моей проблемы:

У меня есть тысячи ГБ json-файлов, полных данных о клиентах. Мне нужно запускать ежедневные, еженедельные и ежемесячные отчеты по каждой строке/вводу/объекту json клиента.

Итак, для шага карты, который я сейчас делаю:

map_step(_, customer_json_object)
    c_uuid = customer_json_object.uuid
    if customer_json_object.time is in daily_time_range:
        yield "%s-%s" % (DAILY_CONSTANT, c_uuid), customer_json_object
    if customer_json_object.time is in weekly_time_range:
        yield "%s-%s" % (WEEKLY_CONSTANT, c_uuid), customer_json_object
    if customer_json_object.time is in monthly_time_range:
        yield "%s-%s" % (MONTHLY_CONSTANT, c_uuid), customer_json_object

А потом для редуктора

reducer_step(key, customer_info)
    report_type, c_uuid = key.split("-")
    yield None, Create_Report(report_type, customer_info)

Мой вопрос:

Гарантированно ли мне здесь, что все мои данные с одним и тем же ключом (имеются в виду все данные для конкретного клиента и определенного типа отчета) будут обрабатываться одним и тем же редюсером? Мой Create_Report не может быть распределен между несколькими процессами, и поэтому мне нужно, чтобы все данные, необходимые для отчета, обрабатывались одним процессом.

Меня беспокоит, что если для ключа слишком много значений, то они могут быть распределены между редюсерами или чем-то еще. Однако из того, что я читал, звучит так, как это работает.

Большое спасибо!! Я только что понял, что мне нужно несколько раз выйти из шага карты, так что это последняя часть головоломки для меня. Если это удастся выяснить, это будет огромная победа, поскольку я не могу масштабировать свой маленький сервер дальше по вертикали...

Если это не ясно из приведенного выше кода, у меня есть тысячи файлов json-строк данных о клиентах (или на самом деле о пользователях, никто мне ничего не платит). Я хочу иметь возможность создавать отчеты для этих данных, и код отчета генерируется по-разному в зависимости от того, ежемесячно, еженедельно или ежедневно. На самом деле я также дедуплицирую данные перед этим, но это мой последний шаг, фактически производящий вывод. Я очень ценю, что вы нашли время, чтобы прочитать это и помочь!!


person Brad Barrows    schedule 17.02.2015    source источник
comment
Не читал весь материал, но из темы, Используйте разделитель, чтобы гарантировать это.   -  person SMA    schedule 17.02.2015


Ответы (1)


В MapReduce в целом и в библиотеке Phyton MrJob применяется следующее:

Редуктор принимает ключ и полный набор значений для этого ключа на текущем шаге и возвращает ноль или более произвольных пар (ключ, значение) в качестве выходных данных.

из: документации MrJob — https://pythonhosted.org/mrjob/guides/concepts.html#mapreduce-and-apache-hadoop

Итак, вернемся к вашему вопросу:

Гарантированно ли мне здесь, что все мои данные с одним и тем же ключом... будут обрабатываться одним и тем же редуктором?

Да, кроме того, все ваши значения, принадлежащие одному и тому же ключу, передаются одному и тому же вызову вашего редуктора.

person Martin Grimmer    schedule 17.02.2015
comment
Большое спасибо! Я видел этот комментарий повсюду, как только начал перечитывать карту, но мне было трудно поверить в это, потому что эта простая недостающая часть (мне не хватало этого факта) не позволяла мне так долго работать над моим проектом. Большое вам спасибо. много! - person Brad Barrows; 17.02.2015
comment
Итак, что вы добавляете сюда с тем же вызовом вашего редуктора. это не только тот же редуктор, но и тот же вызов метода, который получает все значения для ключа правильно? Таким образом, каждый редуктор не обязательно должен быть для какого-то одного конкретного типа отчета для клиента (что является моим ключом), они могут создавать все разные типы отчетов для клиента? - person Brad Barrows; 18.02.2015
comment
Один редюсер может обрабатывать несколько ключей (и, следовательно, вызовы reduce), чтобы избежать накладных расходов на создание слишком большого количества редьюсеров, но по умолчанию ключи распределяются по редюсерам по хэшу ключа, поэтому мало что значит для подбора списка ключи, которые обрабатывает редуктор. - person Jeremy Beard; 18.02.2015