hdfs-mapreduce处理流程(二)

在这里插入图片描述
1、问题:在这张图中有几个工人,几个工厂
工人: 4 --map处理程序
厂: 3 --reduce相当于最后的工厂 组装

2、map端进行了什么事:砍树这一步叫做split 过程
砍树—把我们hdfs的文件进行切割(砍树) ----- 默认与block块的大小一
致(128M) split=block=maptask
2.1当然为了更好的处理,在计算资源充足的情况下,把split变大设置为256M

split= 2block= maptask

2、计算资源不充足,假设一个maptask只能处理64M的数据,那该怎么办呢?
有一个词叫做并行计算,并且中国传统文化也支持有福同享,有难同当,对吧
那我们就把split设置为64M

2split= 1 block= 2maptask

那在这里也证明了一个点
-一个计算处理进程(maptask)处理一个split

1split= 1maptask
在这里插入图片描述
注意
split是一个逻辑概念, map task会一行一行的读取某个block中的数据, 为防止数据被切分, 它还会多读取下一个block的第一行数据(HDFS中按照字节存储数据, 所以极有可能一条数据被拆分存放在两个block中).

3、将map切割下来的数据放进内存缓冲区
在这里插入图片描述
磁盘和内存:谁的处理速度快,内存对吧,所以这个处理进程都是在内存中进行
在内存.上进行处理效率最高

那在内存缓冲区干了什么事–打标签

砍树的时候要进行分堆,是不是按照树木类型分的
给split打.上标签,同样标签的数据分到一起

如何打标签

hashcode 相同的数据有自己固定的hashcode % reduce的个数=reduce个数的分区
分区的作用:相同hashcode种类的数据分到了一个reduce.上处理

那有了这些标签,之后,我们该如何去进行分区排序呢?

在最一开始的时候产生的数据是kv键值对,在进行分区的时候也是根据key值的hashcode
HashPartitioner – 默认分区器. 相同的分区由相同的reduce task处理, 分区策略: 经map处理后, 将key的Hash值与reduce task的个数(NUM)取模, 模值相同的key将放在同一个分区中.
buffer in memory – 内存缓冲区, map对split内容处理后先写入内存缓冲区, 进入缓冲区的每一条记录都由三部分组成: 分区号, key, value
在这里插入图片描述

问题:如果说我这100M空间满了,,又来数据了,怎么办?

对默认的100M进行划分=80+20
来的数据存放在80M中进行处理,当80M满了之后,会溢写(Spill)到磁盘上进行存储
1、溢写前将这80M的数据进行一次小排序
2、在溢写的过程中,再来的数据,存放在20M中 因为溢写时会将80M内存给封印

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

5、reduce会 去map端拉取数据(shuffle),他会把磁盈上的数据拉取到reduce自己的内存中(默认1G)
在这里插入图片描述

和map一样,为了避免产生内存溢出的情况,reduce的内存也分为两块,7+3,并且,处于reduce聚合占用的资源更多,所以只要内存占用超过66%,就开始将reduce内存中的数据溢写到磁盘上,
溢写到磁盘之前:还是会进行一次小的排序
溢写之后:在进行合并,形成reduce端的有序小文件

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

至此,mapreduce除了进行结束

但是为什么现在mapreduce应用少了呢?作为所有分布式计算的鼻祖,初代的技术,总是有他独到的优缺点

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

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

发布了37 篇原创文章 · 获赞 0 · 访问量 409

猜你喜欢

转载自blog.csdn.net/weixin_42864905/article/details/104507296