MapReduce的细节

写在前面

写这篇文章的目的是对之前的一篇关于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的细节基本上是以上这些,可能还有些知识没有涉及到,希望大家补充和修正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值