分布式系统那么多,为啥要在开发一个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个字节 《 二进制文件
从现在开始,有的人已经选择了放弃,有的人会留下,留下的人其实懂得也不多,只要坚持做,做了别人不做的事情,你就一定是神