HDFS读写流程

分布式系统那么多,为啥要在开发一个HDFS

架构设计

HDFS是一个主从架构

由一个NameNode和一些DataNode组成

面向文件包含:文件数据(data)和文件元数据(metadata)–》类似属性

NameNode负责存储和管理文件元数据,并维护了一个层次型的文件目录树

DataNode负责存储文件数据(block块),并提供block的读写

DataNode与NameNode维持心跳,并汇报自己持有的block信息

Client和NameNode交互文件元数据和DataNode交互文件block数据

HDFS:目录树结构
在这里插入图片描述
一个集群的数量最好不要超过5000台

NameNode 控制节点

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

需要持久化方案保证数据可靠性

提供副本放置策略

DataNode 存储的节点

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

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

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

数据持久化

**日志文件:**记录事实发生的增删改查的操作,完整性比较好,是文本文件

加载恢复:慢/占空间

会通过日志重写来删除一些重复的动作

镜像,快照,dump,db(序列化)

内存全量数据基于某一个时间点做的向磁盘的溢写

I/O:慢

恢复速度快过日志文件,是二进制文件,因为是间隔的会丢失一部分数据

HDFS:(同时使用了两个)

EditsLog: 日志 —》体积小记录少,必然有优势

FsImage: 镜像,快照 --》如果能更快的滚动更新时间点

​ 最近时间的FsImage+增量的EditsLog

HDFS的真实操作

在这里插入图片描述

安全模式

HDFS搭建时会格式化,格式化一个操作会产生一个FsImage

当Namenode启动时他从硬盘中读取EditsLog和FsImage

将所有的EditsLog中的事务作用在内存中的 FsImage上

并将这个新版本的FsImage从内存中保存到本地磁盘上

然后删除旧的EditsLog,因为这个旧的EditsLog的事务都已经作用在FsImage上了


Namenode启动后会进入一 个称为安全模式的特殊状态

处于安全模式的Namenode是不会进行数据块的复制的

Namenode从所有的Datanode接受心跳信号和块状态报告

每当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全的

在一定百分比(这个数据可修改)的数据块被Namenode检测确认是安全按的之后(加上一个额外的30秒等待时间),Namenode会退出安全模式

接下来他会确定还有那些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上

HDFS中的SNN(合并操作 )

SecondaryNameNode(SNN)

在非Ha模式下(Ha模式 高可用模式)。SNN 一般是独立的节点,周期完成对NN的EditLog向FsImage合并,减少DditLog大小,减少NN 启动时间

跟据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒

跟据配置文件设置edits log大小fs.checkpoint.size规定 edits文件的最大值默认是64M

流程详解

在这里插入图片描述

Block的副本方式策略

第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点上

第二个副本:放置在第一个副本不同的机架节点上

第三个副本:放置在与第二个副本相同的机架的节点

更多副本:随机节点

横着的服务器叫做机架服务器,一个柜子样的叫做刀片服务器

HDFS读写流程

HDFS读流程

在这里插入图片描述
在2.create的时候会触发副本放置策略 ,namenode给客户端返回了3个datanode放置位置

不是客户端跟3个datanode建立连接,而是第1个连接第二个,第二个连接第三个,因为客户端给datanode传输的时候传输的是一个一个的小包,连续传递时会节省时间。 (客户端给datanode1传第二个包的时候,datanode1同时给datanode2传第一个包,流式传输,以此类推 ) 是一种变种的并行

传输速率极高

如果其中一个datanode挂掉怎么办,直接跳过传输, 心跳的时候返回 状况

HFDS写流程-解释

Client和NN 连接创建文件元数据

NN判定元数据是否有效

NN触发副本防治策略,返回一个有序的DN列表

Client和DN建立一个Pipeline连接

Client将块切分成packet(64M),并使用chunk(512B)+chunksum(4B校验和)填充

Client将packet放入发送队列dataqueue中,并向第一个DN发送

第一个DN收到packet后本地保存并发送给第二个DN

第二个DN 收到packet后本地保存并发送给第三个DN

这一个过程中,上游节点同时发送下一个packet

生活中类比工厂中的流水线,流式计算也是一种变种的并行计算

HDFS使用这种传输方式,副本相对于client是透明的

当block传输完成DN们各自向NN 汇报,同时client继续传输下一个block

所以,client的传输和block的汇报也是并行的

HDFS读流程

在这里插入图片描述
为了降低整体的宽带消耗和读取延时,HDFS会尽量让读取程序读取离他最近的副本

如果在读取程序的同一个机架上有一个副本,那么就读取该副本

如果一个HDFS集群跨越多个数据中心,那么客户端也将首先都本地数据中心的副本

语义;下载一个文件:

​ Client和NN 交互元数据获取fileBlockLocation

​ NN会按距离策略排序返回

​ Cilent尝试block并校验数据的完整性

下载一个文件其实是获取文件的所有block元数据,那么自己获取某些block应该成立

HDFS支持client给出面向文件的offset(偏移量)自定义连接那些block对应的DN,自定义获取数据

这个是支持计算层的分治,并行计算的核心

**小问题:**9999999999占多大字节

文件编码:txt byte 9个字节

int a=999999999 4个字节 《 二进制文件

从现在开始,有的人已经选择了放弃,有的人会留下,留下的人其实懂得也不多,只要坚持做,做了别人不做的事情,你就一定是神

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值