mapreduce排序和随机播放如何工作?

时间:2013-01-16 08:11:05

标签: hadoop mapreduce mrjob

我正在使用yelps MRJob库来实现map-reduce功能。我知道map reduce有一个内部排序和shuffle算法,它根据键来对值进行排序。所以,如果我在地图阶段后有以下结果

(1, 24) (4, 25) (3, 26)

我知道排序和随机播放阶段会产生以下输出

(1, 24) (3, 26) (4, 25)

这是预期的

但是如果我有两个相似的键和不同的值,为什么sort和shuffle阶段会根据出现的第一个值对数据进行排序?

例如 如果我有来自mapper的以下值列表

(2, <25, 26>) (1, <24, 23>) (1, <23, 24>) 

预期输出

(1, <24, 23>) (1, <23, 24>) (2, <25, 26>)

但我得到的输出是

(1, <23, 24>) (1, <24, 23>) (2, <25, 26>)

这个MRjob库是否具体?无论如何都要根据值

来停止这种排序

CODE

from mrjob.job import MRJob
import math

class SortMR(MRJob):



def steps(self):
    return [
        self.mr(mapper=self.rangemr,
                reducer=self.rangesort)]


def rangemr(self, key, line):
    for a in line.split():
        yield 1,a


def rangesort(self,numid,line):
    for a in line:
        yield(1, a)


if __name__ == '__main__':
    SortMR.run()

4 个答案:

答案 0 :(得分:4)

“排序”值的唯一方法是使用复合键,其中包含值本身的一些信息。然后,密钥的compareTo方法可以确保密钥首先由实际密钥组件排序,然后由值组件排序。最后,您需要一个组分区器,以确保在reducer中具有相同“key”组件(实际键)的所有键被认为是相等的,并且在一次调用reduce方法时迭代关联的值。

这称为“辅助排序”,此question similar提供了一些示例链接。

答案 1 :(得分:3)

本地MRjob只在mapper输出上使用操作系统'sort'。

映射器以以下格式写出:

键&lt; -tab-&gt; value \ n

因此,您最终得到的键主要按键排序,其次是按值排序。

如上所述,这不会发生在真正的hadoop版本中,只是“本地”模拟。

答案 2 :(得分:0)

排序和; shuffle阶段不保证reducer为给定键获取的值的顺序。

答案 3 :(得分:0)

排序in hadoop是基于密钥的,因此它不保证值的顺序。