我对hadoop框架和map-reduce抽象比较陌生。
基本上,我想在一个巨大的文本文件(以“,”分隔)中找到最小的数字
这是我的代码Map器.py
# !/usr/bin/env python
import sys
# input comes from STDIN (standard input)
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
numbers = line.split(",")
# increase counters
for number in numbers:
# write the results to STDOUT (standard output);
# what we output here will be the input for the
# Reduce step, i.e. the input for reducer.py
#
# tab-delimited; the trivial word count is 1
print '%s\t%s' % (number, 1)
减速机
# !/usr/bin/env python
from operator import itemgetter
import sys
smallest_number = sys.float_info.max
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# parse the input we got from mapper.py
number, count = line.split('\t', 1)
try:
number = float(number)
except ValueError:
continue
if number < smallest_number:
smallest_number = number
print smallest_number <---- i think the error is here... there is no key value thingy
print smallest_number
我得到的错误是:
12/10/04 12:07:22 ERROR streaming.StreamJob: Job not successful. Error: NA
12/10/04 12:07:22 INFO streaming.StreamJob: killJob...
Streaming Command Failed!
1条答案
按热度按时间amrnrhlw1#
首先,我想让你注意到,你的解决方案不会工作,除非你只用一个减速机。实际上,如果您使用多个减速机,那么每个减速机将吐出它接收到的最小数字,并且您将得到多个数字。但是下一个问题是,如果我必须只使用一个reducer来解决这个问题(即,只使用一个任务),那么使用mapreduce会有什么好处呢?这里的技巧是Map器将并行运行。另一方面,您不希望Map器输出读取的每个数字,否则,一个缩减器将不得不查看整个数据,这与顺序解决方案相比没有任何改进。解决这个问题的方法是让每个Map器只输出它读取的最小数字。此外,由于希望所有Map器输出都转到同一个缩减器,因此Map器输出键在所有Map器上必须相同。
Map器将如下所示:
减速器:
还有其他可能的方法来解决这个问题,例如使用mapreduce框架本身对数字进行排序,以便reducer接收到的第一个数字是最小的。如果你想了解更多的mapreduce编程范例,你可以从我的博客上阅读这个带有示例的教程。