mapreduce排序和洗牌是如何工作的?

f4t66c6m  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(370)

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

i86rm4rw1#

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

iswrvxsc

iswrvxsc2#

本地mrjob只对Map器输出使用操作系统“sort”。
Map器以以下格式写出:
键<-tab->值\n
因此,最终得到的键主要是按键排序的,其次是按值排序的。
如前所述,这不会发生在真正的hadoop版本中,只是“本地”模拟。

8xiog9wr

8xiog9wr3#

sort&shuffle阶段不依赖于reducer为给定键获得的值的顺序。

yk9xbfzb

yk9xbfzb4#

“排序”值的唯一方法是使用复合键,该键包含来自值本身的一些信息。然后,key的compareto方法可以确保这些键首先按实际的键组件排序,然后按值组件排序。最后,您将需要一个组分区器,以确保在reducer中,具有相同“key”组件(实际键)的所有键都被认为是相等的,并且在对reduce方法的一次调用中迭代的相关值也是相等的。
这就是所谓的“二次排序”,类似于此的问题提供了一些示例链接。

相关问题