MapReduce的细节

来源:互联网 发布:jquery数组中添加元素 编辑:程序博客网 时间:2024/06/05 16:57

写在前面

写这篇文章的目的是对之前的一篇关于MapReduce在日志处理中的过程的深入,自己在一些知识上存在误解,当然也不保证现有理解的正确性,希望通过记录慢慢纠正自己,加深印象。

MapReduce

MapReduce的初衷是希望在处理大量数据时,能够有效地利用分布式系统的优势,由Master节点下发任务到各个Slave节点上执行,并能够将执行结果统一。其中数据的存放位置,不论输入还是输出,始终在分布式存储系统上,当然也会在做任务时过一遍内存。
这里写图片描述

Map阶段

这里直接从Map阶段讲起,其实前面还有一个过程是对输入数据的切分,切分的大小根据Map的数量来,因为每个split会作为每个map节点的输入。然后自己定义的处理函数逐行处理数据,产生< key, value >对,接下来会经历以下几个关键步骤来产生Reduce阶段的输入:

  • Partition
    根据reduce个数对key进行分区(哈希),然后将< key, value >和分区结果转换为字节数组送入缓冲队列。缓冲队列是环形队列,为了减少内存写到磁盘的次数。
  • Spill + Sort
    缓存队列默认100M,当达到80M时,就会触发写入磁盘的线程,溢写线程触发后,会先将这80M数据进行排序,先跟据分区,然后根据key,接下来便会写入磁盘,每次溢出都会写入到一个临时文件,在写入时根据优化需要会进行适当的拼接< key, value >或者Combine,为了减少与分区相关的索引记录,和减少写入量。
  • Merge
    从上一步产生的多个临时文件最终将被合并为一个结果文件,由于是刚刚已经排好序的文件,所以采用多路归并的算法。最终的文件将被作为Reduce阶段的输入。至于文件的位置以及分区的索引会由TaskTracker来管理。
    Reduce节点会不停的询问JobTracker这些Map节点的工作都做完没,如果全部做完,JobTracker会告知Reduce节点,接下来便是Reduce阶段。

Reduce阶段

  • Copy
    Reduce节点会通过HTTP请求从Map节点的TaskTracker那获取Map阶段的结果文件。
  • Merge
    由于会从很多个Map节点那Copy数据,这些数据仍然需要归并。Copy来的数据最先放在缓存,然后经历3种方式的归并:1)内存到内存;2)内存到磁盘;3)磁盘到磁盘。第1)种方式默认不启用,如果启用,当内存使用量到达一定阈值,便会开启第2)种方式,与Map阶段的循环队列类似,会生成多个临时文件,如果开启了Combine,这里也会做适当优化,最后开启第3)种方式,合并多个临时文件,最终生成一个文件作为Reduce阶段的输入。
  • Reduce
    有了输入,接下来便是Reduce阶段处理函数的工作了。注意,输入可能来源于内存,可能来源于文件,默认是来源于文件,当然,来源于内存会更高效一些。处理函数工作完成后便将输出结果存储在分布式存储系统上。

MapReduce的细节基本上是以上这些,可能还有些知识没有涉及到,希望大家补充和修正。

原创粉丝点击