shuffle的工作原理

shuffle实现的功能

  • 分区

决定当前key交给那个reducer进行处理
相同的key必须在一个reduce task中
默认:按照key的hashCode值对reduce的个数进行取余
如果是自定义分区,默认是对key进行分区,但是我们也可以根据value进行分区

  • 分组

将相同的key的value进行合并,key相同的话,会分到同一组
在mapReduce阶段
一行调用一次map方法
key相同的调用一次reduce方法

  • 排序

按照key对应的keyvalue进行排序,字典排序

shuffle的工作原理

  • map端的shuffle

spill:溢写
每一个map处理好的结果都会进入环形缓冲区(缓冲区内存为100M)当环形缓冲区使用超过80%以后开始溢写
.
分区:确定每一条keyvalue交给哪个reduce处理(类似打标签)

keyvalueflag
hadoop1reduce0
hive1reduce1
hbase1reduce0
hadoop1reduce0

排序:将相同分区的数据进行分区内的排序

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hive1reduce1

当整个还中区达到阈值的80%,开始溢写
将当前分区排序后数据写入到磁盘中,变成了一个个小文件,最终生成多个小文件(假设生成的两个文件相同)
file1:

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hive1reduce1

file2:

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hive1reduce1

- merge合并
将生成的小文件进行合并

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hive1reduce1
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hive1reduce1

排序:将相同分区的数据进行分区排序
end_file(map task1)

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hbase1reduce0
hive1reduce1
hive1reduce1

map task结束,通知appMaster,appMaster拉取数据


  • reduce端的shuffle

map task1

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hbase1reduce0
hive1reduce1
hive1reduce1

map task2

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hbase1reduce0
hive1reduce1
hive1reduce1

reduce启动多线程通过http到每台机器上拉取属于自己的分区数据
reduce1

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hbase1reduce0
hbase1reduce0
hbase1reduce0

reduce2

keyvalueflag
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hadoop1reduce0
hbase1reduce0
hbase1reduce0
hbase1reduce0
hbase1reduce0

merge:合并,将每个map task的结果中数据自己分区的数据进行合并
排序:对整个属于自己的分区数据进行排序
分组:将相同key的value进行合并
reduce0

keyvalue
hadoop[1,1,1,1,1,1,1,1]
hbase[1,1,1,1]

reduce1

keyvalue
hive[1,1,1,1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值