文件线性切割为块(block),块带有offset(偏移量)、id
不同文件的block大小可不同
文件除了最后一个block,其他block大小一致
block大小依据硬件I/O特性调整
block被分散到集群的不同节点上,具有location
block具有副本(replication),但是副本没有主从概念,副本不能出现在同一节点
副本满足可靠性及性能要求
a.、hdfs存在多副本存在不同节点上,如节点奔溃,集群内其他节点还有block的副本
b、多副本可以在计算的时候减少文件的移动,节点内部存在副本,可以进行直接计算
文件上传时可以指定block大小和副本数量,但文件上传后,只能修改副本数量
一次写入多次读取,不支持修改文件,支持追加
a、当其中的block文件大小修改时,block大小可能发生变化,就违背其中的,除最后一个block块大小相同的特点,如需满足,就需要此block块后面所有的block进行大小调整,会导致集群发生泛洪操作,各节点加入操作,进而影响性能
b、追加数据,在最后一个block后追加数据,不需要对其他block块进行计算操作
HDFS是一个主从(Master/Slave)架构
由一个NameNode(主)和一些DataNode(从)组成
面向文件包含:文件数据(data)和文件元数据(metadata)
NameNode负责存储和管理文件元数据,并维护一个层次型的文件目标树
DataNode负责存储文件数据(block块),并提供block的读写
DataNode与NameNode维持心跳,并汇报自己持有的block信息
Client和NameNode交互文件元数据和DataNode交互文件block数据
NameNode(集群中只存在唯一一个)
完全基于内存存储文件元数据、目录结构、文件block的映射
a、基于内存存储是因为集群中只存在一个NameNode,为了保证集群并发性,所以NameNode是完全基于内存存储数据
需要持久化方案保证数据可靠性
提供副本放置策略
DataNode(集群中存在多个)
? HDFS同时使用日志文件(EditLog)及镜像快照(FsImage)
? EditsLog:体积小,记录少,必然有优势
? FsImage:如果能更快的滚动更新时点
? 最近时点的FsImage + 增量的EditLog
eg:主流内存持久化分为日志文件、镜像
a、日志实时记录增删改操作,优点:完整性好,缺点:加载恢复数据慢,日志文件占空间
b、镜像、快照、dump、db
以间隔(小时、天、分钟、秒等),对内存全量数据基于某个时间点做的向磁盘的溢写
缺点:I/O速度慢,完整性较差(容易丢失一部分数据)
优点:恢复速度快过日志文件
使用FsImage存储内存所有的元数据状态
使用本地磁盘保存EditLog和FsImage
EditLog具有完整性,数据丢失少,但恢复速度慢,并有体积膨胀风险
FsImage具有恢复熟读快,体积与内存数据相当,但不能实时保存,数据丢失较多
NameNode使用了FsImage+EditLog整合的方案
滚动将增量的Editlog更新到FsImage,以保证更近时点的FsImage和更小的Editlog体积
? NameNode在第一次开机的时候,写入一次FsImage,后续写入增量EditLog,到达FsImage更新时点,将间隔时间的增量EditLog写入FsImage
NameNode启动后进入一个称为安全模式的特殊状态
处于安全模式的NameNode时不会进行数据块的复制的
NameNode持久化block的属性信息,不持久化位置信息。因为如果重启后,某节点故障了,会导致当前NameNode存储的位置信息与当前情况不一致,导致集群问题
NameNode从所有的DataNode接收心跳信号和块状态报告
当NameNode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为时副本安全(safely relicated)的
在一定百分比(参数可配置)的数据块被NameNode检测缺人安全后(加上额外30s等待时间),NameNode退出安全状态
接下来会确认还有哪些数据块副本没有达到指定数目,并将这些数据块复制到其他DataNode上
在非Ha模式下,SNN一般是独立的节点,周期完成对NameNode的EditLog向FsImage合并,减少EditLog大小,减少NameNode启动时间
根据配置文件设置时间间隔fs.checkpoint.period 默认3600秒
根据配置文件设置EditLog大小 fs.checkpoint.size 规定的EditLog文件大小,默认大小值 64MB
第一个副本:放置在上传文件的DataName
如果集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
第二副本:放置在与第一个副本不同的机架的节点上
第三副本:与第二副本相同 机架的节点
更多副本:随机节点
原文:https://www.cnblogs.com/code1970/p/14698565.html