MapReduce
一、MapReduce设计理念
map--->映射
reduce--->归纳,聚合
mapreduce必须构建在hdfs之上的一种大数据离线计算框架
在线:实时数据处理
离线:数据处理时效性没有在线那么强,但是相对也需要很快得到结果
mapreduce不会马上得到结果,他会有一定的延时(磁盘IO)
如果数据量小,使用mapreduce反而不合适
杀鸡焉用宰牛刀
原始数据(数据在map中会构建成键值对的形式存在)-->map(Key,Value)-->Reduce
分布式计算
将大的数据切分成多个小数据,交给更多的节点参与运算
计算向数据靠拢
将计算传递给有数据的节点上进行工作
二、MapReduce架构特点
MapReduce1.x
JobTracker
主节点,单点,负责调度所有的作业和监控整个集群的资源负载。
TaskTracker
从节点,自身节点资源管理和JobTracker进行心跳联系,汇报资源和获取task。
Client
以作业为单位,规划作业计算分布,提交作业资源到HDFS,最终提交作业到JobTracker。
Slot(槽):
属于JobTracker分配的资源(计算能力、IO能力等)。
不管任务大小,资源是恒定的,不灵活但是好管理。
Task(MapTask-->ReduceTask):
开始按照MR的流程执行业务。
当任务完成时,JobTracker告诉TaskTracker回收资源。
MapReduce1.x的弊端
1.JobTracker负载过重,存在单点故障。
2.资源管理和计算调度强耦合,其它计算框架难以复用其资源管理。
3.不同框架对资源不能全局管理。
MapReduce2.x
Client:
客户端发送MR任务到集群,其中客户端有很多种类,例如hadoop jarResourceManager:
资源协调框架的管理者,分为主节点和备用节点(防止单点故障,主备的切换基于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环境(之前已经配置好了,可以查看之前的搭建笔记)
四、扑克牌的问题
你想数出一摞牌中有多少张黑桃,红桃,方块,梅花。直观方式是一张一张检查并且数出分别有多少张。
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上
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界