大数据面试题(待更新。。。)

  1. 请简述一下shuffle的运行原理和过程是什么

    答:下图是官方的图解

简略分析:

            1.map阶段:

                a.每个map有一个环形缓冲区,用于存储任务的输出,。默认大小为100MB(io.sort.mb属性),一旦达到阈值
                    0.8(io.sort.spill.percent),一个后台程序把内容写到(spill)磁盘的指定目录(mapred.local.dir)下创建的一个溢
                    出写文件
                b.写磁盘前,要partition,sort。如果有combiner,combiner排序后数据
                c.等最后记录写完,合并全部溢出写文件作为一个分区排序的文件

            2.reduce阶段

                a.reducer通过http方式得到输出文件的分区
                b.tasktracker为分区文件运行reduce任务,复制阶段把map输出复制到reduce的内存或磁盘、一个map任务的完成,
                    reduce就开始付诸输出
                c.排序阶段合并map输出,然后reduce阶段

            详细分析

            1.map端:

                a.每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(64M)为一个分片,当然我们也
                可以设置。map的输出结果会暂且保存在一个环形的缓冲区内,当该缓冲区达到阈值时,会在本地文件系统中产生一个
                溢出文件,将该缓冲区的数据写入到这个文件中。

                b.在写磁盘之前,线程首先根据reducer的数量将数据划分为相同数目的分区,也就是一个reducer任务对应一个分区的数据,
这样做是为了
                避免有些reducer任务分配到大量的任务,而有些则分到很少的数据。其实分区就是对数据进行hash的过程。然后对每个分区中的数 据进行排序
                如果此时设置了combiner,将排序的结果在进行combiner操作,这样做的目的是让尽可能少的数据写入到磁盘中。同时,combiner操 作与map在同一端,数据传输在本地。

                c.当map任务输出最后一个记录时,可能会有很多的溢出文件,这是就需要将这些文件合并。合并的过程中不断进行排序和combiner 的操作,
                目的有两个:1.尽量减少每次写入磁盘的数据量;2.尽量减下一复制阶段网络传出的数据量。最后合并成了已分区且排好序的文件。 为了减少网络传输的数据量,
                这里可以将数据进行压缩,只要将mapred.compress.map.out设置为true就可以了。

                d.将分区的数据拷贝给相应的reduce任务。因为map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和JobTracker保持 心跳。
                所以JobTracker中保存了整个集群的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就可以了;。

            2.reducer端

                a.reduce会收到不同的map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数量相当小,则直接存储在内 存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,堆空间的百分比),如果数量超过了该缓冲区 大小的一定比例(由mapred.job.shuffle.merge.percent决定),则对数据合并溢写到磁盘中。
                b.随着溢写文件的增多,后台线程会将他们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。
                    其实不管在reduce端还是map端,都是不停的sort,merge
                c.合并的过程中会产生许多的中间文件,但mapreduce会让写入到磁盘的数据尽可能大的少,并且最后一次
                    合并的结果并没有写到磁盘,而是直接输入到reduce函数

转载于:https://www.cnblogs.com/codecenter/p/8676431.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值