七、MapReduce应用

一、MapReduce的组成

1、JobTracker/ResourceManager:管理任务
2、TaskTracker/NodeManager:执行任务

二、Shuffle
MapTask
1、获取到切片(FileSplit)信息

2、每一个切片对应一个MapTask

3、读取具体的数据块(Block)

4、按行读取数据

5、每一行数据会调用一次map方法,进行处理

6、map方法在执行完成之后会产生k-v结构,这个数据会存在缓冲区中

7、在缓冲区中会进行partition/sort/combine

8、缓冲区默认大小是100M,缓冲区中还会有一个阈值—80% — 就意味着如果缓冲区使用达到了80%的时候,认为缓冲区满了

9、如果缓冲区满了,就会将缓冲区中的数据写到磁盘的文件中,过程称为Spill(溢写),写出的文件称之为溢写文件

10、每一个溢写文件中的数据是分好区且排好序

11、每一次Spill过程都会产生一个新的溢写文件,所以所有的溢写文件从整体上不是分区且排序的

12、在交给ReduceTask之前,会对所有的溢写文件进行一次合并 — merge

13、合并之后的文件是对所有的数据进行了整体的分区并且排序

注意:
1、Spill过程不一定发生

2、如果产生了Spill过程,且最后一次的数据不足阈值,将最后一次的缓冲区中的数据flush到最后一个溢写文件中

3、切片的大小和溢写文件的个数不是对等的

4、达到缓冲区的80%的时候会Spill到溢写文件中,理论上Spill文件应该是80M,实际上溢写文件一定是80M么?— 不一定 ①要考虑最后一次的flush;②要考虑序列化的因素

5、如果溢写文件的个数>=3个,在merge的时候会再进行一次combine过程

6、每一个MapTask对应一个缓冲区

7、缓冲区本质上是一个字节数组

8、缓冲区是一个环形缓冲区,为了重复利用缓冲区

阈值的作用:①防止数据覆盖②防止写入过程的阻塞

三、ReduceTask
1、ReduceTask通过http请求来访问对应的MapTask获取到分区的数据 — fetch - fetch线程数量默认是5

2、获取到不同的MapTask的数据之后,会对数据进行merge,将数据合并(将相同的键所对应的值放入一个迭代器中)且排序(根据键进行排序)

3、每一个键调用一次reduce方法来进行处理
将处理之后的数据写到HDFS中

注意:
1、merge因子:确定每次将几个文件合并一次。默认是10。如果文件个数<merge因子,直接合并

2、ReduceTask的阈值:ReduceTask不是等所有的MapTask都结束之后才启动执行,而是在一定数量的MapTask结束之后就开始启动抓取数据。
— 5% — 当5%的数量的MapTask结束之后,ReduceTask就开始启动抓取数据

四、调优
1、可以调大缓冲区,一般建议是250~400M之间

2、可以适当的增加combine过程

3、在map过程中会产生一个最后merge好的文件,通过网络发送给ReduceTask — 可以将文件进行压缩,压缩之后再发送 — 如果网络带宽比较稀缺,这个时候可以考虑压缩

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值