> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/da-shu-ju/hadoop-zhi-hdfs.md).

# Hadoop之HDFS

## 简介

HDFS是Hadoop的分布式文件系统。它的结构如下：

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2Fa560145b6cebd09dd3e91351e19fccf8165a8bf5.png?generation=1589894635463306\&alt=media)

它的主要组成如下：

* Block数据块：Block数据块是HDFS的基本存储单位，一般大小为64M，一个文件会被拆分成一个个的块，然后存储在不同的机器，如果一个文件少于一个Block块的大小，那么实际占用空间为其文件的大小，每个块会被复制到多台机器，默认复制3份。
* NameNode：存储文件的metadata元数据，运行时所有数据保存到内存。一个Block在NameNode中对应一条记录。数据会定时保存到本地磁盘，但不保存Block的位置信息，NameNode失效会导致整个HDFS失效。
* Secondary NameNode：定时与NameNode同步。
* DataNode：保存具体的Block数据，负责数据的读写操作和复制操作，DataNode启动时会向NameNode报告当前存储的数据块信息，后续也会定时报告修改信息。DataNode之间会进行通信，复制数据块，保证数据的冗余性。

## HDFS的基本操作

### 写操作

1. Client向NameNode发起文件写入的请求
2. NameNode根据文件大小和文件块配置情况，返回给Client所管理的DataNode的信息。
3. Client将文件划分为多个Block，根据DataNode的地址信息，按顺序将其写入到每一个DataNode块中。

### 读操作

1. Client向NameNode发起文件读取的请求。
2. NameNode返回文件存储的DataNode信息。
3. Client读取文件信息。

### 文件块Block复制

1. NameNode发现部分文件的Block不符合最小复制数这一要求或部分DataNode失效。
2. 通知DataNode相互复制Block。
3. DataNode开始直接相互复制。
