一、HDFS架构概述
1、HDFS定义
HDFS(Hadoop Distributed File System) 是一种分布式文件系统,用于处理在商业硬件上运行的大型数据集。 它用于将单个 Apache Hadoop 集群扩展到数百 (甚至数千)个节点。
HDFS 是 Apache Hadoop 的主要组件之一,其他组件包括 MapReduce 和 YARN。
HDFS的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
2、HDFS组成
HDFS由NameNode(主节点)、SecondaryNameNode(辅助节点)、DataNode(从节点)构成,
其中NameNode负责管理整个HDFS集群,SecondaryNameNode辅助NameNode管理元数据,DataNode负责存储实际的数据块(一个block块默认大小128MB)和对数据块的读、写操作。
2.1Block块
每一个文件可以配置副本数量,默认是3,副本的作用是防止因某个DataNode挂掉或磁盘损坏而导致数据丢失,除此之外块副本还可以提高块可读取的节点,提高mapreduce计算任务向数据移动的概率。
因为同一个DataNode放置相同的块数据是没有意义的,所以NameNode不允许DataNode具有同一块的多个副本,即副本数量配置不能大于DataNode节点的数量。
每个文件可以在写入时指定这个文件块的副本数量,也可以在未来修改某个文件的块副本数量,文件块的副本数量配置作为块元数据的一部分保存在NameNode中。
3.HDFS的特点
- 心跳机制
DataNode会定时(3秒)向NameNode发送心跳包,告知NameNode自己的还在活跃,如果超过一定时间(630秒)NameNode未收到DataNode的心跳包,就会认为该DataNode宕机了,此时会该DataNode的数据块交由其他活跃的DataNode储存。所有的DataNode每6个小时向NameNode汇报一次自己完整的数据块信息,供NameNode校验更新。
- 负载均衡
NameNode会保证所有的DataNode的资源使用率尽量一致。
- 副本机制
DataNode存储的数据块默认副本数量是3份,如果当前副本总数大于默认副本数,NameNode会自动删除某个副本,如果当前副本数少于默认副本数则会自动增加。如果当前活跃的机器总数小于默认副本数,NameNode会强制进入安全模式,在安全模式下数据只能读不能写。
更多配置,详见Hadoop官方文档:hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
4.HDFS写数据流程
1. Client(客户端)请求namenode保存文件。
2. NameNode接收到客户端请求后, 会校验客户端针对该文件是否有写的权利,文件是否存在,校验通过后告知客户端可以上传。
3. 接收到可以上传的指令后, 客户端会按照128MB(默认)对文件进行切块。
4. Client(客户端)再次请求namenode, 第1个Block块的上传位置。
5. namenode会根据副本机制, 负载均衡, 机架感知原理及网络拓扑图, 返回给客户端存储该Block块的DataNode列表。
例如: node1, node2, node3;
6. Client(客户端)会先连接就近的datanode机器, 然后依次和其他的datanode进行连接, 形成传输管道(Pipeline);
7. 采用数据报包(DataPacket)的形式传输数据, 每个包的大小不超过64KB, 并建立反向应答机制(ACK机制);
8. 具体的上传动作: node1 -> node2 -> node3, ACK反向应答机制: node3 => node2 => node1。
9. 重复上述的步骤, 直至第1个Block块上传完毕。
10. 第一个Bloc上传完毕客户端(Client)重新请求第二个Block的上传位置, 重复上述动作, 直至所有的Block块传输完毕。
至此, HDFS写数据流程结束。
5.HDFS读数据流程
1. Client(客户端)请求namenode, 读取文件。
2. NameNode校验该客户端是否有读权限, 及该文件是否存在, 校验成功后, 会返回给客户端该文件的块信息。
例如:
block1: node1, node2, node5
block2: node3, node6, node8
block3: node2, node5, node6 这些地址都是鲜活的;
......
3. Client(客户端)会连接上述的机器(节点), 并行的从中读取块的数据。
4. Client(客户端)读取完毕后, 会循环NameNode获取剩下所有的(或者部分的块信息), 并行读取, 直至所有数据读取完毕。
5. Client(客户端)根据Block块编号, 把多个Block块数据合并成最终文件即可。
6.HDFS工作原理
1、NameNode初始化时会产生一个edits文件和一个fsimage文件。
2、随着edits文件不断增大,当达到设定的阀值时(1个小时或写入100万次),SecondaryNameNode把edits文件和fsImage文件复制到本地,同时NameNode会产生一个新的edits文件替换掉旧的edits文件,这样以保证数据不会出现冗余。
3、SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件(这个过程称为checkpoint),合并完成后,再将fsImage.ckpt文件推送给NameNode。
4、NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉(并不会立刻替换,而是达到一定阈值后被替换掉),并且改名成fsimage文件。
通过以上几步则完成了edits和fsimage文件的合并,依此不断循环,从而到达保证元数据的正确性。在紧急情况下, SecondaryNameNode可以用来恢复namenode的元数据。
二、MapReduce概述
MapReduce是一种分布式计算框架。
1.MR的执行流程
1. MR任务分为MapTask任务 ReduceTask任务两部分, 其中MapTask任务负责:分; ReduceTask任务负责合。
- 1个切片(默认128MB) = 1个MapTask任务 = 1个分好区, 排好序, 规好约的磁盘文件;
2. 先对文件进行切片, 每个切片对应1个MapTask任务, 任务内部会逐行读取数据, 交由MapTask任务来处理。
3. MapTask对数据进行分区,排序,规约处理后, 会将数据放到1个 环形缓冲区中(默认大小: 100MB, 溢写比: 0.8), 达到80MB就会触发溢写线程。
4. 溢写线程会将环形缓冲区中的结果写到磁盘的小文件中, 当MapTask任务结束的时候, 会对所有的小文件(10个/次)合并, 形成1个大的磁盘文件。
5. ReduceTask任务会开启拷贝线程, 从上述的各个结果文件中, 拉取属于自己分区的数据, 进行分组、统计、聚合。
6. ReduceTask将处理后的结果, 写到结果文件中;
- 1个分区 = 1个ReduceTask任务 = 1个结果文件;
三、YARN架构概述
YARN是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作平台,而Mapreduce等运算程序相当于运行在操作系统之上的应运程序。
YARN组成由ResourceManager、AppMaster进程、NodeManager组成
- ResourceManager(主节点)
负责接收计算任务、资源调度和分配
- AppMaster进程
1个计算任务=1个AppMaster进程
由该AppMaster进程来监控和管理该计算任务
- NodeManager(从节点)
负责接收并执行ResourceManager分配的计算任务
四、三者之间的关系
客户端Client提交任务到资源管理器(ResourceManager),资源管理器接收到任务之后去NodeManager节点开启任务(ApplicationMaster), ApplicationMaster向ResourceManager申请资源, 若有资源ApplicationMaster负责开启任务即MapTask。开始干活了即分析任务,每个map独立工作,各自负责检索各自对应的DataNode,将结果记录到HDFS, DataNode负责存储,NameNode负责记录,2nn负责备份部分数据。文章来源:https://www.toymoban.com/news/detail-830935.html
文章来源地址https://www.toymoban.com/news/detail-830935.html
参考
- HDFS Architecture
- Hadoop原理之——HDFS原理
- HDFS架构和原理
- HDFS 详解一(原理篇)
到了这里,关于HDFS、YARN、MapReduce概述及三者之间的关系(图解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!