mapreduce过程解析

来源:互联网 发布:剑网3李白捏脸数据 编辑:程序博客网 时间:2024/06/06 20:58
  • mapreduce过程解析(mapreduce采用的是sort-based shuffle)

    • 将获取到的数据分片partition进行解析,获得k/v对,之后交由map()进行处理.
    • map函数处理完成之后,进入collect阶段,对处理后的k/v对进行收集,存储在内存的环形缓冲区中。
    • 当环形缓冲区中的数据达到阀值之后(也可能一直没有达到阀值,也一样要将内存中的数据写入磁盘),将内存缓冲区中的数据通过SpillThread线程转移到磁盘上。需要注意的是,转移之前,首先利用快排对记录数据进行排序(原则是先按照分区编号,再按照key进行排序,注意,排序是在写入磁盘之前的)。之后按照partition编号,获取上述排序之后的数据并将其写入Spill.out文件中(每一个分区的内容都对应到磁盘中的一个Spill.out文件),需要注意的是,如果人为设置了combiner,在写入文件之前,需要对每个分区中的数据进行聚集操作。该文件同时又对应SpillRecord结构(Spill.out文件索引)。
    • map的最后一个阶段是merge:该过程会将每一个Spipll.out文件合并成为一个大文件(该文件也有对应的索引文件),合并的过程很简单,就是将多个Spill.out文件的在同一个partition的数据进行合并。(第一次聚合)


    • shuffle阶段。首先要说明的是shuffle阶段有两种阀值设置。第一,获取来自map的结果数据的时候,根据数据大小自然划分到内存或者是磁盘(这种阀值的设置跟map阶段完全不同);第二,内存和磁盘能够保存的文件数目有阀值,超出阀值,会对文件进行merge操作,即小文件合并成为大文件。Shuffle过程:
      1)获取完成的Map Task列表。
      2)进行数据的远程拷贝(http get的方法),根据数据文件的大小自然划分到内存或者是磁盘。
      3)当内存或者磁盘的文件角度时,进行文件合并。(第二次聚合)


    • reduce之前需要进行Sort操作,但是两个阶段是并行化的,Sort在内存或者磁盘中建立小顶堆,并保存了指向该小顶堆根节点的迭代器,同时Reduce Task通过迭代器将key相同的数据顺次讲给reduce()函数进行处理。

0 0
原创粉丝点击