随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
1)HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
2)HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。
1、高容错性
2、适合批处理
3、适合大数据处理
4、可构建在廉价机器上,通过多副本机制提高可靠性,提供容错和恢复机制
1、不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
2、无法高效的对大量小文件进行存储
3、并发写入、文件随机修改
1、Block的副本数
2、区别主从副本
3、Block是按字节切分存储
1、Master/Slave架构
HDFS-1.0架构
2、存在的问题
1)HDFS存在的问题
2)MapReduce存在的问题
架构解析:
1、主备NameNode
1)解决单点故障
2)两种切换选择
2、JN
3、ZKFC
1、Client:客户端
2、NameNode
1)Master节点:主管,管理者
2)NameNode有一个虚拟的文件系统,类似Linux的根目录
3、DataNode
1)Slave节点
2)NameNode下达命令,DataNode执行实际的操作
4、SecondaryNameNode
1)SecondaryNameNode是NameNode的冷备份
2)SecondaryNameNode的合并流程解析
合并图解
合并流程
小结
生成新的edits文件->复制fsimage和edits文件到SecondaryNameNode ->将编辑日志和镜像文件合并成Fsimage.ckpt->拷贝fsimage.ckpt到NameNode,重新命名为fsimage ->达到触发条件SecondaryNameNode再次开始运行
Checkpoint触发条件
3)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
4)在紧急情况下,可辅助恢复NameNode
5)SecondaryNameNode是Hadoop 1.x中HDFS HA的一个解决方案
6)冷备份和热备份的区别
1、HDFS写数据流程
1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2)NameNode返回是否可以上传。
3)客户端请求第一个 block上传到哪几个datanode服务器上。
4)NameNode返回3个datanode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3-7步)。
2、HDFS读数据流程
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。
4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
1、HDFS写数据流程
1)Client将FileA按128M分块。分成两块,block1和Block2;
2)Client向nameNode发送写数据请求,如图蓝色虚线①------>。
3)NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②------->。
4)client向DataNode发送block1;发送过程是以流式写入。
流式写入过程
(1)将64M的block1按64k的package划分;
(2)然后将第一个package发送给host2;
(3)host2接收完后,将第一个package发送给host1,同时client向host2发送第二个package;
(4)host1接收完第一个package后,发送给host6,同时接收host2发来的第二个package。
(5)以此类推,如图红线实线所示,直到将block1发送完毕。
(6)host2,host1,host6向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。
(7)client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就完成了。如图黄色粗实线。
(8)发送完block1后,再向host7,host3,host4发送block2,如图蓝色实线所示。
(9)发送完block2后,host7,host3,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。
(10)client向NameNode发送消息,说我写完了,如图黄色粗实线。。。这样就完毕了。
2、HDFS读数据流程
1)client向namenode发送读请求。
2)namenode查看Metadata信息,返回fileA的block的位置。
3)block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后block2,去host7上读取。
1、配备了机架感知
Hadoop的副本放置策略在可靠性(副本在不同机架)和带宽(只需跨越一个机架)中做了一个很好的平衡
Hadoop3.x副本结点选择:
由上图可知,第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本在另一个机架的随机一个节点。
第三个副本在第二个副本所在机架的随机节点。
更多副本:随机节点
2、未配备机架感知
三个DataNode机器的选择完全是随机的
1、确定节点所在的机架?
原理如下:
2、默认关闭
3、hadoop-site.xml配置:topology.script.file.name
配置选项的value指定为一个可执行脚本程序
通过该脚本能够将机器的IP地址正确的映射到相应的机架上去
namenode启动的时候,首先将映像文件(fsimage)或入内存,并执行编相日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映时,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
此刻namenode运行在安全模式,即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、制除、重命名都会失败)
在此阶段Nameode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的,在一定比例(可设置)的故据块被确定为“安全”后,再过若干时间,安全模式结束
当检测到副本故不足的故据块时,该块会被复制直到达到最小副本故,系统中数据块的位置并不是由nanenode维护的,而是以块列表形式存铑在datanode中。