shuffle流程
- map方法之后,reduce方法之前过程
- shffule的过程:从map方法出来先到分区方法,然后进入缓冲环形区,进来之后进行分区和排序(左侧写数据,右侧写索引),环形缓冲是大小100M,达到80%时,就会溢写,溢写之前要对数据进行排序,排序的方法快排,要对key索引进行快排,按照字典顺序进行排序。排完序的数据进行溢写,对溢写的文件要进行归并排序,排完序之后把对应的数据放入相应的分区,等待reduce端拉去数据,reduce拉去的数据先放入内存当中,内存不足溢写到磁盘,不管内存还磁盘中数据都要进行归并排序,写入reduce方法中,写入之前也可以进行一次分组排序,这是整个shffule的过程。
优化过程:
对shffule进行优化(也就是map端的优化:),可以把环形缓冲增大到200M,把阈值增大到90%-95%之间。增大内存和阈值是为了减少溢写次数,产生大量的溢写文件就会进行归并,一次归并默认是10个,这里可以增大merge的个数(15-20)前提机器性能足够好,在归并过程之中,也可以对数据进行comebiner,但comebiner条件不影响的业务逻辑,求和,汇总不会影响,求平均值有所影响。
归并完成之后,放到对应磁盘上,为了减少磁盘IO,可以对数据进行压缩。
问题:在hadoop和mapreduce那个进行压缩?
在map输入,map输出,reduce输出
输入尽可能支持切片 lzo bzip2
输出尽可能快 snappy lzo
输出永久就可以是gzip
Reduce端的优化:
Reduce端在拉去对应分区数据是默认拉去数据并行数是5个,可以增加到10-15个,当然机器性能允许的,还可以增大reduce的内存。
还有整体的优化:maptask和reducetask用来跑任务,他们默认的内存是1G,所以可以增大内存,同时还可以调整maptask和reducetask的cpu的核数,还可以调整mapreduce失败重试次数。