HDFS源码二次开发

持续更新中~~

第1章 HDFS架构设计

1.1.HDFS架构概述

1.2.HDFS架构存在的问题

1.3.单点故障的架构解决方案

1.4.内存受限的架构解决方案

1.5.HDFS支持亿级流量的秘密

1.6.HDFS元数据管理流程

1.7.HDFS1和HDFS2元数据合并机制

第1章 HDFS架构设计

1.1.HDFS架构概述

 

HDFS解决的是海量数据的存储问题,在HDFS出现以前,数据存储采用的是集中式存储,即存储在单台计算机服务器之上,扩大存储资源则是加磁盘。HDFS则另辟蹊径,采用分布式存储,将文件切分,然后分开存储在多台廉价的服务器之上,扩大存在资源则是增加廉价机器即可,理论上让存储资源变得无上限。

HDFS是主从架构,主节点称为namenode,负责元数据目录树的管理,响应客户端元数据读写请求,接受从节点datanode的注册和心跳;从节点datanode,负责存储、读写数据,向namenode报告自身状况。

主从式架构实现简单,能够解决海量数据的存储问题,很多大数据技术采用的都是主从式架构,比如HBase、Yarn、MapReduce、Spark、Flink等,其本质思想索引,用小资源管理大体量。

HDFS架构图如下:

 

HDFS架构图

 

 

1.2.HDFS架构存在的问题

 

值得一提,为了保证NameNode高并发,在NameNode的内存里面是存储了一份完整的元数据镜像,在HDFS集群正常运行过程中,对于元数据的读写操作都基于内存进行的。

一方面,管理元数据的NameNode存在单点故障问题;另一方面,随着HDFS存储数据量的增加,NameNode元数据量也随之增加,NameNode存储元数据所需的内存是受限的。

接下来,我们便是讨论解决这两个问题的架构解决方案。

 

1.3.单点故障的架构解决方案

 

解决单点故障最直接的方法就是变单点为两点,甚至多点。HDFS采取的方案是变单点为两点,将NameNode分为Active和StandBy两种类型,其中只有Active NameNode对外提供服务。

要实现这种方案,需要解决两个棘手的问题,其一,两个NameNode需状态保持一致;其二,当Active NameNode出现异常时,切换到StandBy NameNode并把状态改为Active NameNode。

架构图如下:

 

HDFS单点故障的HA架构

 

1.4.内存受限的架构解决方案

 

我们知道,为了快速响应客户端请求,NameNode将元数据存储在内存中,但是机器的内存始终有限,随着HDFS机器存储数据量的增加,NameNode内存大小将会成为瓶颈。

解决NameNode内存受限的思路是将元数据切分并存储到不同的NameNode节点之上,抽象一下就是对元数据也进行切片备份。切片是指将元数据切分成多分,放到不同的NameNode节点之上;备份是指NameNode的高可用方案。

HDFS解决NameNode内存受限采用的就是此方案,被称为联邦模式,架构图如下:

最佳实践,一般1000台节点,采用HA高可用方案足以。1000台以上,如果HA不满足需求,则可以考虑联邦架构方案。

 

HDFS联邦架构

 

1.5.HDFS支持亿级流量的秘密

 

为什么说HDFS支持亿级流量呢?用户所有的请求都要操作NameNode管理的元数据,大一点的平台每天的调度任务有几十万,甚至上百万个,每个任务又有多个请求。

为了支持亿级流量,HDFS的元数据处理流程采用了双缓存方案,利用了服务器写内存的高性能以及批量顺序写磁盘的高性能。

 

1.6.HDFS元数据管理流程

 

我们知道内存中的数据易丢失,因此自然会想到把元数据操作日志Editlog存储到磁盘上,此外NameNode还会将元数据操作日志Editlog写到JournalNode集群。

一旦涉及到写磁盘,那就意味着慢,在NameNode需要抗住亿级流量的背景下,直接写磁盘的方式显然是不可取的。

因此,HDFS采取了双缓冲方案来解决这个问题,将直接写磁盘的操作转化为写内存和批量刷写磁盘的操作,双缓冲架构图如下:

 

元数据管理的双缓冲方案

 

1.7.HDFS1和HDFS2元数据合并机制

 

为什么会进行元数据合并?我们知道内存中的元数据安全性得不到保障,一旦遇到服务故障或机器故障,就会导致内存中的元数据丢失。因此,NameNode在把元数据写入内存的同时,会把元数据的操作日志写入到磁盘,以便在内存元数据丢失的情况下依然能够恢复出完整的元数据。因此,这就产生了元数据的合并的场景。

什么时候会进行元数据合并?HDFS集群启动的时候,NameNode会对Editlog中的操作日志进行回放,从而生成最新的元数据。但是,如果Editlog操作日志量太大,就会导致集群启动缓慢,因此,HDFS引入了CheckPoint机制,定期对元数据进行合并,从而减少集群启动是合并元数据所需的时间。

在HDFS1中是通过SecondaryNameNode节点实现checkpoint机制的,架构图如下:

SNN的checkpoint机制

