一、HDFS 介绍
1. HDFS 的产生及定义
- 随着数据量越来越大,当在一个操作系统存不下所有的数据时,就需要分配到更多的操作系统管理的磁盘中存储,但由此带来管理和维护的不方便,因此需要一种系统来管理多台机器上的文件,从而产生了分布式文件管理系统。HDFS 是分布式文件管理系统中的一种。
- HDFS(Hadoop Distributed File System),是一个分布式文件管理系统,用于存储文件,通过目录树来定位文件;其次,它是由多个服务器联合起来实现功能,集群中的服务器有各自的角色。
- HDFS的使用场景:适合一次写入(后续只能追加不能修改),多次读出的场景。
2. HDFS 的优缺点
2.1 优点
- 高容错性:数据会自动保存多个副本,且某个副本丢失后会自动恢复
- 适合处理大数据:数据规模达到 GB、TB 甚至 PB;文件规模达到百万以上数量
- 可构建在廉价的机器之上
2.2 缺点
- 不适合低延时的数据访问
- 无法高效对大量小文件进行存储:NameNode 的总存储空间是 128G,每个文件块为 150字节
- 不支持并发写入、文件随机修改:同一个文件不允许多线程同时写;仅支持数据追加
二、HDFS 的组成架构
1. NameNode 介绍
- NameNode,简称 NN,它是整个 HDFS 集群的 Master
- 主要功能职责为:
- 管理 HDFS 名称空间元数据
- 配置副本策略(每个文件存几个副本)
- 管理数据块映射信息(记载每个文件块存储在哪个 DataNode)
- 处理客户端的读写请求
2. DataNode 介绍
- DataNode,简称 DN,它是整个 HDFS 集群的 Slave
- 主要功能职责为:
- 存储实际的文件块数据
- 执行数据块具体的读写操作
3. SecondaryNameNode 介绍
- SecondaryNameNode,简称 2NN,不是 NN 的热备(不会代替 NN 工作),实际生产中并不会用到,而是采用 NN 的高可用方式(Zookeeper 配置多个 NN)来保证服务
- 主要功能职责为:
- 辅助 NN 工作,如定期合并 fsimage 和 edits,并推送给 NN
- 紧急情况下辅助恢复 NN 部分数据
4. Client 客户端
- 文件切分,当文件上传后将其切分成一个个的 block 存储(实际生产中一个文件块的大小为 128M 或 256M)
- 与 NN 交互,获取文件位置信息
- 与 DN 交互,读取或写入数据
- 提供命令来管理 HDFS,如 NN 格式化
- 提供命令来访问 HDFS,如对 HDFS 增删改查操作
三、HDFS 读写流程详解
1. 写数据流程
- 客户端向 NameNode 发送请求上传文件到指定目录
- NameNode 接收请求后,检查客户端权限和指定目录结构是否存在,检查通过后返回响应给客户端
- 客户端接收可上传响应后,向 NameNode 请求获取可上传的 DataNode 列表
- NameNode 选择合适的 DataNode 副本存储节点并返回给客户端
- 客户端获取可上传的 DataNode 节点后向这些 DataNode 节点请求建立传输通道
- 所有 DataNode 节点接收请求并返回应答
- 客户端与 DataNode 节点建立连接后,将文件按照每 64K 一个 packet 的形式向 DN 进行传输,DN 接收数据包后通过缓存继续向下游的 DN 进行传输,并将缓存中的数据落盘到本地
2. 读数据流程
- 客户端向 NameNode 发送请求下载指定目录的文件
- NameNode 接收请求后,检查客户端权限和指定文件是否存在,检查通过后返回下载文件的元数据给客户端
- 客户端接收到目标文件的元数据后,根据机架感知原则选择最近的 DN 节点请求下载文件,若选择的节点繁忙,则根据负载均衡请求另一 DN 节点的数据
- 客户端与 DN 建立连接后,DN 向客户端传输数据,客户端串行接收数据