我已经为我的应用程序实现了二次排序。
File-1 File-2 File-3
------ ------ ------
name,pos,r,value name,pos,r,value name,pos,r,value
aa,1,0,123 aa,2,1,1 aa,3,1,11
bb,1,0,234 aa,2,2,34 aa,3,2,12
aa,2,3,55 aa,3,3,13
bb,2,1,99 bb,3,1,15
bb,2,2,54 bb,3,2,19
bb,2,3,32 bb,3,3,13
对于file-1中的每个记录,file2和file3中各有三个记录可用。
复合键是::name+(pos+r)
自然键是::name
排序顺序基于复合键。基于(pos+r)的升序
预期输出为
file1特定名称的内容(aa)后跟所有file2内容(三行aa根据pos+r排序),然后后跟file三行内容(三行aa根据pos+排序)
aa、123、1、34、55、11、12、13
bb,234,99,54,32,15,19,13岁
我已经用setgroupingcomparatorclass、setortcomparatorclass和custompartitioner在二次排序中实现了这一点。
我的疑问是:??
1) 如何在此场景中添加组合器。
根据我的理解,分组和排序发生在reducer阶段,一旦所有map输出(基于自然密钥进行分区)被转移到reduce机器。
2) 如果添加了组合器,那么排序将如何进行以及何时进行,以便reduce函数以适当的顺序接收来自所有Map器的输出。
map输出是否会被排序两次,一次在combiner中,在每个map之后执行,另一次在reducer端对所有combiner输出进行排序?
1条答案
按热度按时间k97glaaz1#
我建议你仔细检查一下http://bytepadding.com/big-data/map-reduce/understanding-map-reduce-the-missing-guide/
排序发生在Map器上。
合并(排序和合并)发生在reducer上。
combiner是一个额外的层,您可以尝试在mapper上减少。
reducer总是接收给定键的所有给定值。
Map器以排序方式发送给定键的值。
请让自己了解组比较器和排序比较器,并适当使用它。