2015-02-17 4 views
1

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

У меня есть тысячи GB файлов json с данными о клиентах. Мне нужно идти и запускать ежедневные, еженедельные и ежемесячные отчеты о каждом клиенте json line/input/object.

Таким образом, для шага карты я в настоящее время сделать:

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-линий клиента (или действительно пользователи, никто ничего мне не платит). Я хочу иметь возможность создавать отчеты для этих данных, а код отчета генерируется по-разному в зависимости от того, будет ли он ежемесячно, еженедельно или ежедневно. Я на самом деле также дублирую данные до этого, но это мой последний шаг, на самом деле производящий результат. Я очень ценю, что вы нашли время, чтобы прочитать это и помочь!

+0

Havent прочитал все, но из темы, используйте partiotioner, чтобы гарантировать это. – SMA

ответ

3

В MapReduce в целом и в библиотеке Phyton MrJob она применяется, что:

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

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

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

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

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

+0

Большое вам спасибо!Я видел этот комментарий повсюду, как только я начал перечитывать на карте, но мне было трудно поверить, потому что эта простая пропавшая штука (мне не хватает этого факта) помешала мне получить мой проект от работы так долго. Спасибо много! –

+0

Итак, что вы добавляете здесь с «тем же призывом вашего редуктора». заключается в том, что это не только тот же редуктор, но и тот же самый «вызов метода», который получает все значения для ключевого права? Итак, каждый редуктор не должен быть для какого-либо одного конкретного типа отчета для клиента (который является моим ключом), они могут создавать все разные типы отчетов для клиента? –

+0

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