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 historyserver10.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是否为同一组