目录
一、HDFS原理
Hadoop分布式系统(Hadoop Distributed File System ,HDFS)被设计成适合运行在通用硬件上的分布式文件系统。HDFS是一个高容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS在最开始是作为Apache Nutch搜索引擎项目基础架构而开发的。HDFS是Apache Hadoop Core项目的核心部分。
二、HDFS的组件
HDFS包含Namenode、Datanode、Secondary Namendoe三个组件
- Namenode:HDFS的守护进程,用来管理文件系统的命名空间,复责记录文件是如何被分割成数据块,以及这些数据块分别被存储到那些数据节点上,他的主要功能是对内存及IO进行集中管理。
- Datanode:文件系统的工作节点,根据需要存储和检索数据块,并且定期向Namenode发送它们所存储的块的列表。
- Secondary Namenode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照,用以备份和恢复数据。
- 在Namenode节点上,fsimage保存了元数据的镜像文件(文件系统的目录树),而edits中完整记录了元数据的操作日志(针对文件系统做的修改操作记录)。Namenode内存中存储的元数据可以用“fsimage+edits”来表达。
HDFS的架构如图:
文件写入流程:
- 客户端向Namenode发起文件写入的请求;
- Namenode根据文件的大小和文件块的配置情况,返回给客户端所管理部分Datanode的信息;
- 客户端将文件划分成为多个块,根据Datanode的地址信息,按顺序写入到每一个块中。
文件读取流程:
- 客户端向Namenode发起文件读取的请求;
- Namendoe返回文件的存储的Datanode的信息;
- 客户端读取信息。
三、HDFS数据复制
HDFS被设计成能够在一个大集群中跨机器可靠的存储超大文件。它将每个文件存储成一些列的数据块,除了最后一个以外,所有的数据块都是同样大小的(hadoop3.x默认每个数据块大小为128mb)为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可以配置的。应用程序可以指定某个文件的副本数量。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS中的文件都是一次性写入的,并且严格要求在任何时候都只能有一个写入者。
Namenod全权管理数据块的复制,它周期性的从集群中的每一个Datanode接收心跳信号和快状态报告。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了该datanode上所有数据块的列表。
副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略是HDFS区分于其他大部分分布式文件的重要特性。HDFS采用一种称为机架感知的策略来改进数据的可靠性、可用性和网络宽带的利用率。在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本存放在同一个机架的另一个节点上,最后一个副本存放在不同的机架的节点上。
这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点大的错误少,所以这个策略不会影响到数据的可靠性和可用性。与此同时,因为数据块只放在这种策略下,副本并不是均匀分布在不同的机器上。
三分之一的副本在一个节点上,三分之二的副本在一个机架上,这一策略在不损害数据的可靠性和读取性能的情况下该井了写的性能。为了降低整体的宽带消耗和读取延时,HDFS会尽量让读取程序读取离它最近的脚本。如果在读取程序的同一个机架上有一个副本,那么就读取副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。