一、HDFS
Hadoop中的分布式文件系统,高容错(数据库blcok备份),可扩展,适合存储大文件,不适合存储小文件,不适合处理低延时的数据(HBase更好),一次写入、多次读写,不支持多用户写入及任意修改文件。
1、原理架构
-
1)NameNode:主节点,负责管理文件系统的命名空间,将HDFS的元数据存储在NameNode节点的内存中;负责响应客户端对文件的读写请求。
-
2)DataNode:数据节点,主要负责数据的读写, 存储block以及block元数据到datanode本地磁盘(此处的元数据包括
数据块的长度、块数据的校验和、时间戳
);定期向NameNode发送心跳,超过10分钟节点不可用,6小时上报当前DataNode上的块状态。 -
3)SecondaryNameNode:辅助节点,定期做checkpoint操作,
合并NameNode的fsimage及editlog
,NameNode就有了最新的fsimage文件和更小的editslog文件,可减少恢复系统的时间,每小时或每分钟editslog含有100万个事务,就创建一个checkpoint检查点。
心跳机制:
集群的心跳机制,让集群中各节点形成一个整体,可以判断DataNode是否在线;知道各DataNode的存储情况;
集群刚开始启动时,99.9%的block没有达到最小副本数1,集群处于安全模式,涉及BlockReport;
首先,NameNode启动时会开一个ipc server
;
DataNode每3秒钟
向NameNode发送一个心跳
,心跳返回结果带有NameNode给该DataNode的命令;
每6小时
向NameNode上报当前DataNode上的块状态报告
,块状态报告包含了一个该 Datanode上所有数据块的列表;
超过10分钟
没有收到某个DataNode 的心跳,则认为该DataNode节点不可用。
负载均衡:
在机器之间磁盘利用率不平衡、DataNode节点出现故障、增添新的DataNode的时候可能造成不均衡;
可以手动触发负载均衡: sbin/start-balancer.sh -t 5% #
磁盘利用率最高的节点若比最少的节点,大于5%,触发均衡
2、SecondaryNameNode
引入原因:
客户端对HDFS的增删重命名等操作,会保存再次namenode的editlog中(相当于binlog);系统出故障时,可从editlog进行恢复;
editlog日志大小,随时间越来越大,系统重启根据日志恢复的时候,会越来越长;
为解决恢复系统时间长:设置检查点checkpoint,定期将namenode内存中元数据持久化保存到磁盘,形成fsimage文件,恢复系统时不再只依赖editlog日志。(先从fsimage恢复出元数据,再到回放editlog日志检查点之后记录);
但对editlog日志文件的保存策略未改变,editlog日志依然不断增大;
为解决editlog大,引入部署在另外一节点
secondarynamenode
,定期做checkpoint操作,合并fsimage及editlog,nameNode就有了最新的fsimage文件和更小的edits文件。
执行过程:
- 先请求NameNode,不干涉NameNode,让它继续写写edits日志)
- 再GET请求,读取NameNode当前fsimage及edits;
- 然后,读取
fsimage
到内存中,并回放执行
edits中的每个操作,创建一个新的fsimage
文件,后缀为.ckpt
; - 最后PUT请求,将
新的fsimage
发送到原NameNode,原NameNode用新的fsimage替换旧的
fsimage,
创建checkpoint两大条件:
SecondaryNameNode
,每隔1小时创建一个检查点;Secondary NameNode
每1分钟检查一次,从上一检查点开始,edits日志文件中是否已包括100万个事务,如果是,也会创建检查点;
NameNode与SecondaryNameNode 的区别与联系?
(1)区别,功能不同
-
1)NameNode负责管理元数据,以及每一路径(文件)所对应的数据块信息。
-
2)SecondaryNameNode,主要定期合并NameNode的fsimage及editlog
(2)联系:
-
1)SecondaryNameNode中保存了一份,和namenode一致的镜像文件(fsimage)和编辑日志(edits)。
-
2)在主namenode发生故障时(假设没有及时备份数据),可以从SecondaryNameNode恢复数据。
3、数据存储
(1)元数据管理
-
元数据:关于文件或目录的描述信息,如文件所在路径、文件名称、文件类型等等,这些信息称为文件的元数据metadata
-
命名空间:文件系统中,为了便于管理存储介质上的,给每个目录、目录中的文件、子目录都起了名字,这样形成的层级结构,称之为命名空间;
-
HDFS元数据:文件目录树、所有的文件(目录)名称、文件属性(生成时间、副本、权限)、每个文件的块列表、每个block块所在的datanode列表;
- 每个文件、目录、block占用大概
150Byte字节
的元数据 ; - 元数据metadata保存在NameNode内存中,所以HDFS适合存储大文件,不适合存储小文件
- 每个文件、目录、block占用大概
HDFS元数据信息以两种形式持久化保存:①编辑日志edits log 、②命名空间镜像文件fsimage
- edits log:HDFS编辑日志文件,保存客户端对HDFS的所有更改记录,如增、删、重命名文件(目录),这些操作会修改HDFS目录树;NameNode会在编辑日志edit日志中记录下来;类似mysql的binlog。一旦系统出故障,可从editlog进行恢复
- fsimage:HDFS元数据镜像文件,即将namenode内存中的数据落入磁盘生成的文件;保存了文件系统目录树信息以及文件、块、datanode的映射关系
分块存储
数据分块存储和副本的存放,是保证高可靠性和高性能的关键:
向HDFS上传文件,是按照
128M
为单位,切分成一个个block,分散的存储在集群的不同数据节点datanode上。
如果每个block只有一份的话,当block所在的节点宕机后,此block将无法访问,进而导致文件无法完整读取;
为保证数据的高可用及容错,HDFS设计成每个block共有三份,即三个副本;
实际机房中,会有机架,每个机架上若干服务器
4、写数据流程
请求上传——检查目录——可以上传
查询Datanode信息——分配datanode
建立数据流——根据管道写数据—— 循环写入其他block