一:Hadoop的简介
简介:
Hadoop是由Apache基金会所开发的一个开源的分布式存储和处理大数据的框架,可以在计算机集群中进行大规模数据集的的存储和处理,并提供可拓展和容错的方案。
优势:
可处理大规模数据集:
Hadoop的分布式存储和处理模型使数据不必存储在单一中心位置上,进而可以处理从TB到PB规模的数据。
高效性:
并行处理:Hadoop采用分布式计算模型,可以将任务分解成多个小任务,并发布到集群的不同节点上并行处理
数据本地化:Hadoop的分布式存储系统HDFS将数据划分成块,并存储在集群的不同节点上,在Hadoop执行任务时,优先将任务分配到存储有该任务所需数据块的节点上,减少了数据传输的开销,提高了处理效率
高可靠性和容错:
Hadoop通过数据冗余和自动故障恢复机制提供高可靠和容错。
数据冗余:将数据复制多份副本存储在不同的节点上,当数据或硬件发生故障时,数据也能可靠的存储和处理。
自动故障恢复:当集群中的节点或数据出现故障导致计算错误或任务中断时,Hadoop会自动检测并采取措施恢复数据并重新分配任务维持任务正常状态。
高拓展性:
Hadoop的分布式存储和处理模型,以及YARN资源管理器的灵活性,使得可以轻松拓展集群,以适应增长的数据量和计算任务需求
二:组成:
核心组件:
Hadoop分布式存储系统HDFS :用于存储大规模数据集
Hadoop计算模型MapReduce :用于并行处理和分析大规模数据集
Hadoop资源管理器YARN :用于资源管理和任务调度
Hadoop的公共库和工具集Hadoop Common:Hadoop的基本工具,文件系统和网络操作等
三:HDFS分布式存储系统
Hadoop Distributed File System
分布式文件系统:
将大文件切分成多个数据块(默认大小是128MB),并将这些数据块分散存储在Hadoop集群的不同节点上。
数据冗余以提高可靠性和容错:
每个数据块都会在集群的多个节点上进行复制(默认为三个副本),以防止节点故障导致数据丢失。当某个节点发生故障时,HDFS可以自动切换到其他具有相同副本的节点上,保证数据的可用性和一致性。
高吞吐量:
将数据切分成固定大小的块,并将块分散存储在多个节点上,以实现并行读取和写入操作
还支持数据局部性原则,即尽量将计算任务分配给存储数据的节点,减少数据在网络中的传输
数据一致性:
采用写一次、多次读取的模型,即一旦文件被写入,它将保持不变
这种写入模型确保了数据的一致性,因为在写入操作完成之前,其他客户端无法看到正在写入的文件
主从结构:
一个HDFS集群是由一个NameNode(主节点)和多个DataNode(从节点)组成:
NameNode(主节点):
维护着文件系统的命名空间,即文件和目录的层次关系,文件的属性(如所有者,权限,时间戳等)和数据块的分布等。
还负责处理客户端的文件读写请求以及管理数据块的复制和移动。
通常运行在一个独立的服务器上
DataNode(从节点):
负责在本地存储文件块的数据,并向NameNode报告其存储的数据块的信息
执行文件的读取和写入操作,并处理来自客户端和其他数据节点的数据传输请求
通常分布在Hadoop集群中的多个服务器上
心跳机制
NameNode和DataNode之间通过心跳机制进行通信,DataNode定期向名称节点发送心跳信号,以通知其自身的状态,
包括
数据节点的标识符
存储的数据块列表及其状态
节点的健康状态信息,如存储空间使用情况、负载等
NameNode的响应
更新数据节点的状态
NameNode会根据心跳信号中的信息更新数据节点的状态,包括存储的数据块列表、健康状态等
检查数据块的完整性
NameNode会检查数据节点上报的数据块列表,并确认数据块的完整性和一致性。如果发现数据块丢失或损坏,名称节点将采取相应措施,如复制丢失的数据块或移动损坏的数据块
处理数据节点的注册和注销
如果NameNode接收到来自新的数据节点的心跳信号,它将注册该数据节点,并将其添加到集群中的节点列表中
如果NameNode长时间未收到某个数据节点的心跳信号,它将注销该数据节点,从节点列表中移除
节点故障的处理
如果NameNode在一定时间内没有收到DataNode的心跳信号,它会将该数据节点标记为故障节点
NameNode会尝试与故障节点重新建立联系,如果仍然无法恢复连接,那么NameNode会认为该节点已经宕机,并采取相应的措施,如复制该节点上的数据块到其他正常节点上,以保证数据的可靠性和冗余
Secondary NameNode(次要名称节点)
用于帮助维护名称节点(NameNode)的元数据和改善系统的可靠性
主要功能是协助名称节点进行元数据的检查点(checkpoint)操作
元数据检查点是指将名称节点的内存中的元数据信息持久化到磁盘上,以防止在名称节点故障时丢失文件系统的元数据
如果名称节点发生故障,Secondary NameNode可以协助恢复名称节点
可以将最新的检查点文件加载到内存中,然后与数据节点重新建立联系,并协助进行名称节点的重新选举和恢复过程
SecondaryNameNode和NameNode最好不放在同一个服务器上
四:YARN(Yet Another Resource Negotiator)
资源管理和作业调度框架,用于支持分布式数据处理任务
YARN的结构允许多个应用程序同时运行在一个Hadoop集群上,并有效地利用集群资源
资源管理器负责全局资源的调度和分配,应用程序管理器负责协调应用程序的执行
而节点管理器负责管理节点上的资源和容器
这种分离的结构使得YARN能够实现高效的资源管理和作业调度,从而支持多个并发的数据处理任务
核心组件
资源管理器(ResourceManager)
资源管理器是YARN的主要组件,负责全局资源的分配和调度
子组件
调度器(Scheduler)
负责将可用的集群资源分配给不同的应用程序
根据应用程序的资源需求和调度策略,决定将哪些容器(container)分配给哪些应用程序
应用程序管理器(ApplicationManager)
负责接收来自客户端的应用程序提交请求,并为每个应用程序分配一个对应的应用程序管理器(ApplicationMaster)
与调度器协调,确保应用程序获得所需的资源,并监控应用程序的运行状态
应用程序管理器(ApplicationMaster)
负责处理任务的失败和重试,并向资源管理器报告应用程序的状态
根据应用程序的需求,将任务分配给容器,并通过与节点管理器通信来启动和监控任务的执行
是每个应用程序的主要组件,由应用程序自身提供
在集群中运行,并与资源管理器协调资源的分配和任务的执行
节点管理器(NodeManager)
是运行在每个集群节点上的组件,负责管理该节点上的资源
接收来自资源管理器的指令,启动和监控容器的执行,并向资源管理器报告节点上的资源使用情况
还负责监测容器的健康状态,并在容器故障时进行自动恢复和重启
容器(Container)是YARN的基本执行单元
用于承载应用程序的任务(任务可以是Map任务或Reduce任务)
容器是由资源管理器(ResourceManager)分配给应用程序管理器(ApplicationMaster)
然后由应用程序管理器分配给具体的任务执行。
任务的分配
由ResourceManager和ApplicationMaster共同协作完成
1. ResourceManager(RM)
负责整个集群的资源管理和调度
包括计算资源(CPU、内存)和存储资源等
接收作业提交请求,并决定将作业分配给哪个ApplicationMaster执行
根据集群中的可用资源情况,决定将作业分配给哪些节点上的ApplicationMaster来执行
2. ApplicationMaster(AM)
每个作业都有一个对应的ApplicationMaster,它是作业的主要管理器
在作业提交时,ResourceManager为作业分配一定数量的资源,并为作业启动一个ApplicationMaster
ApplicationMaster运行在一个计算节点上,负责协调和管理作业的执行
它与ResourceManager进行通信,申请和释放资源,并监控作业的执行状态
ApplicationMaster还与NodeManager通信,启动和监控作业的任务
五:MapReduce
Map阶段
输入数据切分
输入数据通常是以文件或文件集合的形式存在,例如Hadoop分布式文件系统(HDFS)中的文件
在Map阶段开始之前,输入数据会被切分成多个输入片段,每个输入片段通常对应一个Map任务的输入
例如对5篇小说进行wordcount 需要设置五的倍数个map
切片计算 Math.max(minSplitSize,Math.min(blockSize,maxSplitSize)) 需要设置minSplitSize(设置最小切片)使切片数与map数相等
初始化
在初始化阶段,Map实例会执行一些预处理操作,例如读取配置信息、加载外部资源等
数据处理
对于每个输入片段,Map实例会调用自定义的Map函数对其中的每个数据记录进行处理
Map函数是由用户根据具体需求自行实现的,它接受输入记录作为参数,并产生键值对作为输出
键值对输出
在Map函数的执行过程中,对于每个输入记录,Map函数会生成一个或多个键值对作为输出
这些键值对通常是中间结果,将在后续的Shuffle和Reduce阶段中用于数据的排序、分组和聚合
输出缓冲
Map函数生成的键值对通常会被暂存到环形缓冲区中,以减少磁盘IO的开销
当环形缓冲区达到一定大小(达到80%)或者Map函数处理完所有输入记录时,缓冲区的内容会被刷写到磁盘中,形成一个或多个临时输出文件(小文件)
分区
在Map阶段结束时,每个键值对会被分配到一个特定的分区中
分区的目的是为了后续的Shuffle阶段将具有相同键的键值对发送到同一个Reduce任务进行处理
分区的具体逻辑由Partitioner组件定义,通常根据键的哈希值来进行分区。
本地排序
需要实现两个有序 (分区有序和每个分区内的键有序)--快排
本地排序的目的是将具有相同键的键值对相邻地排列在一起,以便后续的Shuffle阶段能够更高效地进行数据的传输和处理
输出
最后,Map任务将每个分区内的键值对写入到磁盘上的临时输出文件中,小文件合成大文件 --归并排
并将输出文件的位置信息通知给ResourceManager(在YARN中使用)
Combine(可选)
MapReduce中的一个可选阶段
需要在形成小文件和大文件的过程中设置combiner 使相同键的键值对合并
用于在Map阶段的输出之后,在本地进行一些局部聚合操作,以减少后续Shuffle阶段的数据量和网络传输的开销
Reduce阶段
输入数据获取
进入shuffle阶段 每个reducer(含有分区编号)开始向每个mapper端输出的大文件中提取自己分区号的键值对 再归并保持键有序 将相同键的一段数据传入reduce方法中 输出为键值对进入OutputCollector(环形缓冲区)
该过程为并发
Reduce阶段的输入数据来自于Map阶段输出的中间结果
这些中间结果通常存储在临时文件中,并按照分区进行组织
每个Reduce任务负责处理一个或多个分区的数据
初始化
对于每个Reduce任务,首先会创建一个Reduce实例
在初始化阶段,Reduce实例会执行一些预处理操作,例如读取配置信息、加载外部资源等
数据获取
Reduce任务会从分布式文件系统(中获取属于自己负责处理的分区的数据
这些数据通常以键值对的形式存储,并按照键进行排序
数据分组,排序,聚合
在Reduce任务中,接收到的键值对首先会被按照键进行分组,即具有相同键的键值对被分配到同一个分组中
这样做是为了将具有相同键的数据聚合在一起,方便后续的聚合操作
对于每个分组,Reduce任务会对其中的键值对进行排序
排序的目的是将具有相同键的键值对相邻地排列在一起,以便进行聚合操作
在排序完成后,Reduce任务会对每个分组中的键值对进行聚合操作
聚合操作可以是用户自定义的,根据具体需求进行统计、计算、汇总等操作
通常,Reduce任务会对具有相同键的键值对进行迭代处理,并根据具体逻辑进行聚合操作
输出结果写入
Reduce任务将聚合后的结果写入到输出文件中,以生成最终的输出结果。输出文件的位置和命名由用户指定
输出结果提交
Reduce任务完成后,将输出文件的位置信息通知给ResourceManager(在YARN中使用)
结构
Client(客户端)
客户端是提交MapReduce作业的实体
负责将作业的相关信息提交给YARN(Yet Another Resource Negotiator)框架
ResourceManager(资源管理器)
ResourceManager是整个集群的资源管理和调度中心
它负责接收来自客户端的MapReduce作业请求,并根据集群中的资源情况分配计算资源给作业
ApplicationMaster(应用程序主管)
每个MapReduce作业在集群中运行时,都会有一个对应的ApplicationMaster
ApplicationMaster是作业的主管,负责协调整个作业的执行过程
它与ResourceManager进行通信,申请和释放计算资源,并监控作业的执行状态
NodeManager(节点管理器)
NodeManager是集群中每个节点上的组件,负责管理节点上的计算资源和运行容器
NodeManager接收来自ResourceManager分配的计算资源,并启动和监控容器的执行
TaskExecutor(任务执行器)
TaskExecutor是运行在NodeManager上的具体任务执行组件
负责接收来自Map任务的输出结果,进行数据分组、排序和聚合操作,并将结果写入本地磁盘
InputFormat(输入格式)
InputFormat定义了如何从输入数据源中读取数据,并将其划分成适当的数据块供给Map任务处理
在Hadoop中,常用的输入格式包括TextInputFormat、KeyValueTextInputFormat等
OutputFormat(输出格式)
OutputFormat定义了MapReduce作业的输出结果的格式和存储方式
负责将Reduce任务的输出结果写入指定的输出路径。在Hadoop中,常用的输出格式包括TextOutputFormat、SequenceFileOutputFormat等
Map函数
Map函数是用户自定义的数据处理逻辑。
它接收一个输入键值对,对输入数据进行处理,并生成中间键值对作为输出
Reduce函数
Reduce函数也是用户自定义的数据处理逻辑
它接收相同键的一组中间键值对,对这组数据进行分组、排序和聚合操作,并生成最终的输出结果
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_72418042/article/details/134378927