HDFS简介

来源:互联网 发布:mac可以用bluestacks 编辑:程序博客网 时间:2024/06/03 17:59

HDFS 是一个 Apache Software Foundation 项目,是 Apache Hadoop 项目的一个子项目(参见 参考资料)。Hadoop 非常适于存储大型数据(比如 terabytes 和 petabytes),并使用 HDFS 作为其存储系统。HDFS 允许您连接多个集群中包含的节点 (普通个人计算机),那些集群上分布着一些数据文件。然后您可以将那些数据文件作为一个无缝文件系统来进行访问和存储。对数据文件的访问通过一种流线型(streaming) 方式进行处理,这意味着应用程序或命令通过 MapReduce 处理模型直接执行(参见 参考资料)。

HDFS 是容错的,且提供对大数据集的高吞吐量访问。本文探索 HDFS 的主要特性,并提供一个高级 HDFS 架构视图。

HDFS 概览

HDFS 与其他分布式文件系统有许多相似点,但也有几个不同点。一个明显的区别是 HDFS 的 “一次写入、多次读取(write-once-read-many)” 模型,该模型降低了并发性控制要求,简化了数据聚合性,支持高吞吐量访问。

HDFS 的另一个独特的特性是下面这个观点:将处理逻辑放置到数据附近通常比将数据移向应用程序空间更好。

HDFS 将数据写入严格限制为一次一个写入程序。字节总是被附加到一个流的末尾,字节流总是以写入顺序存储。

HDFS 有许多目标,下面是一些最明显的目标:

  • 通过检测故障和应用快速、自动的恢复实现容错性
  • 通过 MapReduce 流进行数据访问
  • 简单可靠的聚合模型
  • 处理逻辑接近数据,而不是数据接近处理逻辑
  • 跨异构普通硬件和操作系统的可移植性
  • 可靠存储和处理大量数据的可伸缩性
  • 通过跨多个普通个人计算机集群分布数据和处理来节约成本
  • 通过分布数据和逻辑到数据所在的多个节点上进行平行处理来提高效率
  • 通过自动维护多个数据副本和在故障发生时自动重新部署处理逻辑来实现可靠性

HDFS 向应用程序提供一些接口,将它们移到更靠近数据所在的位置,下一小节将详细介绍这一点。

进入 HDFS 的应用程序接口

您可以以多种不同的方法访问 HDFS。HDFS 提供了一个原生 Java™ 应用程序编程接口(API)和一个针对这个 Java API 的原生 C 语言封装器。另外,您可以使用一个 web 浏览器来浏览 HDFS 文件。

表 1 中描述的应用程序也可用于 HDFS 的接口。

表 1. 可以与 HDFS 接口的应用程序

HDFS 拥有一个功能强大的杰出特性集,这要归功于它的简单但强大的架构。

HDFS 架构

HDFS 由一些互联的节点集群组成,文件和目录驻留在那些节点上。一个 HDFS 集群包含一个节点,称为 NameNode,该节点管理文件系统名称空间并规范客户端对文件的访问。另外, Data node (DataNodes)将数据作为块存储在文件中。

Name node 和 Data node

在 HDFS 中,一个给定的 Name node 管理一些文件系统名称空间操作,比如打开、关闭以及重命名文件和目录。 Name node 还将数据块映射到 Data node,处理来自 HDFS 客户端的读写请求。 Data node 还根据 Name node 的指令创建、删除和复制数据块。

图 1 展示了 HDFS 的高级架构。

图 1. HDFS 架构
HDFS 架构图

如图 1 所示,一个集群包含一个 Name node 。这种设计有利于形成一个简化模型来管理每个名称空间并仲裁数据分布。

Name node 和 Data node 之间的关系

Name node 和 Data node 是一些软件组件,旨在以一种解耦合方式跨多个异构操作系统在普通的 PC 机上运行。HDFS 是使用 Java 编程语言构建的;因此,任何支持 Java 编程语言的机器都能运行 HDFS。一个典型的安装集群拥有一台专用机器,用于运行一个 Name node ,可能还有一个 Data node。集群中的其他每台机器都运行一个 Data node。

