Hadoop:MapReduce Shuffle

1.Shuffle:Shuffle译为洗牌,它是MapReduce的核心部分,它具有分区、排序、分组、聚合的作用

2.Shuffle分为Map端的Shuffle和Reduce端的Shuffle

3.Shuffle的设计是为了解决:为了解决分布式中全局排序和全局分组的问题

4.Shuffle的实现:
所有Map的结果会全部写入磁盘
在分布式磁盘中通过特殊的排序机制来实现全局排序
再由Reduce读取全局排序后的数据进行处理
特点:必须经过磁盘,只要经过shuffle,性能就比较差

5.Shuffle的功能:
分区:默认按照K2进行Hash分区,对Map输出的数据进行标记
排序:按照K2进行排序
分组:按照K2进行分组,相同K2的所有V2放在一起

6.Map端Shuffle过程
Map端Shuffle实现由MapTask来运行实现,Reduce端Shuffle实现由ReduceTask来执行

Spill:将每个Task处理的所有数据进行局部排序,生成多个有序的小文件
以MapTask1为例
MapTask1会将当前处理分区好的数据和对应的索引信息写入一个环形缓冲区【内存:100M】
直到达到存储阈值:80%,达到80M【数据+索引】,触发Spill
step1:将当前缓冲区中的数据进行排序
排序规则:相同分区的数据放在一起,分区内部按照K2进行排序
排序算法:内存、快排
step2:将排序好的数据写入磁盘,变成一个有序的小文件
写入磁盘,释放80M内存,另外20%持续写入,又会达到阈值,继续触发spill
结果:会有很多有序的小文件

Merge:每个MapTask都会将自己的所有小文件合并为一个大文件合并过程中会进行排序
规则:先按照分区排序,分区内部按照K2排序
算法:磁盘,插入排序:基于有序小文件的合并排序
当MapTask生成大文件以后,会通知程序管理者,当前MapTask已经结束,生成文件,程序管理者收到Map的通知。会通知ReduceTask到每个MapTask的大文件中取属于自己的数据

7.Reduce端Shuffle过程
每个ReduceTask收到程序管理者的通知,会到每个MapTask的结果文件中取属于自己的数据
Merge:每个ReduceTask会将属于自己的所有MapTask的数据进行合并并排序
算法:磁盘,插入排序

8.Reduce端的Shuffle阶段如何实现?
拉取数据:每个Reduce到每个Map的结果中拉取属于自己的数据
Merge:每个ReduceTask将所有MapTask中属于自己的数据进行合并排序

9.Shuffle:Combiner优化

Combiner的功能
功能:Map端的聚合,利用MapTask的分布式提前在Map端Shuffle过程中实现Reduce的聚合逻辑
发生
Map端的shuffle中,每次排序以后会做判断 ,判断是否开启了Combiner
如果开启了Combiner,就会调用Combiner的类做分组聚合
设计:通过MapTask的个数一般远大于ReduceTask的个数,让每个MapTask对自己处理的数据先做部分聚合,最后由reduce来做所有MapTask的最终聚合,降低了Reduce的负载,提高了Reduce的性能

优点
降低了Reduce负载
解决数据倾斜的问题

Combiner的功能是什么?
在Map端Shuffle中由每个MapTask实现聚合,减少进入Reduce数据量
发生在什么阶段:Map端的shuffle
每次排序之后会进行Combiner
Spill:会在内存中排序后,判断是否开启Combiner,如果开启了,在内存中进行分组聚合
Merge:合并排序时,也会判断是否执行Combiner

如何实现Combiner?

job.setCombinerClass(ReduceClass);

9.JobHistoryServer与日志聚集

JobHistoryServer的功能

MapReduce的一个历史服务监控进程,记录在YARN中运行过的所有MapReduce的程序的信息
必须搭配日志聚集来使用

日志聚集的功能
YARN的一个功能,用于记录所有程序运行的信息,将所有的信息记录在HDFS中

JobHistoryServer的启动及管理
在第二台机器启动HistoryServer进程

mr-jobhistory-daemon.sh start historyserver

10.Shuffle:Compress优化
压缩的设计

通过牺牲CPU的压缩和解压的性能,来提高对磁盘以及网络IO的性能的提升
优点
减小文件存储所占空间
加快文件传输效率,从而提高系统的处理速度
降低IO读写的次数
缺点
使用数据时需要先对文件解压,加重CPU负荷,压缩算法越复杂,解压时间越长
常用的类型:Snappy、Lzo、Lz4
查看当前Hadoop支持的压缩

hadoop checknative

配置压缩测试
Input:MapReduce输入通过对文件后缀名的判断,自动识别读取压缩类型,不需要做任何配置

Map Output:配置以下参数

properties
#开启Map输出结果压缩,默认为false不开启
mapreduce.map.output.compress=true
#配置Map输出结果的压缩类型
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.DefaultCodec

一般都配置这个部分,提高Shuffle性能
Reduce Output:配置以下参数

properties
#开启Reduce输出结果压缩,默认为false
mapreduce.output.fileoutputformat.compress=true
#配置Reduce输出结果的压缩类型
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec

一般不配置,除非当前程序的结果要作为下一个程序的输入

压缩的实现
运行

 yarn jar compress.jar bigdata.itcast.cn.hadoop.mr.compress.SogouCountNoCompress 
 /sogou/input /sogou/output1

配置方式
方式一:在配置文件中进行配置:mapred-site.xml
所有的程序都做了压缩
方式二:在代码中配置:conf.set
灵活的管理压缩配置
方式三:提交程序的时候指定配置
Shuffle:分组设计及规则
目的:实现分布式的全局数据分组

分组规则
step1:优先调用分组比较器进行分组比较,判断K2是否为同一组
step2:如果没有分组比较器,调用K2自带的compareTo方法实现比较,判断K2是否为同一组

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值