为什么使用Reduce输出记录减少输入记录?

时间:2015-11-13 06:16:42

标签: hadoop reduce records mapper

我尝试在图书馆dumbo中使用python中的mapreducer。 下面是我的实验测试代码,我希望我能收到从mapper到reducer输出的所有记录。

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)

以下是Map-Reduce Framework的日志。 我希望"减少输入记录"等于"减少输出记录" ,但事实并非如此。 我的测试代码有什么问题,或者我误解了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

修改reducer时可以正常工作:

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 个答案:

答案 0 :(得分:1)

  

我希望"减少输入记录"等于"减少输出记录" ,但事实并非如此。

我不确定你为什么期待这个。 reducer的重点是它一次接收一组值(基于映射器发出的键);并且您的reducer只为每个组发出一条记录(yield myword, 1)。所以你的减少输入记录的唯一方法是#34;将等于你的"减少输出记录"如果每个组只包含一个记录 - 也就是说,如果每个值中的前两个字段在您的记录集中是唯一的,那就相同了。由于情况显然不是这样,因此减速机发出的记录少于收到的记录。

(事实上,这是通常的模式;它是" reducer"被称为的原因。这个名字来自于' reduce'在函数式语言中,这会将值集合减少为单个值。)