MapReduce shuffle过程

shuffle 的过程

shufle的基本概念

  • Shuffle的正常意思是洗牌或弄乱,它会随机地打乱参数list里的元素顺序。 Shuffle过程是MapReduce的核心。

map shuffle和reduce shuffle

  • 在MapReduce的shuffle过程,是从map对文件的输出以及reduce对文件的输入这一部分过程,根据进程的阶段我们将shuffle过程分为两个阶段map shuffle 和reduce shuffle
    MapReduce shuffle过程_第1张图片
    这是我根据理解画的mapreduce流程图,其中包括shuffle的过程

map shuffle

在map阶段:我们像hdfs提交一个任务时它会对数据进行分析,并进行split之后;会以【key,value】的形式被map获取,以内存缓冲的方式到内存,并在内存中进行分区,排序后,spill溢写到磁盘,并在磁盘中形成一个文件,分区完成的,并且各个分区的数据完成排序。

环形缓冲区

  • 每个map任务都会有一个环形缓冲区,这个缓冲区默认大小为100MB,,他有一个临界值(阀值),!因为map会接受很多数据,为了避免数据量太多没导致内存不够的问题,这个环形缓冲区会有一个循环的操作过程;map接收数据后将数据存到内存缓冲区,当数据达到缓冲区阀值(80%)时,会将数据spill(溢写)入本地磁盘中,在spill的过程中,map的输出会持续写入到缓冲区,当缓冲区被写满时,会造成暂时的阻塞,等到spill完成后,继续写入。

map阶段的partitioner(分区),merger(合并),sorter(排序)

在map端获取数据后会对数据进行分区,合并,和排序的操作:

  • 分区:分区是根据reduce的分组决定的,它决定map输出的数据,会被哪个reduce任务进行处理。

  • 合并:因为map处理的数据不相当多,在缓冲区一次达到80%之后spill到本地磁盘,然后会继续缓冲,继续spill溢写,形成多个文件,然后会将这些文件合并成一个文件。

  • 排序:在这个阶段,map输出数据是以

spill

  • 这个溢写的过程就是,在map将数据缓存进内存缓冲区后,将数据进行分区,排序完成之后,把内存数据溢写到本地磁盘中,并会在磁盘中形成一个合并的,排序的文件。

reduce shuffle

  • map任务成功完成之后,reduce以HTTP的方式,会主动的向map输出到本地磁盘的形成的文件数据拷贝自己相应需要处理的数据,暂时存放在内存中,reduce会将这些来自各个map端的数据合并成一个更大的单独的文件,当所有的map数据都被拷贝完成后,会对这些数据进行排序,然后再以

copy复制

  • map任务在运行成功后,通过心跳机制,通知tasktracker状态已更新,然后tasktracker通知jobtracker。让reduce获取map完成的消息。reduce会主动的去本地磁盘中拷贝map输出的数据文件。

meger合并

  • 在reduce获取本地磁盘上各个map输出的数据后会将这些数据进行多次的meger合并,最终形成一个合并的,排序的输入文件。

group

  • 通过key的比较器,将相同key的value数据组合放在一起,对数据进行分组,然后将这些数据交给redue处理并输出

shuffle 结束

  • 当Reducer的输入文件已定,整个Shuffle才最终结束。然后就是Reducer执行,把结果输出到HDFS上。
    以上就是MapReduce的shuffle过程,有什么不对的地方请指正,,,

关于MapReduce调优的一些参数

在MapReduce执行过程中,我们经常会根据需求来修改参数,设置程序条件,因此,可以调整参数,来获得我们需要的效果:
mapreduce.map.cpu.vcores ==> map任务虚拟CPU核数,cdh默认为1G
mapreduce.reduce.cpu.vcores ==> map任务虚拟CPU核数,cdh默认为1G
mapreduce.task.io.sort.mb ==>环形缓冲区大小,默认为100mb
mapreduce.map.sort.spill.percent==>环形缓冲区的阀值,默认为0.8
mapreduce.task.io.sort.factor ==>meger合并因子数量
map.sort.class ==>map排序规则

你可能感兴趣的:(MapReduce)