欢迎来到 mumu-hdfs 文档!¶
hdfs基本特征¶
hdfs是被设计在普通商用服务器运行的分布式文件系统,具有如下六大特性
大规模分布式存储¶
hdfs以分布式存储和良好的可拓展性提供了大规模的数据存储能力。hdfs可以分布式存储在多台商用服务器上。
运行在HDFS上的应用具有很大的数据集。HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS被调节 以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件
高并发访问能力¶
hdfs以多节点并发访问方式提供很高的数据访问带宽。
强大的容错能力¶
hdfs采用多副本数据块存储,按照块的形式随机选择存储节点。
顺序式访问文件¶
hdfs对顺序读进行了优化,支持大数据量的顺序读写,代价是对随机度的性能下降。
简单的一致性模型¶
hdfs提供一次写入到此读取的模式,不提供对hdfs文件的修改,但是可以在文件末尾附加新数据。
数据块存储¶
hdfs采用基于大数据块的文件存储,默认的块大小为64mb,较少源数据存储,分布存储在不同的服务器上。
hdfs组成结构¶
hdfs分布式文件系统由namenode节点和datanode节点组成,遵从主从结构。namenode是主服务器,用来管理文件系统的命名空间和源数据,以及处理外界访问文件的请求
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及 客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从 内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确 定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
datanone¶
datanode用来实际存储和管理文件的数据块。hdfs默认的文件块大小为64MB,同时为了防止数据丢失,每个数据块有3个副本,每个副本存储在不同的服务器上,防止一个节点的失效导致数据不可用
block数据块¶
为了提高磁盘使用率,文件系统的最小读写单位不是字节,而是数据块。数据块的信息对用户来说是透明的。hdfs的数据块一般是大块,默认是64MB。数据块设置这么大的优势是:
- 减少磁盘寻址开销
- 减少namenode存储开销和时间开销。
hdfs读写流程¶
hdfs支持一次写入到此读取模式,文件不能修改,只能附件。
数据访问流程¶
namenode是所有元数据所有者,但是程序访问文件的时候,namenode只是简单的把数据块存储路径返回给客户端程序,客户端程序直接访问datanoe获取数据。这样设计有如下两个好处:
- 并发访问,程序可以同时在不同的datanode上访问同一个文件。
- 减轻namenode的负载,避免namenode程序hdfs的瓶颈。
数据块访问流程如下:
- 客户端程序把hdfs路径发送到namenode
- namenode接收到文件名之后,检索数据块,在根据数据块信息找到datanode地址,并且将地址信息返回到客户端。
- 客户端接收到地址信息之后,与这些datanode并行的进行数据传输操作,同时将操作结果日志(比如是否成功、数据块信息)提交到namenode。
数据写入流程¶
hdfs可靠性设计¶
hdfs能够提到如此广泛的使用,跟hdfs是分不开的。作为一个能够在成千上万个服务器上运行的分布式文件系统,hdfs在可靠性设计上是考虑非常周全的
hdfs数据块多副本存储设计¶
hdfs分布式文件系统采用多副本方式来存储数据块,且同同个数据块的多个副本会存储在不同的服务器中(如果有机架区分会存储在不同的机架上)。采用多副本有如下几个优势。
- 1、采用多副本,可以让客户端从不同的数据块读取数据,加快传输速度。
- 2、hdfs和datanode是通过网络传输,采用多副本可以判断传输是否报错。
- 3、多副本保证一个datanode失效的情况下,数据还可用。
hdfs可靠性的设计实现¶
1、安全模式¶
hdfs刚启动的时候会进入到安全模式(safe mode)。处于安全模式的namenode不能做任何文件操作,甚至内部副本创建都是不允许的。namenode此时会和datanode进行通信 ,回去datanode数据块,并且对数据块进行检测。只有通过了namenode的检测,一个数据块才被认为是安全的。当认为安全的数据块超过一定阈值之后,namenode才退出 安全模式。
2、secondaryNameNode¶
hadoop使用secondaryNameNode来备份namenode的元数据,以便在namenode出现故障的时候可以从secondaryNameNode恢复元数据。secondaryNameNode充当namenode的一个 副本,他本身不处理任何请求,因为这些请求都是通过namenode来访问。
namenode中保存了整个文件系统的元数据,而secondaryNameNode的作用就是周期性的保存namenode的元数据。这些元数据包括文件镜像数据FsImage和编辑日志数据Editlog。 FsImage相当于hdfs的检查点,namenode启动的时候会读取FsImage日志信息到内存中,并将与其Editlog日志数据进行合并生成新的FsImage。在namenode运行期间,关于hdfs的所 有修改都会记录到Editlog日志文件中。如果namenode失效,可以从secondaryNameNode保存的FsImage和Editlog日志数据恢复出namenode的最新状态,尽量减少损失。
3、心跳、副本重新创建¶
hdfs启动心跳机制保存hdfs在运行期间namenode和datanode之前连通性。namenode周期性的向datanode发送心跳请求,收到心跳请求的datanode会发送回复信息,如果侦探到datanode 失去连接,那么保存在这个datanode的数据块就不可用,那么这些数据块就会重新创建新的副本。
4、数据一致性¶
hdfs分布式文件系统使用校验和(checksum)来校验文件传输过程中文件是否出现损坏,如果出现损坏就从其他的副本来传递数据。
5、租约¶
当多个进程同时写入一个文件的时候,为了保持数据一致性,使用到了租约(lease)来保证只有一个进程能够写数据。当进程写入文件的时候,首先从namenode获取一个租约(租约存在过期时间), 当文件名称存在租约的时候,其他进程就不能够写入文件。当租约过期的时候,客户端就要重新生成新的租约。如果客户端超时没有重新获取租约,namenode就会收回租约。
5、回滚¶
当对hdfs进行版本升级的时候,如果新版本出现了问题,可以对版本进行回滚。因为hdfs在升级的时候会备份原来版本的信息。