既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
优势总结——4高(高可靠、高扩展、高效、高容错)
- 高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
- 高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
- 高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
- 高容错性:能够自动将失败的任务重新分配。
Hadoop组成
1.HDFS
HDFS :即 Hadoop 分布式文件系统(Hadoop Distribute File System),以分布式存储的方式存储数据。负责海量数据的存储
HDFS 也是一种 Master-slave 架构,NameNode 是运行 master 节点的进程,它负责命名空间管理和文件访问控制。DataNode 是运行在 slave 节点的进程,它负责存储实际的业务数据,如下图:
管理者:NameNode(nn)
存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
作用:负责管理,管理集群内各个节点。
- 维护管理文件系统的元数据(指的是数据的存放位置或存放路径)或名字空间
- 负责确定指定的文件块到具体的Datanode结点的映射关系。
- 维护管理 DataNode上报的心跳信息
- 管理真实的数据的元数据(也就是文件、日志、视频、图片、等)
工作者:DataNode(dn)
在本地文件系统存储文件块数据,以及块数据的校验和。
作用:主要进行负责真实数据的块存储,负责工作,进行读写数据。 周期向NameNode汇报。
- 执行数据的读写(响应的是客户端)
- 周期性向NameNode做汇报(数据块的信息、校验和)
若datanode 10分钟没有向NameNode做汇报,表示已丢失(已宕机)
心跳周期 3秒 - 执行流水线的复制(将一份大数据切成若干份,一份一份的复制到三个节点,复制完一份下一份才开始复制)
辅助管理者:SecondaryNameNode(2nn)
每隔一段时间对NameNode元数据备份。
作用:责辅助NameNode管理工作。主要是对NameNode进行数据的备份,一般要恢复数据时候才会用到这个的。
HDFS的优缺点
优点:
- 高容错性
数据采用多副本保存方式,当集群中的某些机器宕机了,数据可以从其他正常运行的机器获取 - 适合处理大数据
通过将大文件切分成小的数据块存储到不同服务器上,可以实现一个大文件的存储,同时通过联合多个服务器多块硬盘实现整个存储系统的大容量,大文件的分片存储,不同分片可以进行并行读写操作,进而实现数据的高速访问。
NameNode负责文件元数据的操作,DataNode负责处理文件的读写请求,文件数据流不会经过NameNode的处理,只会跟存储在具体DataNode进行联系,因此NameNode不会成为系统的瓶颈,成百上千台DataNode节点应对文件内容数据流的读写,其吞吐量大大提高了。 - 可靠性
缺点
- 不适合做实时数据访问
- 无法对大量小文件进行存储。存储大量小文件会占用NameNode大量的内存去存储元数据信息。小文件存储的寻址时间会超过读取时间
最佳传输损耗理论:在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输!
目前硬件的发展条件,普通磁盘写的速率大概为100M/S, 寻址时间一般为10ms!
(10ms / 1%) * 100M/S = 100M
- 不支持并发写入,文件随机修改。一个文件不允许多个线程同时写,仅支持追加,不支持修改
HDFS的写数据流程
- 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在,并返回结果
- 客户端请求 Block上传到哪几个DataNode上,NameNode返回DataNode节点
- 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。dn1、dn2、dn3逐级应答客户端。
- 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
- 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。
HDFS的读数据流程
- 客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
- 就近原则挑选一台DataNode(然后随机)服务器,请求读取数据。
- DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
- 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
2.YARN
Yet Another Resource Negotiator 简称 YARN :是一个资源管理系统,其作用就是把资源管理和任务调度/监控功分割成不同的进程,Yarn 有一个全局的资源管理器叫 ResourceManager,每个 application 都有一个 ApplicationMaster 进程。一个 application 可能是一个单独的 job 或者是 job 的 DAG (有向无环图)。
在 Yarn 内部有两个守护进程:
- 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或回车键作为一行记录。
![img](https://img-blog.csdnimg.cn/img_convert/21507474b072ec09485958adedbd70b6.png)
![img](https://img-blog.csdnimg.cn/img_convert/2d62d7435ba5695b01b41d9883a55a04.png)
![img](https://img-blog.csdnimg.cn/img_convert/4ec3d85aa0f182546c8eee74a6e85982.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
换行符和回车符),Text类型。
TextInputformat将每一行在文件中的起始偏移量作为 key,每一行的内容作为value。默认以\n或回车键作为一行记录。
[外链图片转存中…(img-NGdLbyxP-1715232635480)]
[外链图片转存中…(img-toHDPn6t-1715232635480)]
[外链图片转存中…(img-FhqJ4sH8-1715232635481)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新