既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
- ResourceManager :负责给 application 分配资源
- NodeManager :负责监控容器使用资源情况,并把资源使用情况报告给 ResourceManager。这里所说的资源一般是指CPU、内存、磁盘、网络等。
ApplicationMaster 负责从 ResourceManager 申请资源,并与 NodeManager 一起对任务做持续监控工作。
- ResourceManager(RM):整个集群资源(内存、CPU等)的老大
- 处理客户端请求。
- 监控 NodeManager。
- 启动或监控 ApplicationMaster。
- 资源的分配与调度。
- ApplicationMaster(AM):单个任务运行的老大
- 负责数据的切分。
- 为应用程序申请资源并分配给内部的任务。
- 任务的监控与容错。
- NodeManager(N M):单个节点服务器资源老大
- 管理单个节点上的资源。
- 处理来自 ResourceManager 的命令。
- 处理来自 ApplicationMaster 的命令。
- 资源的分配与调度。
- Container:容器,相当一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。
- Container 是 Yarn 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
YARN工作机制
- MR程序提交到客户端所在的节点。
- YarnRunner向ResourceManager申请一个Application。
- RM将该应用程序的资源路径返回给YarnRunner。
- 将运行所需资源提交到HDFS上。资源提交完毕后,申请运行mrAppMaster。
- RM将用户的请求初始化成一个Task。
- 其中一个NodeManager领取到Task任务,并创建容器Container,产生MRAppmaster。
- Container从HDFS上拷贝资源到本地。MRAppmaster向RM 申请运行MapTask资源。
- RM将运行MapTask任务分配给另外两个NodeManager,并创建容器。
- MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
- MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
- ReduceTask向MapTask获取相应分区的数据。
- 程序运行完毕后,MR会向RM申请注销。
YARN作业提交过程
1.作业提交
客户端向yarn提交一个作业
- 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
- 第2步:并申请一个作业id。
- 第3步:RM给Client返回该job资源的提交路径和作业id。
- 第4步:Client提交jar包、切片信息和XML文件到指定的资源提交路径。
- 第5步:提交完资源后,向RM申请运行MrAppMaster。
2.作业初始化
- 第6步:当RM收到Client的请求后,将该job添加到调度器中。
- 第7步:空闲的NM领取到该Job,并创建Container,并产生MRAppmaster,并下载Client提交的资源到本地。
3.任务分配
- 第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
- 第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
4.任务运行
- 第12步:MR向两个接收到任务的NodeManager发送程序启动脚本。
- 第13步:MrAppMaster等所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
- 第14步:ReduceTask向MapTask获取相应分区的数据。
- 第15步:程序运行完毕后,MR会向RM申请注销自己。
5.进度和状态更新
- YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒向应用管理器请求进度更新, 展示给用户。
6.作业完成
- 除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
YARN调度器和调度算法
Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。
Apache Hadoop3.1.3默认的资源调度器是容量调度器,
CDH框架默认调度器是公平调度器。
1. FIFO调度器(First In First Out)
- 特点:FIFO调度器按照任务到达的时间排序,先到先服务, 在当前强调多租户和资源利用率的大环境下,FIFO的使用率并不高。
- 优点:简单,不需要配置。
- 缺点:不适合共享集群。如果有大的app需要很多资源,那么其他app可能会一直等待。
2.容量调度器(Capacity Scheduler)
- 是Yahoo开发的多用户调度器。
- 调度策略:优先学则资源利用率低的队列。
- 每个队列可以单独设置资源分配方式:FIFO、DRF
特点
- 多队列:每个队列可以配置一定的资源量,每个队列采用FIFO调度策略
- 容量保证:管理员可以为每个队列设置资源,保证最低资源和资源使用上限
- 灵活性:如果一个队列中的资源有剩余,可以把这些资源共享给需要资源的队列,如果该队列有新的应用程序提交,则会收回对应资源
- 多用户:支持多用户共享集群和多应用程序同时运行。为了防止一个用户的作业独占资源,该调度器会对同一个用户提交的作业所占的资源量进行限定。
资源分配算法
队列资源分配: 从root开始使用深度优先算法,优先选择资源占用率最低的队列分配资源。
作业资源分配: 默认按照提交作业的优先级和提交时间的顺序分配资源。
容量资源分配: 按照容器的优先级分配资源,如果优先级相同则按照数据本地性原则
- 任务和数据在同一节点
- 任务和数据在同一机架
- 任务和数据不在同一节点也不在同一机架
3.公平调度器
- 公平调度器由FaceBook开发,其设计目的是在事件尺度上,所有作业获得公平的资源。
- 核心调度策略:优先选择对资源缺额比较大的。
特点
- 每个队列可以单独设置资源分配方式:FIFO、FAIR、DRF
- 与Capacity Scheduler调度器具有相同的1~4点。
- 缺额:某一时刻一个作业应获资源和实际资源的差距叫“缺额”。
公平调度器队列资源分配方式:
- FIFO策略:
- 采用此种方法则与容量调度器一致。公平调度器每个队列资源分配策略如果选择FIFO,则公平调度器相当于容量调度器。
- Fair策略:
- Fair策略是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。
- FAIR策略默认情况下是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下每个队列内部采用该方法来分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可以得到1/2的资源。具体资源分配流程和容器调度器一致:【选择队列——选择作业——选择容器】
- 上述三个步骤都是按照公平策略分配资源:
- 实际最小资源份额:mindshare = Min(资源需求量,配置的最小配额)
- 是否饥饿:isNeedy = 资源使用量 < mindshare(实际最小资源份额)
- 资源分配比:mindShareRatio = 资源使用量 / Max(mindshare, 1)
- 资源使用权重比:useToWeightRatio = 资源使用量 /权重
- DRF策略
- DRF(Dominant Resource Fairness),通常的资源都是单一的标准,例如只考虑内存的情况(YARN默认情况),但是多数情况是多种资源的复合,从而难以衡量两个应用应该分配的资源比例。
- YARN中DRF的调度方式: 假设集群一共有100 CPU 和10T内存,而应用 A 需要(2 CPU ,300GB),应用 B 需要(6 CPU ,100GB)。则两个应用分别需要 A (2%CPU。3%内存)和 B (6%CPU,1%肉存)的资源,这就意味着 A 是内存主导的,,B 是 CPU 主导的,针对这种情况,可以选择 DRF 策略对不同应用进行不同资源,CPU和内存的一个不同比例的限制。
3.MapReduce
Hadoop MapReduce 是一种编程模型,它是 Hadoop 最重要的组件之一。它用于计算海量数据,并把计算任务分割成许多在集群并行计算的独立运行的 task。
MapReduce核心思想
MapReduce 是 Hadoop的核心,分布式的离线并行计算框架,对海量数据的处理。将计算过程主要分为Map和Reduce两个阶段,Map阶段并行处理输入数据,Reduce阶段对Map结果进行汇总。它会把计算任务移动到离数据最近的地方进行执行,因为移动大量数据是非常耗费资源的。
- 分布式的运算程序往往需要分成至少2个阶段,map阶段和reduce阶段。
- map阶段的MapTask并发实例,并行运行,互不相干。
- reduce阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
- MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
总结: 分析WordCount数据流走向深入理解MapReduce核心思想。
Mapper:
- 第一阶段是把输入文件进行分片(inputSplit)得到block。有多少个block就对应启动多少maptask
- 第二阶段是对输入片中的记录按照一定的规则解析成键值对。键(key)表示每行首字符偏移值,值(value)表示本行文本内容。
- 第三阶段是调用map方法。解析出来的每个键值对,调用一次map方法。
- 第四阶段是按照一定规则对第三阶段输出的键值对进行分区。
- .第五阶段是对每个分区中的键值对进行排序。首先按照键进行排序,然后按照值。完成后将数据写入内存中,内存中这片区域叫做环形缓冲区。
Reduce:
- 第一阶段(copy)reduce任务从Mapper任务复制输出的键值对。
- 第二阶段(sort)合并排序是把复制到Reduce本地数据,全部合并。再对合并后的数据排序
- 第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
MapReduce优缺点
优点:
- 易于编程:简单的实现一些接口就可以完成分布式程序。
- 良好的拓展性:计算资源不足时可以通过增加机器提高能力。
- 高容错性:一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,这个过程由hadoop内部完成。
- 适合PB级以上的海量数据的离线处理
缺点:
- 不擅长实时计算
- 不擅长流式计算:因为MapReduce自身的设计特点决定了数据源必须是静态的。
- 不擅长有向无环图计算:MapReduce不擅长后一个应用程序的输入为前一个的输出,因为每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
- MrAppMaster:负责整个程序的过程调度及状态协调。
- MapTask:负责Map阶段的整个数据处理流程。
- ReduceTask:负责Reduce阶段的整个数据处理流程。
MapReduce框架原理
1.MapTask并行度决定机制
数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
- 一个job的map阶段并行度由客户端在提交job时的切片数决定
- 每个split切片分配一个mapTask并行实例处理
- 默认情况下切片大小=blocksize
- 切片针对每一个文件切片
2.FileInputFormat切片解析
- 程序先找到数据存储目录
- 遍历目录下的每个文件
- 遍历第一个文件
(1)获取文件大小
(2)计算切片大小(默认情况下切片大小=blocksize)
(3)每次切片时要判断剩下的部分是否大于块的1.1倍,不大于则划分一块切片
(4)将切片信息写到一个切片规划文件中
(5)切片的核心过程在getSplit()方法中完成
(6)InputSplit只记录了切片的元数据信息(起始位置,长度,所在节点等) - 提交切片规划文件到yarn上,由yarn的MrAppMaster根据切片规划文件开启对应的mapTask。
3.TextInputFormat实现类
FileInputFormat常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。
TextInputFormat
- TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型。
TextInputformat将每一行在文件中的起始偏移量作为 key,每一行的内容作为value。默认以\n或回车键作为一行记录。
KeyValueTextInputFormat
- KeyValueTextInputFormat是FileInputFormat的一个实现类,每一行为一条记录,被分隔符分割为key,value。
- 可以通过在驱动类中设置conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR,“\t”)设置分割符。
KeyValueTextInputFormat 适合处理输入数据的每一行是两列,并用 tab 分离的形式
NLineInputFormat
- 如果使用NlineInputFormat,代表每个map进程处理的InputSplit不再按block块去划分,而是按NlineInputFormat指定的行数N来划分。
CombineTextInputFormat
- CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
4.CombineTextInputFormat切片机制
虚拟存储切片最大值设置:CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);
- 虚拟存储过程:
将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。 - 切片过程:
(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
MapReduce工作流程
MapReduce工作流程由submit阶段,mapTask阶段,shuffle阶段,reduce阶段组成
1. mapTask阶段
- 客户端提交切片,jar包,xml文件给yarn,由MrAppMaster获取切片信息打开对应数量的mapTask。
- mapTask通过InputFormat调用RecordReader的read()方法读取外部的数据,解析出key/value.
- 当数据处理完成后,调用OutputCollector.collect()输出结果。它会将生成的key/value分区,并写入环形内存缓冲区中。
2.shuffle阶段
- 当环形缓冲区达到80%后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。
- ①在环形缓冲区内部,会对数据进行一次分区排序。利用快速排序算法对分区编号进行排序,然后再对key进行排序,这样可以保证同一分区内所有数据按照key有序。②按照分区编号由小到大依次将每个分区中的数据写入到任务工作目录下的临时文件spillN.out中,如果设置了Combiner,则写入文件前会对分区中的数据进行合并操作。③分区内元数据信息会写入到内存索引数据结构SpillRecord中,如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。
- 当所有数据处理完成后,MapTask将所有临时文件合并成一个大文件,同时生成相应的索引文件。
MapTask以分区为单位进行合并。对于某个分区,它将采用多轮递归合并的方式。每轮合并10个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。
3.reduce阶段
- Reduce会根据自己的分区,去maptask中拉取属于自己的数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
- 在拉取数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
- 当合并完成后reduce()函数将计算结果写到HDFS上。
HDFS、YARN、MapReduce 三者关系
Hadoop生态体系
组件 | 介绍 |
---|---|
Hadoop HDFS(核心) | Hadoop 分布式存储系统; |
Yarn(核心) | Hadoop 2.x版本开始才有的资源管理系统; |
MapReduce(核心) | 并行处理框架; |
HBase | 基于HDFS的列式存储数据库,它是一种 NoSQL 数据库,非常适用于存储海量的稀疏的数据集; |
Hive | Apache Hive是一个数据仓库基础工具,它适用于处理结构化数据。它提供了简单的 sql 查询功能,可以将sql语句转换为 MapReduce任务进行运行; |
Pig | 它是一种高级脚本语言。利用它不需要开发Java代码就可以写出复杂的数据处理程序; |
Flume | 它可以从不同数据源高效实时的收集海量日志数据; |
Sqoop | 适用于在 Hadoop 和关系数据库之间抽取数据; |
Oozie | 这是一种 Java Web 系统,用于Hadoop任务的调度,例如设置任务的执行时间和执行频率等; |
Zookeeper | 用于管理配置信息,命名空间。提供分布式同步和组服务; |
Mahout | 可扩展的机器学习算法库。 |
Hadoop的工作方式
Hadoop 以主从的方式工作,如图:
- 一个Master节点和多个Slave节点,Slave节点可以扩展到1000个;
- Master节点管理,维护和监控Slave节点,Slave节点是真正在干活的机器;
- Master节点应该部署在配置较高的机器上面,因为它是Hadoop集群的核心;
- Master存储元数据(即数据的数据),Slave是真正存储数据的机器;
- 客户端通过Master节点来分发任务。
Hadoop的守护进程
Hadoop主要有四个进程:
- NameNode :它是HDFS运行在Master节点守护进程。
- DataNode:它是 HDFS 运行在Slave节点守护进程。
- ResourceManager:它是 Yarn 运行在 Master 节点守护进程。
- NodeManager:它是 Yarn 运行在 Slave 节点的守护进程。
除了这些,可能还会有 secondary NameNode,standby NameNode,Job HistoryServer 等进程。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
Yarn 运行在 Slave 节点的守护进程。
除了这些,可能还会有 secondary NameNode,standby NameNode,Job HistoryServer 等进程。
[外链图片转存中…(img-8Ujj4K3d-1715442273639)]
[外链图片转存中…(img-1zY4EkVI-1715442273639)]
[外链图片转存中…(img-z2UtvjE7-1715442273639)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新