Yikun / yikun.github.com

Yikun's Blog
69 stars 21 forks source link

从数据压缩切入看MapReduce的全流程 #86

Open Yikun opened 4 years ago

Yikun commented 4 years ago

最近要在Hadoop中做一些和压缩库相关的优化,也借此机会把Hadoop的MapReduce的全流程代码进行了梳理,本篇文章将端到端的梳理一下MapReduce的全流程,并重点关注其中和数据压缩/解压相关的流程。

1. 起点

为了使整个代码的阅读变得有趣,我们先提几个问题作为后续追寻蛛丝马迹的“导火索”:

  1. 算法支持情况。 Hadoop中,目前支持哪几种数据压缩算法?每个压缩算法有什么特点?性能如何?
  2. 压缩框架实现。 Hadoop中的压缩算法的框架是怎样的?如何增加一个压缩算法?
  3. 压缩与解压的时机。 在MapReduce的过程中,哪个过程会进行数据压缩和解压?耗时比例大概多少?会带来怎样的利弊?
  4. 压缩性能测试。 如何进行压缩性能测试?

2. MapReduce的基本流程

image

从上图我们可以看到MapReduce的核心流程如上所示,从用户的Input文件到最终的Output文件,主要经历以下几个阶段:

1. Map阶段。

Split:会将用户的输入文件,进行一些“分割“,在client端进行,逻辑上进行分割,只记录偏移信息。 Map:Split文件信息会在Map阶段进行处理, 调用用户自己定义的Map函数。 环形缓冲区:Map的输出不会直接存在文件里,而是存在环形缓冲区中,攒够了以后再进行落盘。 Spill:从缓冲区落盘的过程叫做spill,也最终会生成多个Spill文件。 Map.out:Spill文件最终会被合并为最终的Map输出。

2. Shuffle阶段。

Shuffle阶段会将Map的输出下载到对应的Reduce的机器上。

3. Reduce阶段。

Merge:Reduce阶段最开始的时候,会将Map文件进行Merge,形成一个大文件,作为Reduce的输入。 Reduce:Reduce会执行用户自己定义的reduce函数,完成最终的输出。

更多详细的内容可以参考《Hadoop MapReduce Comprehensive Description》 [1] 这篇文章。

3. Hadoop中压缩算法的支持情况

目前Hadoop支持的压缩算法共有2大类,一种是可分割的压缩算法,一种是不可分割的压缩算法。而支持的压缩算法的类型有:

[1] Hadoop MapReduce Comprehensive Description: https://0x0fff.com/hadoop-mapreduce-comprehensive-description/

4.后续

在2020年9月26日,在Apache Hadoop Meetup上,我也分享了更多的技术细节,以及我们实际的性能测试结果: