下图为HDFS架构:
namespace:包括文件系统的层次结构。 journaling: 保护数据写到文件系统的一致性, 文件系统的改变都持久化存到disk的fsimage_ and edits_
的文件。 Blocak Map:映射文件名和data block id
DataNode: 存储HDFS文件数据,通常有多个磁盘来提高I/O吞吐量。 SecondaryNameNode: 减轻主NameNode的CheckPoint的操作; 提供冗余,以防主NameNode挂了;
下图展示一个文件如何写到HDFS中:
流程:
- 第一步:HDFS Client 向NameNode发送一个像HDFS中写一个文件的请求。
- 第二步: NameNode会验证请求的路径和文件名是否合法,如果合法, NameNode向Client发送一个文件名和路径的lease.
- 第三步: Clien验证默认的HDFS
data block size
, 请求block IDs , 每个block对应的DataNode列表。程序可以请求不同的block size. - 第四步: NameNode将对应的信息发送给Client
- 第五—十一步: 依次将数据和checkSum写到DataNodes中, 并向Client发送响应。
- 第十二步:当所有的数据块写到磁盘, Client通知NameNode写操作已经完成。
下图展示如何读取HDFS中文件:
HDFS是为了当发生硬盘、系统、网络的故障, 能够自动的,清楚的复制数据到不同的DataNode。一个文件被拆分成一个或多个数据块, 默认块大小为128M由hdfs-site.xml
中的dfs.blocksize
所决定。 任何Client能够重写默认块大小, 如果文件大于默认块大小, 就会拆分成多个块(如1g文件会拆分成8个块);如果文件小于默认块大小, 只会消耗的所需的空间(如一个1字节的文件只会消耗一字节空间, 外加校验和文件)。 通常HDFS要求相同的文件的数据块有相同的大小,自HDP2.3之后, HDFS支持不同的块大小在相同的文件, 这种改进运用在特定案例中: 将几个小文件合成一个大文件。 For example, this is done as part of the YARN log aggregation feature.
下图是副本块存储形式:
DataNode将HDFS数据存储在Disk, HDFS数据块在DataNode本地文件系统中以文件的形式呈现。 hdfs-site.xml
: dfs.datanode.data.dir
决定存储HDFS数据块的父目录, 这个属性可以包含一个以逗号分隔的父目录,使一个DataNode使用多个物理磁盘数据块存储。 (如:/hadoop/hdfs/data1, /hadoop/hdfs/data2
)
数据块可以分散在多个目录。当一个目录中的数据块超过64, 就会创建一个新的统计目录,这保证了HDFS的读取性能。 每个块都有一个唯一的ID,这个ID是NameNode用来定位和读取数据,每个数据块都以文件的形式存在DataNode的本地文件系统,文件名是依据ID号。 为了保证数据的完整性,每个数据块有一个或多个checkSum, 每512-byte的块都有一个校验和, 这个是由hdfs-site.xml
中的dfs.bytes-per-checksum
所决定,通常是不可修改。每次读取数据块,都会重新计算校验和,用于对比校验。
DataNode存储
NameNode存储
NameNodes persist HDFS storage state information to disk. The value recorded in the dfs.namenode.name.dir property in the hdfs-site.xml file determines the parent directory of the persisted information. This property can contain a comma-separated list of multiple directories. For example, one directory could be located on a local disk while a second directory could map to a directory mounted from an NFS server. This would provide redundancy for this critical information. Configuring NameNode High Availability (HA) is a popular method to achieve NameNode redundancy. NameNode HA is described in a another lesson. The number of past edits files to retain is controlled by the dfs.namenode.num.extra.edits.retained property in hdfs-site.xml. The number of past fsimage checkpoint files to retain is controlled by the dfs.namenode.num.checkpoints.retained property in hdfs-site.xml.