Hadoop Distribute File System 的简称,意为分布式文件系统,是Hadoop的核心组件之一,作为最底层的分布式存储服务而存在。解决的事大数据的存储问题。
1,硬件故障是常态,HDFS由成百上千的服务器组成,每一部分的服务器都有可能出现故障,因为检测故障与自动修复是HDFS的核心架构目标
2,它注重于数据的高吞吐量,主要是以流读取数据,并不是用户交互式的
3,write -one-read-many,当数据创建写入关闭后就不在修改了,简化了数据一致性的问题,使得高吞吐量成为可能
4,移动计算比之移动数据的代价底,一个应用请求过来,离他操作的数据越近,也就越高效,这在数据达到海量级别的时候更是如此,因此将计算移动到数据的附近,比将数据移动到应用要好得多。
5,在异构的硬件和软件平台上的可移植性。这将推动需要大数据集的应用更广泛地采用 HDFS 作为平台。
它是文件系统,用来存储文件,通过统一的命名空间目录树来定位文件。他是分布式的,由多台服务器联合起来实现其功能,每台服务器各司其职
1,主从架构
一个HDFS集群一般由一个NameNode和多个datanote,nn是HDFS的主节点,dn是集群的从节点,两者各司其职,共同合作完成分布式的存储
2,分块存储
HDFS中的文件在物理上是分块存储的,块的大小通过配置参数可以控制,在Hadoop2.x的版本里,默认的是128M.
3,命名空间
HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,
形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
4,元数据管理
我们把目录结构及文件分块位置信息叫做元数据。Namenode 负责维护整个hdfs 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的id,及所在的 datanode 服务器)。
5,datanote数据存储
block可以存储在多个datanote上,datanote需要定时向namenote汇报自己持有block信息,
6,副本机制
默认的三副本模式:如果客户端所在的机器存在dn且磁盘空间正常,那么第一个副本就是在客户端上,如果不满足那么,就找离客户端最近的一个dn,所谓的远近不是指空间的远近,而是指网络拓扑结构中的远近,如果有多个就随机选一个,当第一个副本位置指定,第二个副本存放于不同于第一个副本服务器的另一个机架上的任意一个,第三个副本就在第二块所在机架上的不同机器上,随即所选。
为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
如果不是默认的三副本模式,那么只有第一个副本遵循三副本模式的规则,其他随机,如果没有机架,那么所有的副本都存在一个default的机架上,也就不存在默认的三副本模式。
7,一次写入,多次读取
不允许修改操作,修改操作成本较大,延迟大,网络开销大成本太高,不适合大数据的存储
a、 NameNode 是 HDFS 的核心。
b、 NameNode 也称为 Master。
c、 NameNode 仅存储 HDFS 的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件。
d、 NameNode 不存储实际数据或数据集。数据本身实际存储在 DataNodes 中。
e、 NameNode 知道 HDFS 中任何给定文件的块列表及其位置。使用此信息NameNode 知道如何从块中构建文件。
f、 NameNode 并不持久化存储每个文件中各个块所在的 DataNode 的位置信息,这些信息会在系统启动时从数据节点重建。
g、 NameNode 对于 HDFS 至关重要,当 NameNode 关闭时,HDFS / Hadoop 集群无法访问。
h、 NameNode 是 Hadoop 集群中的单点故障。
i、 NameNode 所在机器通常会配置有大量内存(RAM)。
a、 DataNode 负责将实际数据存储在 HDFS 中。
b、 DataNode 也称为 Slave。
c、 NameNode 和 DataNode 会保持不断通信。
d、 DataNode 启动时,它将自己发布到 NameNode 并汇报自己负责持有的块列表。
e、 当某个 DataNode 关闭时,它不会影响数据或群集的可用性。NameNode 将安排由其他 DataNode 管理的块进行副本复制。
f、 DataNode 所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode 中。
g、 DataNode 会定期(dfs.heartbeat.interval 配置项配置,默认是 3 秒)向NameNode 发送心跳,如果 NameNode 长时间没有接受到 DataNode 发送的心跳, NameNode 就会认为该 DataNode 失效。
h、 block 汇报时间间隔取参数 dfs.blockreport.intervalMsec,参数未配置的话默认为 6 小时.
1,客户端向服务端请求上传,即是先向nn请求,nn判断是否可以存储返回结果
2,如果可以,客户端将数据分块和副本数提交请求上传,这时,nn根据信息池来选出合适的dn返回给客户端
3,客户端与dn建立通道pipeline,建立完成后返回
4,客户端将第一块以package为单位一包一包发送给dn,到第一个dn时,dn将数据复制并传给后面的dn,与此同时,通道的反方向会进行数据包的校验ack机制。
5,当第一块执行完成后,后面的进行上述的循环
6,当所有数据块上传完成后,客户端将信息给nn,本次数据传递完成,nn更新文件系统元数据
在上传过程中,如果dn出现问题,如果是第一个pipeline,重新请求nn获取新的pipeline列表,如果是后面的pipeline出现问题,只要有一个上传成功,那么就算是成功的,剩下不足的副本数在客户端返回信息之后由nn指定其他dn进行复制,使得最终的副本数与设置的副本数相同。
最小副本数为1.
1,客户端请求下载,nn检查客户端是否有权限,文件是否存在。如果满足下载条件,根据元数据的信息返回所有元数据(数据较小)或者分批次返回块的元数据
其中返回的元数据是排序好的,离客户端近的在前,腐朽的在后(状态不稳定的)
2,根据返回的元数据,启动多线程,并行下载多个数据块,当客户端把所有数据块下载到本地时,按照块的顺序进行拼接成文件的最终的样子。
3, 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向,NameNode 获取下一批的 block 列表;
读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。