在HDFS2中由于存在standBy NameNode,因此定期合并元数据的操作并转移到此节点上,架构图如下:

HA架构下的元数据合并

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
第1章 HDFS 1 1.1 HDFS概述 1 1.1.1 HDFS体系结构 1 1.1.2 HDFS基本概念 2 1.2 HDFS通信协议 4 1.2.1 Hadoop RPC接口 4 1.2.2 流式接口 20 1.3 HDFS主要流程 22 1.3.1 HDFS客户端读流程 22 1.3.2 HDFS客户端写流程 24 1.3.3 HDFS客户端追加写流程 25 1.3.4 Datanode启动、心跳以及执行名字节点指令流程 26 1.3.5 HA切换流程 27 第2章 Hadoop RPC 29 2.1 概述 29 2.1.1 RPC框架概述 29 2.1.2 Hadoop RPC框架概述 30 2.2 Hadoop RPC的使用 36 2.2.1 Hadoop RPC使用概述 36 2.2.2 定义RPC协议 40 2.2.3 客户端获取Proxy对象 45 2.2.4 服务器获取Server对象 54 2.3 Hadoop RPC实现 63 2.3.1 RPC类实现 63 2.3.2 Client类实现 64 2.3.3 Server类实现 76 第3章 Namenode(名字节点) 88 3.1 文件系统树 88 3.1.1 INode相关类 89 3.1.2 Feature相关类 102 3.1.3 FSEditLog类 117 3.1.4 FSImage类 138 3.1.5 FSDirectory类 158 3.2 数据块管理 162 3.2.1 Block、Replica、BlocksMap 162 3.2.2 数据块副本状态 167 3.2.3 BlockManager类(done) 177 3.3 数据节点管理 211 3.3.1 DatanodeDescriptor 212 3.3.2 DatanodeStorageInfo 214 3.3.3 DatanodeManager 217 3.4 租约管理 233 3.4.1 LeaseManager.Lease 233 3.4.2 LeaseManager 234 3.5 缓存管理 246 3.5.1 缓存概念 247 3.5.2 缓存管理命令 247 3.5.3 HDFS集中式缓存架构 247 3.5.4 CacheManager类实现 248 3.5.5 CacheReplicationMonitor 250 3.6 ClientProtocol实现 251 3.6.1 创建文件 251 3.6.2 追加写文件 254 3.6.3 创建新的数据块 257 3.6.4 放弃数据块 265 3.6.5 关闭文件 266 3.7 Namenode的启动和停止 268 3.7.1 安全模式 268 3.7.2 HDFS High Availability 276 3.7.3 名字节点的启动 301 3.7.4 名字节点的停止 306 第4章 Datanode(数据节点) 307 4.1 Datanode逻辑结构 307 4.1.1 HDFS 1.X架构 307 4.1.2 HDFS Federation 308 4.1.3 Datanode逻辑结构 310 4.2 Datanode存储 312 4.2.1 Datanode升级机制 312 4.2.2 Datanode磁盘存储结构 315 4.2.3 DataStorage实现 317 4.3 文件系统数据集 334 4.3.1 Datanode上数据块副本的状态 335 4.3.2 BlockPoolSlice实现 335 4.3.3 FsVolumeImpl实现 342 4.3.4 FsVolumeList实现 345 4.3.5 FsDatasetImpl实现 348 4.4 BlockPoolManager 375 4.4.1 BPServiceActor实现 376 4.4.2 BPOfferService实现 389 4.4.3 BlockPoolManager实现 396 4.5 流式接口 398 4.5.1 DataTransferProtocol定义 398 4.5.2 Sender和Receiver 399 4.5.3 DataXceiverServer 403 4.5.4 DataXceiver 406 4.5.5 读数据 408 4.5.6 写数据(done) 423 4.5.7 数据块替换、数据块拷贝和读数据块校验 437 4.5.8 短路读操作 437 4.6 数据块扫描器 437 4.6.1 DataBlockScanner实现 438 4.6.2 BlockPoolSliceScanner实现 439 4.7 DirectoryScanner 442 4.8 DataNode类的实现 443 4.8.1 DataNode的启动 444 4.8.2 DataNode的关闭 446 第5章 HDFS客户端 447 5.1 DFSClient实现 447 5.1.1 构造方法 448 5.1.2 关闭方法 449 5.1.3 文件系统管理与配置方法 450 5.1.4 HDFS文件与操作方法 451 5.1.5 HDFS文件读写方法 452 5.2 文件读操作与输入流 452 5.2.1 打开文件 452 5.2.2 读操作――DFSInputStream实现 461 5.3 文件短路读操作 481 5.3.1 短路读共享内存 482 5.3.2 DataTransferProtocol 484 5.3.3 DFSClient短路读操作流程 488 5.3.4 Datanode短路读操作流程 509 5.4 文件写操作与输出流 512 5.4.1 创建文件 512 5.4.2 写操作――DFSOutputStream实现 516 5.4.3 追加写操作 543 5.4.4 租约相关 546 5.4.5 关闭输出流 548 5.5 HDFS常用工具 549 5.5.1 FsShell实现 550 5.5.2 DFSAdmin实现 552

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值