亚马逊MapReduce使用我自己的流媒体减速器

时间:2014-10-26 23:26:22

标签: python amazon-web-services mapreduce

我写了一个简单的地图并在python中减少程序来计算每个句子的数字,然后将相同的数字组合在一起。即假设句子1有10个单词,句子2有17个单词,句子3有10个单词。最终结果将是:

10 \t  2
17 \t  1

映射器功能是:

    import sys
    import re

    pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*")
    for line in sys.stdin:

        word = str(len(line.split()))  # calculate how many words for each line
        count = str(1)
        print "%s\t%s" % (word, count)

reducer功能是:

    import sys


    current_word = None
    current_count = 0
    word = None

    for line in sys.stdin:
        line = line.strip()
        word, count = line.split('\t')
        try:
            count = int(count)
            word = int(word)
        except ValueError:
            continue
        if current_word == word:
            current_count += count
        else:
            if current_word:
                print "%s\t%s" % (current_word, current_count)
            current_count = count
            current_word = word

    if current_word == word:
        print "%s\t%s" %(current_word, current_count)

我在本地计算机上测试了文件的前200行:      head -n 200 sentences.txt | python mapper.py |排序| python reducer.py 结果是正确的。然后我使用了Amazon MapReduce流服务,它在reducer步骤失败了。所以我将mapper函数中的print更改为:

   print "LongValueSum" + word + "\t" + "1"

这适用于mapreduce流服务中的默认聚合。在这种情况下,我不需要reducer.py函数。我从大文件sentence.txt得到最终结果。但我不知道为什么我的reducer.py函数失败了。谢谢!

1 个答案:

答案 0 :(得分:1)

知道了!一个“愚蠢”的错误。当我测试它时,我使用类似python mapper.py的东西。但对于mapreduce,我需要让它可执行。所以只需添加

    # !/usr/bin/env python 

一开始。