Я сравнил временную производительность следующих двух редукторов для проблемы Word Count. Эти редукторы отличаются тем, пользуются ли они преимуществами сортировки ввода по ключу.
Редуктор 1 (не использует сортируемый ввод):
#!/usr/bin/python
import sys
# maps words to their counts
word2count = {}
for line in sys.stdin:
w = line.strip().split()[0] # this is the word
word2count[w] = (word2count[w] + 1 if word2count.has_key(w)
else 1)
# Write (unsorted) tuples to stdout
for word in word2count.keys():
print '%s\t%s' % (word, word2count[word])
Редуктор 2 (использует отсортированный ввод):
#!/usr/bin/python
import sys
# maps words to their counts
word2count = {}
last = ""
count = 0
for line in sys.stdin:
w = line.strip().split()[0] # this is the word
if w != last and count != 0:
word2count[last] = count
last = w
count = 1
else: count += 1
if last != "": word2count[last] = count
# Write (unsorted) tuples to stdout
for word in word2count.keys():
print '%s\t%s' % (word, word2count[word])
Один и тот же картограф использовался с обоими редукторами:
#!/usr/bin/python
import sys
import string
#--- get all lines from stdin ---
for line in sys.stdin:
#--- to lower case and remove punctuation ---
line = line.lower().translate(None, string.punctuation)
#--- split the line into words ---
words = line.split()
#--- output tuples [word, 1] in tab-delimited format---
for word in words:
print '%s\t%s' % (word, "1")
Я использовал английский перевод "Войны и мира" в качестве входных данных. Разница во времени (процессорное время) редукторов составила около 20%.
Вот командная строка, которую я использовал для измерения времени:
./mapper.py < war_and_peace.txt | sort | time ./reducer.py > /dev/null
Учитывая, что первый редуктор намного проще и что для сортировки входных данных редукторов требуется время (что, вероятно, съедает эти 20%), мой вопрос: почему hadoop sort вводит редукторы ? Существуют ли проблемы, для которых вход сортируемых редукторов является более значительным, чем в Word Count? ( Обратите внимание: Я понимаю, что выходные данные каждого преобразователя должны быть отсортированы, чтобы сбалансировать нагрузку редукторов. Мой вопрос касается мотивации объединения пар ключ-значение, поступающих от различных преобразователей. вместо того, чтобы просто добавлять их.)