MapReduce

一、MapReduce设计理念

map--->映射

reduce--->归纳,聚合

mapreduce必须构建在hdfs之上的一种大数据离线计算框架

​ 在线:实时数据处理

​ 离线:数据处理时效性没有在线那么强,但是相对也需要很快得到结果

mapreduce不会马上得到结果,他会有一定的延时(磁盘IO)

​ 如果数据量小,使用mapreduce反而不合适

​ 杀鸡焉用宰牛刀

原始数据(数据在map中会构建成键值对的形式存在)-->map(Key,Value)-->Reduce

分布式计算

​ 将大的数据切分成多个小数据,交给更多的节点参与运算

计算向数据靠拢

​ 将计算传递给有数据的节点上进行工作

二、MapReduce架构特点

MapReduce1.x

image-20220525230407602

JobTracker

   主节点,单点,负责调度所有的作业和监控整个集群的资源负载。

TaskTracker

   从节点,自身节点资源管理和JobTracker进行心跳联系,汇报资源和获取task。

Client

   以作业为单位,规划作业计算分布,提交作业资源到HDFS,最终提交作业到JobTracker。

Slot(槽):

​ 属于JobTracker分配的资源(计算能力、IO能力等)。

​ 不管任务大小,资源是恒定的,不灵活但是好管理。

Task(MapTask-->ReduceTask):

​ 开始按照MR的流程执行业务。

​ 当任务完成时,JobTracker告诉TaskTracker回收资源。

MapReduce1.x的弊端

  1.JobTracker负载过重,存在单点故障。

  2.资源管理和计算调度强耦合,其它计算框架难以复用其资源管理。

  3.不同框架对资源不能全局管理。

MapReduce2.x

image-20220525230532959

Client:
客户端发送MR任务到集群,其中客户端有很多种类,例如hadoop jar

ResourceManager:
资源协调框架的管理者,分为主节点和备用节点(防止单点故障,主备的切换基于ZK的管理),它时刻与NodeManager保持心跳,接受NodeManager的汇报(NodeManager当前节点的资源情况)。

​ 当有外部框架要使用资源的时候直接访问ResourceManager即可。

​ 如果是有MR任务,先去ResourceManager申请资源,ResourceManager根据汇报分配资源,例如资源在NodeManager1,那么NodeManager1要负责开辟资源。

Yarn(NodeManager):
Yarn(Yet Another Resource Negotiator,另一种资源协调者),统一管理资源。以后其他的计算框架可以直接访问yarn获取当前集群的空闲节点。

​ 每个DataNode上默认有一个NodeManager,NodeManager汇报自己的信息到ResourceManager。

Container:
它是动态分配的,2.X资源的代名词。

ApplicationMaster:
我们本次任务的主导者,负责调度本次被分配的资源Container。当所有的节点任务全部完成,applicaion告诉ResourceManager请求杀死当前ApplicationMaster线程,本次任务的所有资源都会被释放。

Task(MapTask--ReduceTask):
开始按照MR的流程执行业务,当任务完成时,ApplicationMaster接收当前节点的反馈。

YARN【Yet Another Resource Negotiator】:Hadoop 2.0新引入的资源管理系统,直接从MRv1演化而来的。

核心思想:将MRv1中JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现:

   ResourceManager:负责整个集群的资源管理和调度。

   ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控和容错等。

YARN的引入,使得多个计算框架可运行在一个集群中 每个应用程序对应一个ApplicationMaster 目前多个计算框架可以运行在YARN上,比如MapReduce、Spark、Storm等。

三、Hadoop搭建yarn环境(之前已经配置好了,可以查看之前的搭建笔记)

四、扑克牌的问题

image-20220525204947990

你想数出一摞牌中有多少张黑桃,红桃,方块,梅花。直观方式是一张一张检查并且数出分别有多少张。
MapReduce方法则是:
1.给在座的所有玩家中分配这摞牌
2.让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你
3.你把所有玩家告诉你的数字加起来,得到最后的结论

五、MapReduce的计算流程

计算扑克牌中每种花色出现的次数

第一部分Map任务

1.block块

数据上传到HDFS上,会被切分成一个个大小为128MB的block块

block块的大小可以设置,通常是按照128的倍数去设置

2.逻辑切片Split

目的:动态地控制计算单元的数量

切片是一个逻辑概念

在不改变现在数据存储的情况下,可以控制参与计算的节点数目

