利用MapReduce框架完成上述全局排序,将怎样来处理呢?我们知道,map的输出结果是键值对的形式,框架先将一行行的键值数据分区,同一个分区的数据聚集在一起,每个分区内的数据按照key排序,然后每个分区内的数据会被分发到对应的reduce处理,最后reduce输出结果,这个过程叫shuffle。依据此,设定一个reduce task,即强制把map输出的结果都分到一个分区中,也就交给了一个reduce处理,再以第一个字段为key,交由MapReduce去排序。
方式一:通过添加一个变量base_count,利用字典序进行全局排序
map_sort.py
key加上base_count,使得结果key长度一致,可以用字典序进行排序。
#! /usr/bin/python
import sys
base_count = 10000
try:
for line in sys.stdin:
ss = line.strip().split('\t')
key = ss[0]
val = ss[1]
new_key = base_count + int(key)
print "%s\t%s" %(new_key,val)
except Exception:
print "map error"
red_sort.py
在reduce中,key要减去base_count,以此还原成原先的key。
#