Hadoop三大组件
HDFS
见名知意HDFS:分布式文件系统,基本是围绕着这几部分走的Client,NameNode、Secondary NameNode、DateNode。
Client:上传文件时按照Block块大小进行文件的切分;和NameNade交互,获取文件位置信息;和DataNode交互,读取和写入数据;管理和访问整个HFDS;
NameNode:管理命名空间NameSpace;管理Block映射信息;处理副本策略;处理客户端的读写请求;
Secondary NameNode:辅助NameNode,分担其部分工作;定期合并fsimage和fsedits,并推送给NameNode
DateNode:存储实际的Block数据块;执行数据块的读写操作;
HDFS集群是由一个Master(NameNode)和多个Slove(DateNode)组成
HDFS集群结构
在HDFS内部,一个文件中的数据是按照某种固定大小(如128 MB)的块(Block)来存储的,每个块可以按照用户指定的副本量存储在不同的机器上。NameNode维护系统的命名空间,包括文件到块的映射关系、访问日志等属性,以及元数据都存储在NameNode中。文件的基础信息存储在NameNode中,采用集中式存储方案。****NameNode定期通过心跳消息与每一个DataNode通信,给DataNode发送指令并收集其状态。****在HDFS集群中只能有一个NameNode,但是可以设置一个备份的SecondoryNameNode来保证系统的可靠性、容错性。DataNode提供文件内容的存储、操作功能。文件数据块本身存储在不同的DataNode中,DataNode可以分布在不同机架上。DataNode定期与NameNode通信,给NameNode发送状态并接收NameNode发送的指令。DataNode启动之后会扫描本地文件系统中块的个数,并将对应的块信息发送给NameNode。虽然HDFS集群采用主从结构,但客户端可以分别访问NameNode和DataNode,以获取文件的元数据及内容。HDFS集群的客户端可直接访问NameNode和DataNode,相关数据直接从NameNode或者DataNode传送到客端。
HDFS心跳机制
由于HDFS是master/slave结构,其中master包括namenode和resourcemanager,slave包括datanode和nodemanager。在master启动时会开启一个IPC服务,然后等待slave连接。当slave启动后,会主动以默认3秒一次的频率链接IPC服务。当然这个时间是可以调整的,这个每隔一段时间连接一次的机制,就是心跳机制(默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒)。slave通过心跳给master汇报自己信息,master通过心跳下达命令。具体来说就是:
Namenode通过心跳得知DataNode状态,Resourcemanager通过心跳得知nodemanager状态
当master很长时间没有收到slave信息时,就认为slave挂掉了。
读写流程
读取数据:
1.客户端申请某个位置的文件或者数据
2.NameNode相应申请,并且将文件和数据所在的DateNode节点信息列表返还给客户端
3.客户端根据节点信息去向DateNode申请数据的读取
4.DateNode相应成功给客户端
5.客户端开始申请读取block1
6.DateNode返回block1的数据
7.持续申请后面的其它block数据
8.DateNode持续返回剩下的其它数据
写入数据:
1.客户端申请写入一个数据
2.NameNode审核文件和数据的合法性
3.NameNode返回允许的相应
4.客户端开始申请写入
5.NameNode返回DateNode的节点信息
6.客户端找到DateNode开始申请写入数据
7.DateNode同意进行数据写入
8.客户端开始上传数据
8.1 DateNode开始向其它的DateNode申请备份
8.2 其它的DateNode同意备份
8.3开始备份
8.4完成备份
9.DateNode回应客户端表示写入成功
MapReduce
见名知意:计算引擎
与spark的区别就是MapReduce计算运行会经过磁盘也就是落盘的过程(shuffle),而spark是基于内存运行的
shuffle的基本流程:数据进行分区–sort排序–存入硬盘–从硬盘读取数据–聚合计算–数据排序
MapReduce分为五个阶段:input > map() > shuffile > reduce() >output
MapReduce的原理和流程:
input:先获取在计算过程中所需要的数据
split: 对大的数据进行切割的操作,将数据分成一块块的 block:128M
map: 数据的映射,将分配好的数据,给到不同的进程去运行
shuffle:每个进程对单独拿到的数据进行计算(对每个数据经i选哪个数据拆分(分区)并且进行排序),保存在硬盘上,从硬盘上读取数据,并且进行计算,结果再次排序)
reduce:将单独的数据进行总体汇总的计算过程
output:将计算结果输出工作原理:
0.MR(MapReduce)程序提交到客户端所在的节点
1.YarnRunner(本质上是一个动态代理对象。它负责将任务提交到YARN集群中)向ResourceManager申请一个Application。
2.RM将该应用程序的资源路径返回给YarnRunner。提供路径,运行所需资源需要提交到这上面。
3.该程序将运行所需资源提交到HDFS上。job.split切片,空值开启多少maptask。job.xml空值任务按这个参数进行运行。wc.jar(代码)。
4.程序资源提交完毕后,申请运行MR AppMaster.
5.RM将用户的请求初始化成一个 Task。放在任务队列。
6.ResourceManager就会分配一个NodeManager(NM)来运行任务。然后这个NodeManager领取到Task任务。
7.该NodeManager创建容器Container,并产生MR AppMaster。
8.Container从HDFS上拷贝资料到本地。拿job.split切片信息。
9.MRAppmaster向RM申请运行MapTask资源,图中例子两个。
10.RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器
11.MRAppMaster向两个接受任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,开始运行代码(无论运行MapTask还是ReduceTask,都是YarnChild中执行Task),执行完后按分区持久化到磁盘。
12.MRAppMaster等待所有MapTask运行完毕,向RM申请容器,运行ReduceTask,途中两个分区,开启两个ReduceTask。
13.ReduceTask向MapTask获取相应分区的数据,开始ReduceTask的执行。
14.程序运行完毕后,MRAppMaster会向RM申请注销自己,释放对应的资源。下面一个经典的“Hello World”例程—单词计数来分析MapReduce的逻辑,如下图 所示。一般的 MapReduce 程序会经过以下几个过程:输入(Input)、输入分片(Splitting)、Map阶段、Shuffle阶段、Reduce阶段、输出(Final result)
1、输入就不用说了,数据一般放在 HDFS 上面就可以了,而且文件是被分块的。关于文件块和文件分片的关系,在输入分片中说明。
2、输入分片:在进行 Map 阶段之前,MapReduce 框架会根据输入文件计算输入分片(split),每个输入分片会对应一个 Map 任务,输入分片往往和 HDFS 的块关系很密切。例如,HDFS 的块的大小是 128M,如果我们输入两个文件,大小分别是 27M、129M,那么 27M 的文件会作为一个输入分片(不足 128M 会被当作一个分片),而 129MB 则是两个输入分片(129-128=1,不足 128M,所以 1M 也会被当作一个输入分片),所以,一般来说,一个文件块会对应一个分片。Splitting 对应下面的三个数据应该理解为三个分片。
3、Map 阶段:这个阶段的处理逻辑就是编写好的 Map 函数,因为一个分片对应一个 Map 任务,并且是对应一个文件块,所以这里其实是数据本地化的操作,也就是所谓的移动计算而不是移动数据。如上图所示,这里的操作其实就是把每句话进行分割,然后得到每个单词,再对每个单词进行映射,得到单词和1的键值对。
4、Shuffle 阶段:这是“奇迹”发生的地方,MapReduce 的核心其实就是 Shuffle。那么 Shuffle 的原理呢?Shuffle 就是将 Map 的输出进行整合,然后作为 Reduce 的输入发送给 Reduce。简单理解就是把所有 Map 的输出按照键进行排序,并且把相对键的键值对整合到同一个组中。如上图所示,Bear、Car、Deer、River 是排序的,并且 Bear 这个键有两个键值对。
5、Reduce 阶段:与 Map 类似,这里也是用户编写程序的地方,可以针对分组后的键值对进行处理。如上图所示,针对同一个键 Bear 的所有值进行了一个加法操作,得到 <Bear,2> 这样的键值对。
6、输出:Reduce 的输出直接写入 HDFS 上,同样这个输出文件也是分块的。
Yarn
见名知意:资源调度
为一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
架构:
1、ResourceManager(RM)
RM是一个全局的资源管理器,负责整个系统的资源管理和分配。主要由两个组件构成:调度器(Scheduler)和应用程序管
理器(ASM)。
(1)调度器
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的任务等,即调度策略),将系统中的资
源分配给各个正在运行的程序。该调度器是“纯调度器”,它不再从事任何与具体应用程序相关的工作。调度器仅根据各个应用
程序的资源需求进行资源分配,资源分配单位用一个抽象概念“资源容器(简称Container)”表示,Container将内存、CPU、
磁盘、网络等资源封装在一起。
(2)应用程序管理器
应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动AM、监控AM运行状态并在
失败时重启程序等。
2、ApplicationMaster(AM)
提交的每个应用程序包含一个AM,主要功能包括:
与RM调度器协商获取资源(用Container表示);
为应用程序申请资源并分配给内部的任务;
与NM通信以启/停任务;
监控所有任务状态,并在任务失败时重新申请资源以重启任务;
3、NodeManager(NM)
NM是每个节点上的资源和任务管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状
态;另一方面,它接收并处理来自AM的Container启动/停止等各种请求。
4、Container
Container 是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源
时,RM为AM返回的资源便是用 Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中
的资源。
工作流程:
1、向YARN提交应用程序;
2、RM分配第一个Container,并与对应的NM通信,要求它在这个Container启动应用程序的ApplicationMaster;
3、AM首先向RM注册,通过RM可以查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直至
运行结束;
4、AM采用轮询的方式通过RPC协议向RM申请和领取资源;
5、一旦AM申请到资源后,便与对应的NM通信,要求它启动任务;
6、NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该
脚本启动任务;
7、各个任务通过RPC协议向AM汇报自己的状态和进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重启
任务;
8、应用程序运行完成后,AM向RM注销并关闭自己。
Yarn和MapReduce之间的工作流程如下:
1、客户端向Yarn ResourceManager(RM)提交一个应用程序,该应用程序包含MapReduce作业。
2、RM将应用程序提交给一个NodeManager(NM),该NM启动一个ApplicationMaster(AM)来管理该应用程序。
3、AM向RM请求资源,以便为MapReduce作业分配容器(Container)。
4、RM将可用的资源信息发送给AM。
5、AM根据任务的需求,将容器分配给Mapper或Reducer任务。
6、每个容器拥有一定数量的资源,例如CPU、内存和磁盘空间等。
7、Mapper任务读取输入数据,并将其转换为键-值对。
8、Mapper任务将生成的键-值对写入本地磁盘,并向Reducer任务发送。
9、Reducer任务根据键对键-值对进行分组,并对每个组进行聚合操作。
10、Reducer任务将生成的输出写入HDFS。
11、一旦MapReduce作业完成,AM将释放所有容器,并向RM发送作业的完成状态。
12、RM将作业的状态更新到作业历史记录中。
HDFS和MapReduce之间的工作流程如下:
1、HDFS存储数据:首先,HDFS将大规模数据划分为小块,然后将这些小块存储在不同的节点上,以实现数据的冗余备份和高可用性。
2、MapReduce处理数据:MapReduce作为数据处理框架,将数据处理分为两个阶段,即Map阶段和Reduce阶段。在Map阶段中,每个节点都会将自己所存储的数据进行处理,并将结果输出到中间结果存储区。在Reduce阶段中,将从Map阶段中产生的中间结果进行合并和排序,最终得到最终的结果。
3、数据传输:在上述两个阶段中,数据需要在不同的节点之间进行传输和交换。因此,HDFS会提供高效的数据传输机制,以保证数据传输的速度和可靠性。
4、任务调度和监控:在整个过程中,MapReduce会对任务进行调度和监控,确保任务的执行顺序和正确性。同时,MapReduce还会对任务执行情况进行监控和统计,以便及时发现和解决问题。
5、结果输出:最终,结果将输出到指定的输出路径,以供后续的分析和应用。
调度器
先进先出调度器(FIFO Scheduler):这种调度器按照任务的到达时间对任务进行排序,即最先进入队列的任务首先执行,直到任务完成或时间片用完为止。它不考虑任务的优先级或资源消耗,只是简单地将任务分配到队列中。
容量调度器(Capacity Scheduler):这种调度器根据资源消耗情况将集群分成多个容量,然后将每个队列分配到每个容量中。容量调度器可以根据队列的优先级和容量利用率来分配任务。
公平调度器(Fair Scheduler):这种调度器根据任务的需求和资源消耗情况分配执行任务的容器,不会将任务集中在特定的节点或队列中。Fair调度器还支持多租户支持,以确保每个用户都有足够的资源和公平使用集群。像容量调度器一样,它也支持队列。
总的来说,FIFO调度器按照任务的到达顺序对任务进行调度,不考虑任何其他因素;容量调度器将集群分为多个容量,寻找可用资源来分配任务;公平调度器将任务平均分配给各个队列,确保系统是高效利用的,且公平公正性。