通过切片大小可以达到控制计算节点数量的目的

有多少个切片就会执行多少个Map任务,每个map认任务线程都需要资源

当资源充足时:适当调小split切片大小,生成的切片文件变多,map任务变多,效率更高

当资源不足时:适当调大split切片大小,生成的切片文件变少,map任务变少

默认情况下,Split切片的大小等于Block的大小 ,默认128M,如果读取到最后一个block块的时候,与前一个block块组合起来的大小小于128M*1.1的话,他们结合生一个split切片,生成一个map任务

面试题:hadoop能不能存储小文件?

答:能,但不推荐
解释:1.(从hdfs存储角度)在hadoop存储文件时,若小文件过多,就意味着block块的数量就会变多,进而导致NameNode存储的元数据变多,可能会导致NameNode宕机
2.(从MapReduce角度),小文件越多,block块就越多,导致spilt切片变多,进而导致map任务变多,而启动map任务线程都是需要资源的,可能会导致启动map任务失败,整个MapReduce作业失败

3.Map任务

map默认从所属切片读取数据,每次读取一行(默认读取器)到内存中(map种的逻辑作用在每一行上)

我们可以根据自己书写的分词逻辑(空格,逗号等分隔),计算每个单词出现的次数(wordcount)

这时会产生(Map<String,Integer>)临时数据,存放到内存中(数据在map中会构建成键值对的形式存在)

a b a b c.......

<a,1>
<b,1>
<a,1>
<b,1>
<c,1>
......

如果把数据都直接放到硬盘,效率太低

所以想个方案,内存和硬盘结合,我们要做的就是在OOM和效率低之间提供一个有效方案,可以先往内存中写入一部分数据,然后写出到硬盘

4. 环形缓冲区(KV-Buffer)

4.1溢写

map的结果进入环形缓冲去(基于内存的数据结构,默认大小为100MB)
每一个Map可以独享的一个内存区域

在内存中构建一个环形数据缓冲区(kvBuffer),默认大小为100MB

默认设置缓冲区的阈值为80%(设置阈值的目的是为了同时写入和写出),当缓冲区的数据达到80MB开始向外溢写到硬盘,形成一个个小文件(小文件的数量是由溢写百分比和split切片数决定的),然后通过归并排序将小文件合并成一个文件

溢写的时候还有20M的空间可以被使用效率并不会被减缓

4.2根据键编号(分区)

分区的数量和Reduce的数量(默认一个,可以改)是相等的

编号规制: hash(key) % partation(reduce的数量) = num

默认分区的算法是Hash然后取余

​ Object的hashCode()—equals()

​ 如果两个对象equals,那么两个对象的hashcode一定相等

​ 如果两个对象的hashcode相等,但是对象不一定equlas

 <0-a,1>
 <1-b,1>
 <0-a,1>
 <1-b,1>
 <2-c,1>
 ......
4.3 排序Sort(环形缓冲区做的,快速排序,对前面分区后的编号进行排序,使得相同编号的在一起)

对要溢写的数据进行排序(QuickSort)

按照先Partation后Key的顺序排序–>相同分区在一起,相同Key的在一起

我们将来溢写出的小文件也都是有序的

 <0-a,1>
 <0-a,1>
 <1-b,1>
 <1-b,1>
 <2-c,1>
 ......
4.4 溢写Spill

将内存中的数据循环写到硬盘

每次会产生一个80MB的文件,产生的文件数量由溢写百分比或者split切片数决定

4.5合并Merge(归并排序)

因为溢写会产生很多有序(分区 key)的小文件,而且小文件的数目不确定,后面向reduce传递数据带来很大的问题

所以将小文件合并成一个大文件,将来拉取的数据直接从大文件拉取即可

第二部分Reduce任务

1.拉取map结果

reduce会从map结果文件中,拉取同一分区编号的数据,形成一个新的文件(每拉取一次形成一个)

将这些拉取到的文件的分区编号去除,通过归并排序,相同的键为一组,值形成一个迭代器,构成一个新的键值对

<a,[1,1......]>
<b,[1,1......]>
<c,[1......]>
 ......

2.归并排序

归并排序的结果再给到reduce任务(需要自己编写代码逻辑)进行处理
每一个分组后的键值对分别会执行一次reduce逻辑

最终结果文件的个数取决于reduce的个数,其结果会存储再hdfs上
mapreduce流程

posted @   bjynjj  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示