我正在使用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()
答案 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是基于密钥的,因此它不保证值的顺序。