我正在使用yelps mrjob库来实现map reduce功能。我知道map reduce有一个内部排序和洗牌算法,它根据值的键对值进行排序。如果我在Map阶段后有以下结果
(1, 24) (4, 25) (3, 26)
我知道sort和shuffle阶段将产生以下输出
(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>)
这个作业库是特定的吗?是否有任何方法可以停止基于值的排序??
代码
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条答案
按热度按时间i86rm4rw1#
hadoop中的排序是基于键的,因此不能保证值的顺序。
iswrvxsc2#
本地mrjob只对Map器输出使用操作系统“sort”。
Map器以以下格式写出:
键<-tab->值\n
因此,最终得到的键主要是按键排序的,其次是按值排序的。
如前所述,这不会发生在真正的hadoop版本中,只是“本地”模拟。
8xiog9wr3#
sort&shuffle阶段不依赖于reducer为给定键获得的值的顺序。
yk9xbfzb4#
“排序”值的唯一方法是使用复合键,该键包含来自值本身的一些信息。然后,key的compareto方法可以确保这些键首先按实际的键组件排序,然后按值组件排序。最后,您将需要一个组分区器,以确保在reducer中,具有相同“key”组件(实际键)的所有键都被认为是相等的,并且在对reduce方法的一次调用中迭代的相关值也是相等的。
这就是所谓的“二次排序”,类似于此的问题提供了一些示例链接。