2015-11-13 4 views
0

Я пытаюсь использовать mapreducer в python с библиотекой dumbo. Ниже приведен мой тестовый код для эксперимента, и я надеюсь, что смогу получить всю запись от картографа до выхода редуктора.Зачем уменьшать входные записи с уменьшением записей вывода?

def mapper(key, value): 
    fields = value.split("\t");  
    myword = fields[0] + "\t" + fields[1] 
    yield myword, value 

def reducer(key, values): 
    for value in values: 
     mypid = value 
     words = value.split("\t") 
    global count 
    count = count + 1 
    myword = str(count) + "--" + words[1] ##to count total lines in recuder's output records 
    yield myword, 1 

if __name__ == "__main__": 
    dumbo.run(mapper, reducer) 

Ниже приведен журнал структуры сокращения картов. Я ожидаю, что «Уменьшить входные записи» равны «Уменьшить выходные записи», но это не так. Что случилось с моим кодом тестирования или я неправильно понял что-то в mapreducer? спасибо.

Map-Reduce Framework 
      Map input records=405057 
      Map output records=405057 
      Map output bytes=107178919 
      Map output materialized bytes=108467155 
      Input split bytes=2496 
      Combine input records=0 
      Combine output records=0 
      Reduce input groups=63096 
      Reduce shuffle bytes=108467155 
      Reduce input records=405057 
      Reduce output records=63096 
      Spilled Records=810114 

это работа при модификации редуктора, как показано ниже:

def reducer(key, values): 
    global count 
    for value in values: 
     mypid = value 
     words = value.split("\t") 

     count = count + 1 
     myword = str(count) + "--" + words[1] ##to count total lines in recuder's output records 
     yield myword, 1 

ответ

1

Я ожидаю, что "Reduce входных записей" равно "Reduce выходных записей", но это не так.

Я не уверен, почему вы ожидаете этого. Вся суть редуктора заключается в том, что он сразу получает группу значений (на основе ключа, испускаемого преобразователем); и ваш редуктор испускает только одну запись для каждой группы (yield myword, 1). Таким образом, единственный способ, которым ваши «Сократить входные записи» будет равняться вашим «Сократить выходные записи», будет таким же: если каждая группа содержит ровно одну запись —, то есть если первые два поля в каждом значении были уникальными в вашем наборе записей. Так как это, по-видимому, не так, ваш редуктор испускает меньше записей, чем получает.

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

+0

спасибо, ruakh, я решаю. – Naturehigh