Data node 持续循环,询问 Name node 的指令。 Name node 不能直接连接到 Data node ,它只是从 Data node 调用的函数返回值。每个 Data node 都维护一个开放的服务器套接字,以便客户端代码或其他 Data node 能够读写数据。 Name node 知道这个服务器的主机或端口,将信息提供给有关客户端或其他 Data node 。请参见 通信协议 侧边栏,了解关于 Data node、Name node 和客户端之间通信的更多信息。

Name node 维护和管理对文件系统名称空间的更改。

文件系统名称空间

HDFS 支持一种传统的层级式文件结构,用户或应用程序可以在其中创建目录和保存文件。文件系统名称空间层级类似于大多数其他现有文件系统;您可以创建、重命名、重新定位和移除文件。

HDFS 还支持第三方文件系统,比如 CloudStore 和 Amazon Simple Storage Service (S3)(参见 参考资料)。

数据复制

HDFS 复制文件块以便容错。应用程序可以在一个文件创建时指定该文件的副本数,这个数量可以在以后随时更改。 Name node 负责所有块复制决定。

HDFS 使用一个智能副本放置模型来提高可靠性和性能。优化副本放置使得 HDFS 不同于其他大多数分布式文件系统,而一个高效使用网络带宽的、具有机柜意识的副本放置策略将进一步促进这种优化。

大型 HDFS 环境通常跨多个计算机安装点运行。不同安装点中的两个 Data node 之间的通信通常比同一个安装中的 Data node 之间的通信缓慢。因此, Name node 试图优化 Data node 之间的通信。 Name node 通过 Data node 的机柜 ID 识别它们的位置。

数据组织

HDFS 的一个主要目标是支持大文件。一个典型的 HDFS 块的大小为 64MB。因此,每个 HDFS 文件包含一个或多个 64MB 块。HDFS 尝试将每个块都放置到独立的 Data node 上。

文件创建过程

在 HDFS 上操作文件与其他文件系统类似。但是,由于 HDFS 是一个显示为单个磁盘的多机器系统,所有操作 HDFS 上的文件的代码都使用 org.apache.hadoop.fs.FileSystem 对象(参见 参考资料)的一个子集。

清单 1 中的代码演示了 HDFS 上的一个典型的文件创建过程。

清单 1. HDFS 上的典型文件创建过程
1
2
3
4
5
6
7
8
byte[] fileData = retrieveFileDataFromSomewhere();
String filePath = retrieveFilePathStringFromSomewhere();
Configuration config = new Configuration();  // assumes to automatically load
                                             // hadoop-default.xml and hadoop-site.xml
org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(config);
org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(filePath);
org.apache.hadoop.fs.FSDataOutputStream outputStream = hdfs.create(path);
outputStream.write(fileData, 0, fileData.length);

提交

当一个客户端在 HDFS 中创建一个文件时,它首先将数据缓存到一个临时本地文件中。然后,它将后续写入重定向到这个临时文件。当临时文件积累的数据足以填充一个 HDFS 块时,客户端将向 Name node 报告, Name node 将把文件转换为一个永久 Data node。然后,客户端关闭临时文件,并将剩余的数据注入新创建的 Data node。 Name node 然后将 Data node 提交到磁盘。

复制管道化

当一个客户端积累了一个完整的用户数据块时,它将从 Name node 检索包含那个块的副本的 Data node 的列表。然后,客户端将整个数据块注入这个副本列表中指定的第一个 Data node 。当 Data node 接收数据块时,它将数据块写入磁盘,然后将副本转移到列表中的下一个 Data node 。这种管道化(pipelining)过程不断重复,直到复制因子被满足。

数据存储可靠性

HDFS 的一个重要目标是可靠存储数据,即使在 Name node、 Data node 或网络分区中出现故障。

HDFS 克服故障的第一个步骤是探测。HDFS 使用心跳消息来探测 Name node 和 Data node 之间的连通性。

HDFS 心跳

有几种情况可能会导致 Name node 和 Data node 之间的连通性丧失。因此,每个 Data node 都向它的 Name node 发送定期心跳消息,这样,如果 Name node 不能接收心跳消息,就表明连通性丧失。 Name node 将不能响应心跳消息的 Data node 标记为 “死 Data node ”,并不再向它们发送请求。存储在一个死节点上的数据不再对那个节点的 HDFS 客户端可用,该节点将被从系统有效地移除。如果一个节点的死亡导致数据块的复制因子降至最小值之下, Name node 将启动附加复制,将复制因子带回正常状态。

