大数据面试 | 05 分点整理后Shuffle也可以很简单

目录

1. Shuffle的引入

2. Shuffle过程

3.Map端Shuffle

4. Reduce Shuffle

1. Shuffle的引入

Map 是映射,负责数据的过滤分法,将原始数据转化为键值对;
Reduce 是合并,将具有相同的 key 值的 value 进行处理后再输出新的键值对作为最终结 果。
为了让 Reduce 可以并行处理 Map 的结果,必须对 Map 的输出进行一定 的排序与分割,然后再交给对应的 Reduce,Map 端的输出作为 Reduce 的输 入的过程叫做 Shuffle.

在了解shuffle的具体流程之前,应先对以下两个概念有所了解:

block块(物理划分)

block是HDFS中的基本存储单位,默认大小为64M。文件上传到HDFS,就要划分数据成块,这里的划分属于物理的划分,块的大小可通过 dfs.block.size配置。block采用冗余机制保证数据的安全:默认为3份,可通过dfs.replication配置。

split分片(逻辑划分)

Hadoop中split划分属于逻辑上的划分,目的只是为了让map task更好地获取数据。split是通过hadoop中的InputFormat接口中的getSplit()方法得到的。

2. Shuffle过程

Shuffle.png

如图所示,这是Shuffle的整个流程,我们一步一步解释:

Shuffle 过程包含在 Map 和 Reduce 两端,即 Map shuffle 和 Reduce shuffle。

3. Map端shuffle

  • 分区partition

  • 写入环形内存缓冲区

  • 执行溢出写:排序sort--->合并combiner--->生成溢出写文件

  • 归并merge

(1)分区Partition

在将map()函数处理后得到的(key,value)对写入到缓冲区之前,需要先进行分区操作,这样就能把map任务处理的结果发送给指定的reducer去执行,从而达到负载均衡,避免数据倾斜。MapReduce提供默认的分区类(HashPartitioner)。

简单理解就是按照统计结果按照条件输入到不同文件当中(分区)。比如将手机号按照 135 137 187开头的分别放到一个独立的文件当中 ,其他的放到一个文件夹。

(2)写入环形内存缓冲区

因为频繁的磁盘I/O操作会严重的降低效率,因此“中间结果”不会立马写入磁盘,而是优先存储到map节点的“环形内存缓冲区”,并做一些预排序以提高效率,当写入的数据量达到预先设置的阙值后便会执行一次I/O操作将数据写入到磁盘。

这个阈值一般是0.8,也就是80MB,另外的20%内存可以继续写入要写进磁盘的数据,写入磁盘和写入内存操作是互不干扰的*,如果缓存区被撑满了,那么map就会阻塞写入内存的操作,让写入磁盘操作完成后再继续执行写入内存操作

(3)执行溢写出

一旦缓冲区内容达到阈值,就会锁定这80%的内存,并在每个分区中对其中的键值对按键进行sort排序

具体是将数据按照partition和key两个关键字进行排序,排序结果为缓冲区内的数据按照partition为单位聚集在一起,同一个partition内的数据按照key有序。排序完成后会创建一个溢出写文件(临时文件),然后开启一个后台线程把这部分数据以一个临时文件的方式溢出写(spill)到本地磁盘中

如果客户端自定义了Combiner(相当于map阶段的reduce),则会在分区排序后到溢写出前自动调用combiner,将相同的key的value相加,这样的好处就是减少溢写到磁盘的数据量。这个过程叫“合并”

剩余的20%的内存在此期间可以继续写入map输出的键值对。溢出写过程按轮询方式将缓冲区中的内容写到mapreduce.cluster.local.dir属性指定的目录中。

(4)归并merge

当一个map task处理的数据很大,以至于超过缓冲区内存时,就会生成多个spill文件。此时就需要对同一个map任务产生的多个spill文件进行归并生成最终的一个已分区且已排序的大文件。
归并得到的文件内键值对有可能拥有相同的key,这个过程如果client设置过Combiner,也会合并相同的key值的键值对(根据上面提到的combine的调用时机可知)。

(5)压缩

写磁盘时压缩map端的输出,因为这样会让写磁盘的速度更快,节约磁盘空间,并减少传给reducer的数据量。默认情况下,输出是不压缩的

2.png

4. reduce shuffle

reduce shuffle 有复制和合并。

Reduce 通过*** Http 的方式从 map 获取数据***, reduce 有少量的复制线程,可以并行的从 map 上复制数据。
Reduce 可能需要 从多个 map 任务中获取数据,因此只要多个 map 中的一个完成,reduce 便可 以从 map 复制数据。
如果 map 的输出数据较小,会直接复制到内存;如果数 据比较大,当达到缓冲区阈值时会溢出到磁盘,最后会排序合并这些溢出文件。

你可能感兴趣的:(大数据面试 | 05 分点整理后Shuffle也可以很简单)