4

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

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

我知道排序和洗牌阶段会产生以下输出

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

正如预期的那样

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

例如,如果我有以下来自映射器的值列表

(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 库是特定的吗?反正有没有停止这种基于价值的排序?

代码

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

4 回答 4

4

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

这被称为“二级排序”,与此类似的问题提供了一些示例链接。

于 2013-01-16T12:12:32.773 回答
3

本地 MRjob 仅在映射器输出上使用操作系统“排序”。

映射器以以下格式写出:

key<-tab->value\n

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

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

于 2013-01-22T06:38:14.013 回答
0

sort & shuffle 阶段不保证 reducer 为给定键获取的值的顺序。

于 2013-01-16T08:33:08.840 回答
0

hadoop 中的排序是基于键的,因此它不能保证值的顺序。

于 2013-01-16T10:42:42.147 回答