大数据MapReduce总结

MapReduce简介

MapReduce定义:
Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。

MapReduce主要思想: 分久必合

MapReduce两个阶段: Map端、Reduce端

MapReduce核心思想:“相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算。

MapReduce执行流程

在这里插入图片描述

MapReduce 具体分为四步:
1.Map 阶段;
2.Shuffle Write阶段
3.Shuffle Read阶段
4.Reduce 阶段

MapReduce中的几个名词:

map task – Map端开启的处理线程, 一个map task 处理一个split.

split – 切片的概念, 假设数据存放在HDFS上, MR在计算前, 会将HDFS上的文件划分切片. split的默认大小与一个block的大小一致, 即block数 = split数 = map task数.
 也可设置split与block之间的大小关系, 例如, 2block = split = map task; 1/2block = split = map task.也可设置split与block之间的大小关系, 例如, 2block = split = map task; 1/2block = split = map task.

key-value : MR处理过程中, 数据都是通过键值对的形式传递的. 起初key值为blockId的偏移量(long类型), value为block中的数据(String类型). 经过map, reduce处理过后, key-value内容根据需求而定.

map – 对数据切分的方法, 输入类型为<LongWritable, Text>, 输出类型<key, value>由需求决定.

HashPartitioner – 默认分区器. 相同的分区由相同的reduce task处理, 分区策略: 经map处理后, 将key的Hash值与reduce task的个数(NUM)取模, 模值相同的key将放在同一个分区中.

buffer in memory – 内存缓冲区, map对split内容处理后先写入内存缓冲区, 进入缓冲区的每一条记录都由三部分组成: 分区号, key, value. buffer大小默认100M, 分为两份, 一份80M, 一份20M.
 当达到溢写比例(buffer中约有80M数据)时, 会将这80M数据封锁, 然后对数据进行聚合, 排序, 排序时先按照分区排序, 分区相同的再按照key排序. 排序完成后就将数据溢写到磁盘上. 每次溢写产生一个磁盘小文件.
 聚合排序过程中, 如果还有内容继续往buffer中写的话, 这些内容将被写入buffer剩余的20M中.

merge – map阶段的merge基于磁盘小文件进行合并, 合并时按照分区号进行合并, 将相同分区号的数据放在同一个大分区中. 合并完成后会对相同分区的数据进行排序.
  – reduce阶段的merge合并时会对每一个有序的磁盘小文件进行排序, 这些小文件已经属于同一个分区. 最后合并成一个磁盘大文件时, 会根据key值进行分组, key值相同的为一组.

fetch – reduce task进程从map task产生的磁盘大文件中拉去数据, 拉取的数据先放入Reduce端的内存中, 内存大小默认为1G的70%. 内存中数据达到一定的溢写比例后, 就会将内存中的数据溢写到磁盘小文件中, 溢写之前也会进行排序.

reduce – 对有序的大文件中key值相同的一组数据处理的方法, 输入参数由map端的输出参数决定, 输出参数由需求决定, 都是key-value的形式.

reduce task – Reduce端开启的处理线程, 一个reduce task产生一个output文件 .

MapReduce执行流程:
假设MR处理的数据存储在HDFS上, HDFS上的数据是以block的形式存放.

1.1 map阶段

1.1.1 map task从HDFS中读取文件, HDFS中文件以block块的形式存在, 默认情况下一个block块大小与一个split大小相同, 一个map task 处理一个split. 整个过程数据以键值对的形式传输, 输入map前的key为blockId的偏移量, value为block块中的内容.

1.1.2 map方法根据需求将传入的value进行切割 (传入map方法的value为什么是一行的数据而不再是整个文本内容? 是传入前将block文件切分还是在调用map方法时将文件按行切分的? ), 再根据需求设置输出类型的key和value.

1.2 shuffle write阶段

