Hadoop01 Hdfs  基础知识

HDFS是主从架构,由NameNode管理文件元数据,DataNode存储数据块。文件按块切分存储,副本策略确保可靠性。NameNode通过元数据持久化保证一致性,安全模式保护数据安全性,副本放置策略优化读写效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式文件系统那么多 为啥还要开发一个hdfs?

分块存储 由于有NameNode 存在 可以根据文件读取的偏移量计算出 当前需要读取的数据在哪一个DataNode中 直接读,不需要读取整个文件。这也是分布式并行计算的核心

1存储模型

文件按字节切割成块(block) 具有offset id

文件与文件的块大小可以不一样

文件除了最后一个块 其他的块大小一样

块的大小依据硬件IO的特性调整

块被分散存放在集群的节点中,具有location

块 有副本 没有主从概念 副本不能出现在一个节点

副本是满足可靠性和性能的关键

文件上传可以指定块的大小和副本数量 上传后只能修改副本数

一次写入 多次读取 不支持修改

支持追加数据

2架构设计

HDFS是主从架构

由一个NameNode(主)和一些DateNode(从)组成

面向文件包含:元数据(metadata) 和数据 (data)

NameNode负责存储文件元数据 (文件叫什么 的大小 切成多少块 存在哪 ) 并维护了一个文件的层次树

DataNode 负责存储文件块 并负责块读写

DataNode 和NameData 有心跳维护 并且DataNode 并根据持有的块进行汇报给NameNode

Client 和Name交互元数据 和DataNode交互 块数据

3角色功能

NameNode

完全基于内存的存储文件元数据、目录结构、文件块映射

需要持久化方案保证一致性

提供副本防止策略

DataNode

基于本地磁盘存储(文件形式)

保存块的校验和数据保证块的可靠性

与NameNode保持心跳 汇报块列表状态

SNN

由于NameNode 存放在内存中会造成数据丢失,所以NameNode会把数据持久化到EditLog中,而长时间的运行导致EditLog 过大,重启NameNode 加载时间过长 所以 在保存时,可以设置EditLog生成的时间和大小,而磁盘化时会生成两个文件 一个EditLog,一个fsImage, 比如 当刚开机时生成editlog001 和fsImage001 ,当运行一个小时,editlog中会持续记录一小时的数据变化,fsImage为空,此时SNN会拉取两个文件 ,并合成fsIMage002,发送给NameNode所在的节点,同时 NameNode中的数据变化会记录在editlog002中 。SNN 合并完成后的fsImage002 发送给Namenode 所在服务器,当第三个小时 SNN会拉取editlog 和fsimage 合成003 。。 这样NameNode在重启时候 只需要加载最新的fsImage 和最新的editlog就可以了。当然 不一定是一个小时拉取,也可能是达到了日志设置的大小限制。

4元数据持久化

元数据保存在内存 不可靠 需要持久化

5安全模式

  安全模式是 HDFS 所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求,是一种保护机制,用于保证集群中的数据块的安全性。

  在NameNode主节点启动时,HDFS首先进入安全模式,集群会开始检查数据块的完整性。DataNode 在启动的时候会向 namenode 汇报可用的 block 信息,当整个系统达到安全标准时,HDFS 自动离开安全模式。

  假设我们设置的副本数(即参数 dfs.replication)是 5,那么在 Datanode 上就应该有5 个副本存在,假设只存在 3 个副本,那么比例就是 3/5=0.6。在配置文件 hdfs-default.xml中定义了一个最小的副本的副本率(即参数 dfs.namenode.safemode.threshold-pct)0.999。

  我们的副本率 0.6 明显小于 0.99,因此系统会自动的复制副本到其他的 DataNode,使得副本率不小于 0.999.如果系统中有 8 个副本,超过我们设定的 5 个副本,那么系统也会删除多余的 3 个副本。

  如果 HDFS 处于安全模式下, 不允许HDFS 客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹,修改副本数等操作。

6副本放置策略

第一个副本 放置在上传文件的DataNode,如果是集群外提交 则选择一台内存不太满 CPU不太高

第二个放在不同于第一个副本的机架的节点上 防止机架断电

第三个放在第二个相同的机架上 (机架间数据传输需要通过交换机 放在其他机架 传输成本高)

1.x版本 第二个放在同一个机架上 导致副本为2时候机架断电不能访问2.x进行修改第二个副本出机架

7读写流程

写流程

1 client与NameNode通讯 NameNode创建元数据 ,判断是否为有效的元数据 (比如文件是否已经存在等等) 返回需要存储的副本块列表 触发上面的副本放置策略,返回一个有序的DataNode 列表

2 client 与第一个副本1的DataNode 建立TCP链接 ,副本1与副本2 建立链接 ,副本2与副本3建立链接 形成pipline

3 比如块的大小是10M Client传输的数据将会被切割成更小的包packet(默认64K) 形成传输流。Chunk(512B) 和ChunkSum (4B校验和) 组成packet,然后放入发送队列,当 64K packet取完后进行发送。

4 当block传输完成后,DataNode 像各自的NameNode汇报 ,同时client 继续传输下一个Packet

5 如果副本1 掉了 Client 将会与DataNode2进行链接继续传输 ,DataNode2掉了 DataNode1与3进行链接 保证至少一个packet 至少有一个上传成功。

3 DataNode上报NameNode自己拥有的块,如果发现传输的过程中缺少了某些块,会在在其他的DataNode 复制缺少的包给补全。

读流程

1 与NameNode请求块信息,会按照就近策略返回DataNode

2 就近读取块信息

3 可以并发下载多个块 (效率极高)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值