HDFS原理总结

HDFS:架构图

img

1.block:文件存储到hdfs上时被切分成若干个数据块,每个block数据块的大小默认128M(hdfs-1.x默认:64M)

​ 如果文件不到128M,则可以单独存成一个block。每一个块都有3个副本(一共三个)存储在datanode

​ 上。3个副本的存储策略:第一个存储在当前机架上的节点选择磁盘不满、cpu不忙的节点,第二个存储

​ 在不同机架上,第三个存储在同第二个机架的不同节点。

**2.datanode:**存放数据块的信息,当datanode启动时向namenode汇报块信息,保持和namenode的心跳机制

​ 当namenode超过10分钟没有收到datanode的汇报信息时,则会认为改datanode丢失,此时

​ namenode会寻找一个新的datanode并从拥有改block块的其他副本上拷贝block块至新的

​ datanode上。

**3.namenode:**namenode等待接受客户端的写入写出,同时接受datanode的汇报信息,与datanode保持着心

​ 条机制。namenode上保存着目录树,其中包括文件信息,文件分割成具体block块的信息,

​ 以及每一个block块归属datanode的信息。这些信息不会被持久化,需要每次启动时datanode的汇报

​ namenode使用内存作为存储介质。优点:计算速度快 缺点:内存中的数据掉电易失、内存的大小限制

​ namenode的存储量,如果内存被占满将无法存储数据。当namenode启动的时候会在fsimage的基础上

​ 执行一遍日志文件,然后创建一个新的空的fsimage。namenode的每一个操作都会记录在日志文件里,

​ 长时间造成日志文件过大,导致namenode启动时间过长,此时出现了secondarynode。同时nameno

​ de启动时会进入安全模式,当namenode和datanode进行完心跳机制后,namenode上存储玩所有的

​ datanode的元数据信息,并进行检测完成后,namenode解除安全模式可进行正常的读写操作。

​ secondarynamenode日志合并图:

img

4.secondarynamenode

​ sn会定时将fsimage和edites文件合并(触发点:默认日志文件64M,或者1个小时,这个参数可以调)

​ 当触发条件时,sn会将fsimage从namenode上拷贝一份到sn上,将日志文件拷贝到sn上,进行合并,

​ 生成fsimage.ckpt 将其拷贝给namenode,namenode会将fsimage覆盖原fsimage。

hdfs的读写流程:

  1. hdfs的读流程

    img

1.客户端会发一个rpc请求到namenode上,namenode会返回要读取文件的block块信息,和block块所在 datanode的信息。

2.客户端得到这个信息后会创建一个fsdatainputstream对象

3.客户端会选择距离客户端最近的datanode来读取block,如果客户端本身就是datanode那么将从本地读取

每次读取完一个block块时都会进行checksum验证,如果读取datanode出错时,客户端便会通知namenode

然后再从下一个拥有改block块的datanode读取。

4.当读取完后会关闭与datanode的链接,并寻找下一个要读取的block块的最佳datanode

5.当读取完列表的block后,文件还没有结束,会向namenode再次发送信息,获取下一批block信息。

2.hdfs的写操作

img

1…客户端会发一个rpc请求到namenode上,namenode会检查要创建的文件是否存在,创建是否有权限进行创建如果成功则会创建一个文件,如果失败则会抛出一个异常,并且创建一条记录

2.客户端得到这个信息后会创建一个fsdataoutputstream对象

3.要写入的文件会被切分成多个packets,并且内部使用dataqueue数据队列的形式,同时客户端会向namenode申请新的blocks获取这些适合存储的datanode列表

4.此时客户端会和datanode创建pipeline,将一个个packets写入datanode中一个packets64b大小,当写入一个packets第一个datanode会向第二个datanode写入以此类推,同时客户端还继续给第一个datanode发送packets

当一个packets成功存储后会犯一个ack packets 通过pipeline传给客户端,此时客户端(内部维护着一个ack queue)便会删除其内的客户端通过ack queue删除相对应的ack packet

个ack packets 通过pipeline传给客户端,此时客户端(内部维护着一个ack queue)便会删除其内的客户端通过ack queue删除相对应的ack packet

5.如果传输过程中,某个datanode出现故障,那么当前的pipeline会被关闭,出现故障的datanode从当前的pineline中移除,剩余的block会继续给剩下的datanode继续以pipeline形式进行传输,同时namenode会分配一个新的datanode,进行拷贝已经传输完成的datanode上的数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值