MR方式简析

来源:互联网 发布:东罗马帝国 知乎 编辑:程序博客网 时间:2024/06/05 02:11
假设有以下两个文件,每行总有4个字段,分别代表着产品,出发地,目的地,成本
product from to cost

file1:

air china ala 200
air ala china 400
air usa ca 700
air ca usa 800
train beijing guangzhou 400
train beijing shenzhen 900
train shenzhen beijing 300
trian guangzhou beijing 500

file2:
air china ala 300
air ala china 500
air usa ca 800
air ca usa 900
train shenzhen guangzhou 500
train beijing shenzhen 1000
train shenzhen beijing 400
trian guangzhou shenzhen 600

数据需求如下:
1.每个产品一个文件
2.每个产品按照城市对进行汇总(即是只要在两个城市或者国家间的旅行都汇总到一行上)
3.城市对(国家对)按照首字母进行升序合并,比如shenzhen-guangzhou,(g<s)所以输出为guangzhou-shenzhen
4.每个文件中按照城市对(国家对)的第一个字母降序排列
因此得到的数据应该为

air file:
air usa-ca 3200(700+800+800+900)
air ala-china 1400(200+400+300+500)

train file:
train guangzhou-shenzhen  2000(400+500+500+600)
train beijing-shenzhen 2600(900+300+1000+400)



按照数据流将会有以下的依序的MR
1. KEY 设计:product+from+to(或者product+to+from),形式应如:air:usa-ca,train:guangzhou-shenzhen
2.将会有两个mapper,分别处理file1和file2的数据,mapper 后输出为:
第一个mapper输出:
air:ala-china 200
air:ala-china 400
air:ca-usa 700
air:ca-usa 800
train:beijing-guangzhou 400
train:beijing-shenzhen 900
train:beijing-shenzhen 300
trian:beijing-guangzhou 500

第二个mapper输出:

air:ala-china 300
air:ala-china 500
air:ca-usa 800
air:ca-usa 900
train:beijing-guangzhou 500
train:beijing-shenzhen 1000
train:beijing-shenzhen 400
trian:beijing-guangzhou 600

3.将按照product设计partiton,如果把KEY截取到air就返回0否则返回1,如果截取到air就设置为0,否则设置为1,注意partiton是

mapper之后combiner之前进行的,即是(类似下面的结果):
第一个partition输出:
air:ala-china 200---0
air:ala-china 400---0
air:ca-usa 700---0
air:ca-usa 800---0
train:beijing-guangzhou 400---1
train:beijing-shenzhen 900---1
train:beijing-shenzhen 300---1
trian:beijing-guangzhou 500---1

第二个partition输出:

air:ala-china 300---0
air:ala-china 500---0
air:ca-usa 800---0
air:ca-usa 900---0
train:beijing-guangzhou 500---1
train:beijing-shenzhen 1000---1
train:beijing-shenzhen 400---1
trian:beijing-guangzhou 600---1

4.设计combiner,combiner的类应和recuder一样,所以两个mapper得出的结果应为:
  第一个combiner的输出:
  air:usa-ca 1500(700+800)--0
  air:ala-china 600(200+400)---0
  train:guangzhou-shenzhen  900(400+500)--1
  train:beijing-shenzhen 1200(900+300)---1

  第二个combiner输出为:
  air:usa-ca 1700(800+900)---0
  air:ala-china 800(300+500)---0
  train:guangzhou-shenzhen  1100(500+600)---1
  train:beijing-shenzhen 1400(1000+400)---1 

5.经过sort(setoutputcomparator)之后得到:
 第一个outputcomparator的输出:
  air:usa-ca 1500(700+800)--0
  air:ala-china 600(200+400)---0
  train:guangzhou-shenzhen  900(400+500)--1
  train:beijing-shenzhen 1200(900+300)---1

  第二个outputcomparator输出为:
  air:usa-ca 1700(800+900)---0
  air:ala-china 800(300+500)---0
  train:guangzhou-shenzhen  1100(500+600)---1
  train:beijing-shenzhen 1400(1000+400)---1

注意:这里的sort之后得到的和combiner之后得到的是一样的,这是极端例外的情况,在combiner之后有可能会按照城市对的第一个字

母升序排序了或者杂乱的顺序(以为默认是按照key的首字母升序,但是这里的key是组合的,因此得到的城市对顺序并不规则)所以很

有可能combiner之后得到下面的数据:
 
  (另一种可能的combiner输出:)
  第一个combiner的输出:
  air:ala-china 600(200+400)---0
  air:usa-ca 1500(700+800)--0
  train:beijing-shenzhen 1200(900+300)---1
  train:guangzhou-shenzhen  900(400+500)--1


  第二个combiner输出为:
  air:ala-china 800(300+500)---0
  air:usa-ca 1700(800+900)---0 
  train:beijing-shenzhen 1400(1000+400)---1
  train:guangzhou-shenzhen  1100(500+600)---1
因此我们根据设定的需求来重新排序:

6.进行reducer,得到最终的结果:
air file:
air usa-ca 3200(1500+1700)
air ala-china 1400(600+800)

train file:
train guangzhou-shenzhen  2000(900+1100)
train beijing-shenzhen 2600(1200+1400)

7.再重新另一个起假设(很对不起自己,设计如上的数据假定的时候没有考虑周全,没有覆盖groupingcomparator的情况),
  假设combiner之后有如下的输出:

  combiner1输出:
  air:ala-china 600
  air:ben-china 700
  .....省去trian
  combiner2输出:
  air:usa-ben 800
  air:china-ben 900
  .....省去trian
  一样的假定:key为product+from+to

 想要得到按照城市对的后一个城市进行汇总,即是:
  air china 1300(600+700)
  air ben  1700(800+900)
 
这时候groupingcomparator隆重登场,假设没有grouping的话在reduce将会按照key进行迭代,得到的将会是:

  air:ala-china 600
  air:ben-china 700
  air:usa-ben 800
  air:china-ben 900

如果设置了grouping,按照第二个城市进行group,这第二个城市相同时候的就只会进行一次迭代:
得到最终的结果:
  air china 1300(600+700)
  air ben  1700(800+900)

总结:
mapper-partitioner-combiner-sortcomparator-reducer-grouping(reducer和grouping其实一起)
原创粉丝点击