Hadoop Map/Reduce 流程

Map/Reduce 就是翻译过来就是 映射归纳
是对大数据并行处理所抽象出来的两个操作。我们只需要实现 map 和 reduce 两个操作就能实现对大数据的并行计算。了解其中的流程能帮助我们更好理解这两个操作。

一个最简单的流程是:

输入一个文件,把文件分成多个块,把这些文件块交给多个 map 程序并行处理,再把多个 map 处理的结果交给多个 reduce 程序处理,reduce 产生最后的结果。
map 和 reduce 输入和输出都是相同的格式,有一个 key 和 value 组成。

 

一个完整的流程如下:

Input files

  • 输入原始的数据,一般存在HDFS上,指定输入的原始文件路径,可以有多个。

InputFormat

  • 定义输入文件的规范,默认文件中每一行就是一条记录,Key 是这一行的byte offset,value 是这一行的内容。

InputSplits

  • 是一个单独Map需要处理的数据块,输入的文件会被分成多个 split,可以通过参数设置相关的块大小,默认(64mb)

Mapper

  • 我们自己定义的 map 处理程序 ,输入key/value,处理输出为新的 key/value。

Shuffle

  • 从map任务输出到reducer任务输入之间的工作就是 shuffle,这是框架最重要的一部分内容。
  • map 处理完之后的key/value 会先被收集到内存缓冲区中,内存缓冲区默认 100mb,当缓冲区数据达到百分之八十的时候,会启动新的线程,把数据写入磁盘。这个过程为溢写(spill),写磁盘和写缓冲区是同时进行的。
  • map输出数据的同时会对数据进行分区(Partitioner),Partitioner决定了输出的数据会被哪个reduce程序处理,Partitioner 可以自己定义程序,默认是通过对 key hash 后再和 reduce 数量取模。数据的分区元数据也会存储到内存缓冲区中,当spill时会合并统一分区的数据,并进行排序。
  • 等map输出全部做完后,map会合并这些输出文件生成最终的正式输出文件,然后等待reduce任务来拉数据。合并的时候对相同的 Partitioner 也会进行一次归并排序。

Reduce

  • reduce任务在执行之前的工作就是不断地拉取每个map任务的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce任务的输入文件。
  • 当reduce将所有的map上对应自己partition的数据下载完成后,就会开始真正的reduce计算阶段。Reducer的输出是没有排序的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注