HDFS介绍

HDFS是Hadoop默认的分布式文件系统,具有以下特点:

1、容忍硬件故障:

将硬件故障视为常态。HDFS通过多副本机制,允许个别节点发生故障而不至于丢失数据,从而可以运行在商用硬件上。

2、流式数据存取:

与常见的文件系统不同,HDFS上运行的应用通常需要对数据集的流式存取。
因而HDFS被设计成更好地支持批处理而不是交互式使用,强调数据存取的高吞吐率而不是低延迟。
POSIX(为类Unix系统定义的操作系统为应用程序提供的标准接口)设置了许多严格的要求,
是以HDFS作为运行目标的应用不需要的。为提高数据吞吐率,在一些关键方面的POSIX语义已被改变。

3、大数据集:

运行在HDFS上的应用通常有大的数据集。HDFS上典型的文件会有数GB到数TB大,因此HDFS为大文件做了优化。
它应该提供高的总数据带宽,并能在单一集群部署数百个节点。在一个实例中应该能支持数千万个文件(一般100w个文件消耗300m NameNode内存)。

4、简单的一致性模型:

HDFS的设计思想是认为一次写入、多次读取是大数据场景下最高效的访问模式,
因此HDFS不支持对文件的随机读取和修改,只能整个读取或追加数据。
这个假设简化了数据的一致性,使得可以支持高吞吐率。

5、移动计算比移动数据划算:

如果应用程序所操作的数据就在附近,那么这种应用计算的效率就比较高,特别是当数据集很大的时刻。
这减少了网络拥塞,增加了系统的整体效率。这要求将计算放置到数据存储的附近,而不是将数据移动到计算程序处。
HDFS提供了实现这种需要的接口。我们有时称之为"数据本地性"。

6、异构软硬件平台的可移植性:

HDFS被设计成很容易从一个平台迁移到另一个平台。
这使HDFS具备作为一大类应用程序可选平台的广泛适用性。

数据块:

1、块(block)是磁盘进行数据读/写的最小单位,构建于单个磁盘上的文件系统通过磁盘块来管理该文件系统中的块,文件系统的块大小是磁盘块的整数倍。
2、磁盘块大小一般为512B。每种文件系统都有默认的块大小,例如Linux的xfs默认4KB,windows的NTFS默认也是4KB。
3、HDFS作为一种文件系统,也有块的概念,默认为128MB。与单个磁盘上的文件系统类似,
HDFS上的文件也按块大小划分为多个分块(chunk)。
不同的是,单个磁盘上的文件系统一个分块最小需要占用一个块大小,而HDFS中小于一个块大小的分块不会占据整个块大小的空间。
3、HDFS使用巨大的块的原因:为了最小化寻址开销,使得磁盘传输数据的时间远大于寻找块位置的时间,使得可以提升文件系统的读写吞吐率。但是块大小也不宜设置得过大,因为块大小是默认参数下决定MapReduce任务中map数的因素,如果块大小太大,则文件的分块数可能很少,于是map数也可能很少,不利于提升任务的并行性。通常不要超过256MB。
4、分布式文件系统中引入块概念的好处:
4.1 便于管理大文件。单个文件的大小可以超过单块磁盘的大小,不同的分块不需要存储在同一个磁盘上,而是使用集群中的任何一个数据磁盘存储。
4.2 简化了文件系统的设计。因为块的大小相对固定,文件系统可以较为容易地管理和计算容量。另外文件的元数据可以和块数据分开存储,简化了对元数据的管理。
4.3 对容错性的提升。HDFS中有副本的概念,每个块复制到多个独立的节点上(默认3副本),如果发现其中一个副本不可用,HDFS会自动从另一个节点读取正常的数据并补足副本数,这个过程对用户是透明的。因此当少量节点故障时,HDFS不会发生数据丢失。
4.4 对并行性的提升。由于文件以块为单位分散在不同节点上存储,在读取文件时可以从多个节点上并行读取,并由该节点上的程序处理。

NameNode:

1、HDFS有一个主/从架构。每个集群一般只有一个(正在工作的)NameNode。
2、NameNode管理文件系统的命名空间(namespace),它维护着文件系统树及整棵树内所有的文件和目录的元数据。
这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件(fsimage)和编辑日志文件(editlog)。
3、NameNode也记录每个块所在的DataNode的信息,但不会永久保存块在磁盘上的位置信息,这部分信息由DataNode维护。
4、NameNode是整个HDFS的中枢,如果故障则HDFS不可用。另外,如果保存命名空间镜像文件和编辑日志文件的数据盘损坏,
整个文件系统上的文件将会丢失,因为无法知道如何使用DataNode上的块数据组装出文件。
因此NameNode的高可用是非常重要的一个课题,从Hadoop的早期版本开始提出了多种不同的方案。

DataNode:

1、每个集群有多个DataNode,通常是用于计算的节点每个上面有一个。
2、DataNode是文件系统的工作节点。
3、DataNode根据客户端的请求来读或写数据。
4、DataNode也会根据NameNode的指令来完成块的创建、删除、复制操作。
5、DataNode定期向NameNode发送它们所存储的块的列表。
 

NameNode和DataNode构成HDFS的架构如图:

image

数据复制:

1、HDFS被设计用来可靠地在一个大集群中跨机器地存储巨大文件,它将每个文件保存为连续的块,
除最后一个块之外,一个文件中所有块的大小相同。为了容错性,块被复制为多个副本。
文件块大小与副本因子是每个文件的配置参数。应用程序可以为每个文件指定副本份数,
这个副本因子可以在文件创建时指定,也可以在以后改变。
HDFS中的文件都是"写一次"的方式,并且在任何时刻,严格只有一个写入者。
2、NameNode决定如何复制文件块。它周期性地从集群中每一个DataNode接收心跳和块报告。
接收到心跳表示这个DataNode还在正常工作。块报告包含着这个DataNode上所有文件块的列表。

复制块的放置:

1、复制块的放置对HDFS的性能和可靠性至关重要。集群上运行的大容量HDFS实例通常有许多机架。
不同机架上的两个节点之间的通信需要通过通信设备,大部分情况下,同一机架上两台机器之间的网络带宽大于不同机架上两台机器之间的带宽。
NameNode决定着每个DataNode所属的机架id。
2、通常情况下,当副本因子是3时,HDFS的放置策略是第一个数据块放置到本地机架的一个节点(如果客户端在集群外,就随机选择一个节点),另一份数据块放置到异机架的一个节点,最后一份数据块放置到与第二块同一机架的另一个节点。这个策略减少了机架之间的通信而极大提高了写性能。机架发生故障的可能性远小于节点,这个策略并不影响数据的可靠性和可用性,但是,在读数据时,它确实降低了整体带宽,因为数据块仅放置在两个而不是三个机架上,且在机架间不是等比例分布的。
3、这儿描述的目前缺省的复制块放置策略还在不断改进中。

复制块的选择:

为减少全局的带宽和读延迟,HDFS尝试从离要求读的客户端最近的地方读取复制块,
如果读节点与复制块节点在同一机架上,则这个复制块优先用来满足读请求,如果HDFS集群有多个数据中心,
则优先使用本地数据中心中的复制块,而不是远程的数据块。这种策略有时候称为利用数据本地性。
posted @ 2025-06-21 22:08  屠魔的少年  阅读(125)  评论(0)    收藏  举报