HDFS (hadoop Distributed file System) 是hadoop 项目的核心子项目,主要负责集群数据的存储与读取,HDFS是一个主从(master/slave)体系结构的分布式文件系统,HDFS支持传统的层次型文件组织结构,用户或者应用可以创建目录,然后将文件保存在这些目录中。文件系统的名字空间层次结构和大多数现有的文件系统类似,可以通过文件路径对文件执行创建、读取、更新、和删除操作
hdfs的架构如下
1)NameNode (nn):就是Master,它是一个管理者。
(1)管理HDFS的名称空间
(2)配置副本策略
(3)管理数据块(block)映射信息
(4)处理客户端读写请求
2)DataNode:就是Slave。NameNode下达命令,DataNode执行实际操作
(1)存储实际的数据块
(2)执行数据块的读/写操作
3)client:就是客户端。
(1)文件切分。文件上传HDFS的时候,client将文件且分为一个一个的block,然后进行上传。
(2)与namenode 交互,获取文件的位置信息
(3)与DataNode交互,读取或者写入数据
(4)Client 提供了一些命令类管理HDFS,比如NameNde格式化
(5)client 可以通过一些命令来访问HDFS,比如HDFS增删查改操作
4)SecondaryNameNode:并非NameNode 的热备,当namenode挂掉的时候,它并不能马上替换namenode并提供服务。
(1)辅助namenode,分担其工作量,定期合并fsimage和edits,并推送给namenode
(2)在紧急情况下,可辅助namenode
HDFS文件块大小 HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocsize)来规定,默认大小在hadoop2.x版本中是128M,老版本是64M
为什么块的大小不能设置太小,也不能设置太大?
(1)HDFS的块设置太小,会增加寻址时间,程序一直再找块的开始位置
(2)如果块的设置太大,从磁盘传输数据的时间会明显大于定位这个块开始的位置所需时间。会导致程序在处理这块数据时,会非常慢。
总结:HDFS块的大小设置主要取决于磁盘传输速率
HDFS的数据流 HDFS写数据流程
(1)客户端通过Distributed FileSystem 模块向NameNode请求上传文件,namenode检查目标文件是否存在
(2)namenode返回是否可以上传
(3)客户端请求第一个block上传到那几个DataNode服务器上
(4)namenode返回三个节点,分别为n1,n2,n3
(5)客户端通过FSDataOutPutStream 模块请求dn1,上传数据,dn1收到请求会继续访问dn2,然后dn2调用dn3,将这个通道建立完成。
(6)dn1,dn2,dn3逐级应答客户端
(7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传递给nd2,nd2会传递给dn3;dn1每传一个packet都会放入一个应答队列等待应答
(8)当一个Block传输完成之后,客户端再次请求namenode上传第二个block的服务器(重复3-7步)
网络拓扑—节点距离计算 在HDFS写数据的过程中,Namenode 会选择距离待上传数据的最近距离的datanode接收数据,如何计算这个最近距离???
总结:节点距离:两个节点到达最近的共同祖先的距离总和
机架感知(副本存储节点选择)官方连接 http://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
(1)客户端通过DistributeFileSystem 向namenode请求下载文件,Namenode 通过检查元数据,找到文件所在的DataNode地址
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据
(3)datanode开始传输数据给客户端(从磁盘里读取数据输入流,以packet为单位来做校验)
(4)客户端以packet为单位接收,现在本地缓存,然后再写入目标文件
NameNode 和 SecondaryNameNode NN 和 2NN工作机制
思考:namenode 中的元数据是存储在哪的??
HDFS命名空间由Namenode存储。NameNode使用称为EditLog的事务日志来存储持久化记录文件系统元数据发生的每次更改,例如:在HDFS中创建一个新文件会导致Namenode将一条记录插入到EditLog中来表名这一点。更改文件的复制因子(副本数)也会导致新的记录插入到EditLog中,namenode使用本地主机操作系统文件中的文件来存储editlog。整个文件系统命名空间,包括块的映射和文件系统的属性,都会储存在一个名为FsImage的文件中,Fs也作为文件存储在namenode的本地文件系统中。
此处引入一个概念:检查点
NameNode 在内存中保存了整个文件系统命名空间和文件 Blockmap 的图像。当 NameNode 启动,或者一个检查点被一个可配置的阈值触发时,它从磁盘读取 FsImage 和 EditLog,将 EditLog 中的所有事务应用到 FsImage 的内存表示中,并将这个新版本刷新到一个磁盘上的新 FsImage。然后它可以截断旧的 EditLog,因为它的事务已应用于持久 FsImage。这个过程称为检查点。检查点的目的是通过获取文件系统元数据的快照并将其保存到 FsImage 来确保 HDFS 具有文件系统元数据的一致视图
思考:什么是2NN 及2NN的作用是什么:
namenode节点一旦重启,就需要通过合并FsImage 和 Edits的合并,合成元数据,但是长时间的对元数据进行操作,每条操作都会追加一条记录到Edits文件,会导致该文件数据过大,效率低,恢复元数据时间较长。需要定期合并Fsimage 和 Edits文件,此时如果使用namenode 节点进行合并,又会导致效率低下的问题。此时便引入了一个新的节点SecondaryNameNode,专门用于FsImage 和Edits的合并。
NameNode 的工作机制
1)第一阶段:NameNode启动
(1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志文件和镜像文件到内存中
(2)客户端对元数据进行增删改的请求
(3)NameNode记录操作日志,更新滚动日志
(4)NameNode在内存中对元数据进行增删改
2)第二阶段:secondaryNameNode工作
(1)SNN询问NameNode是否需要Checkpoint(检查点)。直接带回NameNode是否检查结果
(2)SNN请求执行checkpoint
(3)namenode滚动正在写的Edits日志
(4)将滚动前的编辑日志和镜像文件拷贝到SNN
(5)SNN 加载编辑日志和镜像文件到内存中,并合并
(6)生成新的镜像文件fsimage.chkpoint
(7)拷贝fsimage.chkpoint到namenode
(8)namenode将fsimage.chkpoint重命名为fsimage
DataNode工作机制
(1)一个数据块在DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
(2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有namenode给该节点DataNode的命令如复制块到另一台机器上,或删除某个数据块,如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器
数据完整性
datanode节点上的数据发生损坏时,如何检测?
保证datanode的节点数据完整性的方法
(1)当datanode读取block的时候,他会计算CheckSum.
(2)如果计算后的checkSum,与block创建是的值不一样,说明block与损坏
(3)client 读取其他datanode上的block
(4)常见的校验算法crc(32),md5(128),shal(160)
(5)datanode在器文件创建后周期验证checksum
掉线时限参数设置:
感谢X硅谷的教学视频