图 2 展示了发送心跳消息的 HDFS 流程。

图 2. HDFS 心跳流程
HDFS 心跳流程示意图

数据块再平衡

HDFS 数据块可能并不总是均衡地跨 Data node 分布,这意味着一个或多个 Data node 的已使用空间可能没有被充分利用。因此,HDFS 支持使用各种模型重新平衡数据块。一种模型可能是:如果一个 Data node 上的空闲空间太少,该模型将把该节点上的数据自动移动到另一个节点。 另一种模型可能是:如果某个文件的需求突然增加,该模型将动态创建额外的副本并重新平衡一个集群中的其他数据块。HDFS 还提供 hadoop balance 命令以支持手动平衡任务。

重新平衡的一个常见原因是集群中添加了新的 Data node 。放置新的数据块时, Name node 将考虑各种参数,然后选择接收它们的 Data node 。需要考虑的事项包括:

  • 块副本写入策略
  • 阻止安装或机柜故障导致的数据丢失
  • 减小跨安装网络 I/O
  • 跨集群中的 Data node 的统一数据分布

HDFS 的集群再平衡特性只是它用于保持其数据完整性的一种机制,稍后将讨论其他机制。

数据完整性

HDFS 在确保跨集群数据完整性方面做了许多工作。它在 HDFS 文件的内容上使用 checksum 验证,将计算出的 checksums 保存在实际数据所在的名称空间中的独立的隐藏文件中。当客户端检索文件数据时,它能验证收到的数据是否匹配关联文件中存储的 checksum。

HDFS 名称空间通过每个 Name node 保存的一个事务日志存储。文件系统名称空间,以及文件块映射和文件系统属性,一并保存在一个名为 FsImage 的文件中。当一个 Name node 初始化时,它读取 FsImage 文件以及其他文件,并应用这些文件中保存的事务和状态信息。

同步元数据更新

Name node 使用一个名为 EditLog 的日志文件持久记录对 HDFS 文件系统元数据发生的每个事务。如果 EditLog 或 FsImage 文件损坏,它们所属的 HDFS 实例将无法正常工作。因此,一个 Name node 支持多个 FsImage 和 EditLog 文件副本。对于这些文件的多个副本,对任一文件的任何更改都将同步传播到所有副本。当一个 Name node 重新启动时,它使用 FsImage 和 EditLog 的最新统一版本来初始化自身。

HDFS 的用户、文件和目录权限

HDFS 对文件和目录实现了一个权限模型,这个模型与 Portable Operating System Interface (POSIX) 模型有很多共同点;例如,每个文件和目录都关联到一个所有者和一个组。HDFS 权限模型支持读取(r)、写入(w)和执行(x)权限。由于 HDFS 中没有文件执行这个概念,x 权限的含义不同。简言之,x 权限表明可以访问一个给定父目录的一个子目录。一个文件或目录的所有者是创建它的客户端进程的身份。组是父目录的组。

快照

HDFS 原来计划支持一些快照,这些快照可用于将一个损坏的 HDFS 实例回滚到此前状态。但是,HDFS 的快照支持目前还没有被提上议事日程。

结束语

Hadoop 是一个 Apache Software Foundation 分布式文件系统和数据管理项目,目标是存储和管理大量数据。Hadoop 使用一个名为 HDFS 的存储系统来连接一些普通个人计算机(称为节点),这些节点包含在其上分布着大量数据块的多个集群中。通过 MapReduce 处理模型,您可以将那些数据块作为一个无缝文件系统进行访问和存储。

HDFS 与其他分布式文件系统有许多共同点,但也有一些重要区别。一个重要区别是 HDFS 的 “一次写入、多次读取” 模型,该模型降低了并发性控制要求,简化了数据聚合性,支持高吞吐量访问。

为了提供一个优化的数据访问模型,HDFS 的设计思想是将处理逻辑放置到数据附近,而不是将数据放置到应用程序空间附加。

转载自:https://www.ibm.com/developerworks/cn/web/wa-introhdfs/index.html