为什么减少输入记录和减少输出记录不同?

stszievb  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

我尝试在python中使用mapreducer和dumbo库。下面是我的实验测试代码,我希望我能收到所有的记录从Map到减速机输出。

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)

下面是MapReduce框架的日志。我期望“减少输入记录”等于“减少输出记录”,但事实并非如此。我的测试代码有什么问题,或者我误解了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
drkbr07n

drkbr07n1#

我期望“减少输入记录”等于“减少输出记录”,但事实并非如此。
我不知道你为什么要这样。reducer的要点是它一次接收一组值(基于Map器发出的键);你的减速机每一组只发出一个记录( yield myword, 1 ). 因此,“减少输入记录”与“减少输出记录”唯一相同的方法是,如果每个组只包含一条记录,也就是说,如果每个值的前两个字段在记录集中是唯一的。因为显然不是这样,所以减速机发出的记录比收到的要少。
(事实上,这是通常的模式;这就是“减速器”被称为“减速器”的原因。名称来自函数式语言中的“reduce”,它将一组值缩减为一个值。)

相关问题