0

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

 2 years ago
source link: https://yikun.github.io/2020/08/20/%E4%BB%8E%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9%E5%88%87%E5%85%A5%E7%9C%8BMapReduce%E7%9A%84%E5%85%A8%E6%B5%81%E7%A8%8B/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

  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大类,一种是可分割的压缩算法,一种是不可分割的压缩算法。而支持的压缩算法的类型有:

  • Lz4, 压缩速率很快,压缩比一般
  • Snappy, 由Google开源的压缩算法,压缩速率和压缩率均衡
  • ZSTD,由Facebook开源的压缩算法,压缩速率和压缩率均衡
  • Gzip/Zlib,GNU开源,压缩率不错,速度较慢
  • Passthrough,直通,仅保存压缩的文件名后缀,实际文件不压缩
  • Bzip2,压缩速率较慢,支持流式压缩,可分割

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK