文件线性桉字节切割成块(block),具有offset,id文件和文件的block大小可以不一样一个文件除最有一个block,其他block大小一致block的大小依据硬件的I/O特性调整block被分散存放在集群的节点中,具有locationblock具有副本(replication),没有主从概念,副本不能出现在同一个节点副本是满足可靠性和性能的关键文件上传可以指定block大小和副本数,上传后只能修改副本数一次写入多次读取,不支持修改支持追加数据 架构设计
HDFS是一个主从(master/slaves)架构由一个namenode和一些datanade组成面向文件包含:文件数据(data)和文件元数据(metadata)namenode负责存储和管理文件元数据,并维护了一个层次型的文件目录树datanode负责存储文件数据(block),并提供block的读写datanode与namenode维持心跳,并汇报自己持有的block信息client和namenode交互文件元数据和datanode交互文件block数据 hdfs中的两个角色 namenode:
完全基于内存存储文件元数据,目录结构,block的映射需要持久化方案保证数据的可靠性提供副本放置策略 datanode
基于本地磁盘存储block并保存block的校验和数据,保证block的可靠性与namenode保持心跳,汇报block列表状态 数据持久化
数据持久化一般就2种方案
1.日志文件
2.镜像,快照
hdfs采用的方式是两者结合,数据恢复是采用最近时点的那个FsImage+这个时点后的EditLog
1.HSDS 搭建时会格式化,产生一个空FsImage 2.单namenode启动时,它会从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage上,然后删除旧的Editlog,因为这个Editlog的事务都已经作用在FsImage上了 3.name情动后会进入安全模式的状态,处于安全模式下的namenode不会进行block的复制,会从所有的datanaode接受心跳和block的状态报告,当namenode检测确认某个数据库的副本数达到这个最小值,那么该block就被认为是副本安全的 4.在一定百分比(可配置)的数据库被namenode认定为安全之后(加上一个额外30秒等待时间),namenode将会退出安全模式. 5.接下来它会确定会有那些block的副本没有达到指定数目,并将这些block复制到其他datanode上.
HDFS 中的SNN
SecondaryNameNode:
1. 在非Ha模式下,SNN一般是独立的节点,周期性的完成NN的EditLog向FsImage合并,减少EditLog大小,减少NN启动时间 2. 什么时候触发合并:fs.checkpoint.period=3600秒(默认值) 3. Editlog 多大了触发合并:fs.checkpoint.size-64M(默认值)
流程图:
block 的副本的放置策略1.第一个副本放置在上传文件的DN;集群外提交,则随机选一台 2.第二个副本放置在与第一个副本不同的机架上 3.第三个副本放在与第二个副本相同的机架上 4.更多副本:随机节点HDFS写流程
1.client 和NN 连接创建文件元数据 2.NN判断元数据是否有效 3.NN触发触发副本放置策略,放回一个有序的DN列表 4.clent和DN奖励Pipeline连接 5.clent将block切分成packet(64k),并使用chunk(512b)+chucksum(4b) 填充 6.client 将packet放入发送队列dataqueue中,并向第一个DN发送 7.第一个DN收到packet后本地保存并发给第二个DN 8.第二个DN收到packet后本地保存并发送给第三个DN 9.补充说明:这个过程中,上游节点同时发送下一个packet,流式其实也是变种的并行计算,HDFS使用这种传输方式,副本数对于client是透明的 10.当block传输完成,DN们各自向NN汇报,同时client继续传输下一个block,client的传输和block的汇报也是并行的
一个block的上传流程
可以去多个DN读取不同的block,最后再合并成一个文件



