前言  

Hadoop 是由 Apache 基金会开发的分布式系统基础框架,主要解决海量数据存储和海量数据分析问题。Hadoop 起源于 Apache Nutch 项目,起始于2002年,在2006年被正式命名为Hadoop。Hadoop有3大核心组件,分别是HDFS、MapReduce 和 YARN,本次我们重点介绍 HDFS。

一、HDFS简介

HDFS 全称 Hadoop Distributed File System,是一个分布式文件管理系统,简单理解就是文件系统,用于存储文件,通过目录树来定位文件。跟一般文件系统的区别是,它可以通过扩展服务器节点来扩充存储量。与其他的一些分布式文件管理系统不同的是,HDFS的设计之初是为了构建 Apache Nutch 网络搜索引擎项目的基础设施,旨在用低成本的硬件构建出支持高吞吐量的文件系统。

二、HDFS的特点

  1. 高容错性:一个HDFS集群可能会包含非常多节点,HDFS将文件分块(Block)存储,并且会自动保存多个副本到不同的机器节点上以保证数据的安全,而且HDFS可以检测故障并且从故障中快速恢复。
  2. 高吞吐率:与一般文件系统的访问低延迟不同,HDFS的重点是处理大量的数据,支持数据处理规模是GB、TB、甚至是PB的级别。因此,相比较用户交互式程序,HDFS更加适用批处理的应用程序。
  3. 一次写入多次读取模型:一个文件只支持单线程的文件写入,HDFS假定一个文件一旦被创建,写入完成之后除了追加和截断就不需要更改。这种设置简化了数据一致性的问题,从而也提高了数据访问的吞吐率,同时也不支持文件的随机修改。
  4. 大数据集:HDFS 中的典型文件大小为 GB 到 TB,对于大批量小文件HDFS无法做到高效存储。
  5. 可移植性:HDFS是由Java语言构建,任何支持Java的机器,都可以运行HDFS,因此HDFS可以轻松地从一个平台移植到另一个平台。

三、HDFS的组成架构


HDFS Hadoop 文件在哪 hadoop中hdfs_hdfs

(图片来源于官网)

HDFS集群是主/从的架构模式。一个HDFS集群由一个或者多个NameNode+多个的DataNode组成。NameNode是集群的主节点,它负责管理HDFS集群。DataNode是从节点,负责接收指令,执行对应的动作。

1.  NameNode:

  • 主节点,负责管理文件系统命名空间;
  • 配置副本策略;
  • 管理数据块的映射信息(Blockmap);
  • 控制客户端对文件的访问。

2.  DataNode:

  • 从节点,存储实际的数据块;
  • 执行数据块的读写操作。

3.  Client:

  • 客户端,用户可以通过客户端与HDFS交互;
  • 负责与 NameNode 和 DataNode 交互;
  • 提供 HDFS 的管理和访问命令。

4.  Secondary NameNode:

  • 辅助NameNode,分担其工作,但并不是NameNode的热备;
  • 紧急情况,可辅助恢复 NameNode;

备注:目前一般采用QJM+ZKFC来解决 NameNode 的单点故障和自动故障转移问题。

四、HDFS的文件写入流程

  1. 客户端向 NameNode 请求上传文件,NameNode 检查文件目录树和文件是否合法,并且应答客户端是否可以上传文件;
  2. 客户端请求上传第一个Block,NameNode 选择副本存储 DataNode 返回给客户端;
  3. 客户端请求与第一个 DataNode 建立传输通道,第一个 DataNode 收到请求后会继续调用下一个 DataNode,直到将通道建立完成,并且逐级应答客户端;
  4. 客户端从磁盘中读取数据到内存,以 Package 为单位上传到第一个DataNode 中,DataNode 收到之后就将数据传到下一个 DataNode中。并且DataNode 每传一个 Package 就会放入一个应答队列,等待应答;
  5. 等应答成功,客户端会继续上传数据。

五、HDFS的文件读取流程

  1. 客户端发起文件下载的请求给 NameNode;
  2. NameNode 找到文件块所在的 DataNode 地址;
  3. 客户端选择一台DataNode(就近原则,然后随机),请求读取数据;
  4. DataNode 从磁盘中读取数据,以 Package 为单位传输给客户端;
  5. 客户端获取数据,先缓存,然后写入目标文件。

本期内容就到这里了