我正在使用 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()