1.2.1 分区器分区(打标签), 分区的目的就是让同一个分区的数据被同一个reduce task 来处理. 默认的分区器是HashPartitioner, 它的分区策略为将经map处理后得到的key的Hash值与reduce task的个数(NUM)取模, 模值相同的key将放在同一个分区中.

1.2.2 向内存buffer中写数据, 将打上标签的map输出的数据写入到内存buffer中, 内存buffer默认大小为100M. 此时每一个数据记录都由三部分组成:(1)分区号;(2)key;(3)value;

1.2.3 当内存buffer中写入的数据达到80M时, 此时会将这80M的内存封锁, 封锁后对内存中的数据进行聚合(Combiner), combiner完成后再根据分区号排序, 分区号排序完之后再按照key的大小排序(Sort). 此时这80M的数据中相同分区号的数据存放在一起, 并且分区内的数据是有序的.

1.2.4 溢写(Spill), 内存buffer达到80M内存时, 排序完成后对这80M数据溢写. 将数据写入磁盘, 形成一个磁盘小文件, 文件根据分区号划分并且内部有序. 每次内存buffer溢写都会产生这么一个小文件.

1.2.5 合并(Merge), 所有溢写完毕后, 会将磁盘小文件合并成一个大文件, 合并时先对数据进行聚合(Combiner), 然后再使用归并算法将各个小文件合并成一个根据分区号划分且内部有序的大文件. 每一个map task都会产生这么一个大文件.

2.1 shuffle read阶段

1.1.1 读取map产生的大文件中对应分区的数据. 将分区数据写入内存中, 内存大小默认为1G, 当内存中写入的数据达到溢写比例时, 内存的溢写过程与map中buffer溢写几乎一样, 首先封锁数据, 然后对数据排序, 排序完成后将排好序的数据写入磁盘小文件中.

1.1.2 当map中对应分区的数据全部读取之后. reduce task会对所有的磁盘小文件进行归并算法合并, 合并成一个内部有序的磁盘大文件. 大文件中相同key值的数据为同一组数据.

2.2 reduce阶段

1.2.1 遍历整个大文件, 对同一组的数据调用一次reduce方法, 将输出的<key, value>结果写入output文件中. 每个reduce task产生一个输出文件, 输出文件不再合并.

MapReduce工作机制

MapReuce->Application->资源调度器->任务调度器->分布式并行计算

client上运行MapReduce Application,向Namenode发送请求,在其中一个node上启动一个ApplicationMaster(任务调度器),ApplicationMaster拿到client生成列表后,会向ResourceManager(资源调度器)申请资源,ApplicationMaster调用集群中的node资源运行yarn-child子程序。

MapReduce的优缺点

优点

  • 易于编程. 实现一个分布式程序只需简单地实现几个接口即可, 而且这个程序可以放到大量廉价的服务器(或PC机)上执行, 门槛低.
  • 扩展性较好. 当计算资源得不到满足时, 可通过简单地增加服务器数量来提升计算性能.
    高容错性. 既然MapReduce部署在廉价机上, 那么就要求它具备较高的容错性. 当一个节点挂掉后, 集群内部可以自动地将计算任务转移到其他服务器节点上执行. 不仅保证任务不会失败, 而且还不需要开发人员的参与.
  • 适合海量数据的离线处理. MapReduce可实现有上千台服务器集群的并发工作, 从而提高计算能力.

缺点

  • 不适合实时计算. 无法像MySQL一样, 在毫秒或秒级内返回结果.
  • 不适合流式计算. MR自身设计决定它处理的数据集必须是静态的, 不能动态变化.
  • 不适合有向图(DAG)计算. 当多个程序之间有相互依赖关系, 比如说前一个程序的输出要作为后一个程序的输入时, MR在处理时, 需要先将前一个程序的处理结果写入磁盘, 然后后一个程序再去磁盘读取结果之后才能处理, 从而造成大量磁盘IO, 导致性能低下.
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值