Hadoop分布式文件系统:架构和设计要点
原文:http://hadoop.apache.org/core/docs/current/hdfs_design.html
一、前提和设计目标
1、硬件错误是常态,而非异常情况,
HDFS可能是有成百上千的
server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是
HDFS的核心架构目标。
2、跑在
HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理;比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。
3、
HDFS以支持大数据集合为目标,一个存储在上面的典型文件大小一般都在千兆至
T字节,一个单一
HDFS实例应该能支撑数以千万计的文件。
4、
HDFS应用对文件要求的是
write-one-read-many访问模型。一个文件经过创建、写,关闭之后就不需要改变。这一假设简化了数据一致性问 题,使高吞吐量的数据访问成为可能。典型的如
MapReduce框架,或者一个
web crawler应用都很适合这个模型。
5、移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好,
HDFS提供给应用这样的接口。
6、在异构的软硬件平台间的可移植性。
二、
Namenode和
Datanode
HDFS采用
master/slave架构。一个
HDFS集群是有一个
Namenode和一定数目的
Datanode组成。
Namenode是一个中心服 务器,负责管理文件系统的
namespace和客户端对文件的访问。
Datanode在集群中一般是一个节点一个,负责管理节点上它们附带的存储。在内 部,一个文件其实分成一个或多个
block,这些
block存储在
Datanode集合里。
Namenode执行文件系统的
namespace操作,例如 打开、关闭、重命名文件和目录,同时决定
block到具体
Datanode节点的映射。
Datanode在
Namenode的指挥下进行
block的创 建、删除和复制。
Namenode和
Datanode都是设计成可以跑在普通的廉价的运行
linux的机器上。
HDFS采用
java语言开发,因此可以部 署在很大范围的机器上。一个典型的部署场景是一台机器跑一个单独的
Namenode节点,集群中的其他机器各跑一个
Datanode实例。这个架构并不排 除一台机器上跑多个
Datanode,不过这比较少见。
单一节点的
Namenode大大简化了系统的架构。
Namenode负责保管和管理所有的
HDFS元数据,因而用户数据就不需要通过
Namenode(也就是说文件数据的读写是直接在
Datanode上)。
三、文件系统的
namespace
HDFS支持传统的层次型文件组织,与大多数其他文件系统类似,用户可以创建目录,并在其间创建、删除、移动和重命名文件。
HDFS不支持
user quotas和访问权限,也不支持链接(
link),不过当前的架构并不排除实现这些特性。
Namenode维护文件系统的
namespace,任何对文 件系统
namespace和文件属性的修改都将被
Namenode记录下来。应用可以设置
HDFS保存的文件的副本数目,文件副本的数目称为文件的
replication因子,这个信息也是由
Namenode保存。
四、数据复制
HDFS被设计成在一个大集群中可以跨机器地可靠地存储海量的文件。它将每个文件存储成
block序列,除了最后一个
block,所有的
block都是同 样的大小。文件的所有
block为了容错都会被复制。每个文件的
block大小和
replication因子都是可配置的。
Replication因子可 以在文件创建的时候配置,以后也可以改变。
HDFS中的文件是
write-one,并且严格要求在任何时候只有一个
writer。
Namenode全权管 理
block的复制,它周期性地从集群中的每个
Datanode接收心跳包和一个
Blockreport。心跳包的接收表示该
Datanode节点正常工 作,而
Blockreport包括了该
Datanode上所有的
block组成的列表。
1、副本的存放,副本的存放是
HDFS可靠性和性能的关键。
HDFS采用一种称为
rack-aware的策略来改进数据的可靠性、有效性和网络带宽的利 用。这个策略实现的短期目标是验证在生产环境下的表现,观察它的行为,构建测试和研究的基础,以便实现更先进的策略。庞大的
HDFS实例一般运行在多个机 架的计算机形成的集群上,不同机架间的两台机器的通讯需要通过交换机,显然通常情况下,同一个机架内的两个节点间的带宽会比不同机架间的两台机器的带宽 大。
通过一个称为
Rack Awareness的过程,
Namenode决定了每个
Datanode所属的
rack id。一个简单但没有优化的策略就是将副本存放在单独的机架上。这样可以防止整个机架(非副本存放)失效的情况,并且允许读数据的时候可以从多个机架读 取。这个简单策略设置可以将副本分布在集群中,有利于组件失败情况下的负载均衡。但是,这个简单策略加大了写的代价,因为一个写操作需要传输
block到 多个机架。
在大多数情况下,
replication因子是
3,
HDFS的存放策略是将一个副本存放在本地机架上的节点,一个副本放在同一机架上的另一个节点,最后一 个副本放在不同机架上的一个节点。机架的错误远远比节点的错误少,这个策略不会影响到数据的可靠性和有效性。三分之一的副本在一个节点上,三分之二在一个 机架上,其他保存在剩下的机架中,这一策略改进了写的性能。
2、副本的选择,为了降低整体的带宽消耗和读延时,
HDFS会尽量让
reader读最近的副本。如果在
reader的同一个机架上有一个副本,那么就读该副本。如果一个
HDFS集群跨越多个数据中心,那么
reader也将首先尝试读本地数据中心的副本。
3、
SafeMode
Namenode启动后会进入一个称为
SafeMode的特殊状态,处在这个状态的
Namenode是不会进行数据块的复制的。
Namenode从所有的
Datanode接收心跳包和
Blockreport。
Blockreport包括了某个
Datanode所有的数据块列表。每个
block都有指定的最 小数目的副本。当
Namenode检测确认某个
Datanode的数据块副本的最小数目,那么该
Datanode就会被认为是安全的;如果一定百分比(这 个参数可配置)的数据块检测确认是安全的,那么
Namenode将退出
SafeMode状态,接下来它会确定还有哪些数据块的副本没有达到指定数目,并将 这些
block复制到其他
Datanode。
五、文件系统元数据的持久化
Namenode存储
HDFS的元数据。对于任何对文件元数据产生修改的操作,
Namenode都使用一个称为
Editlog的事务日志记录下来。例如, 在
HDFS中创建一个文件,
Namenode就会在
Editlog中插入一条记录来表示;同样,修改文件的
replication因子也将往
Editlog插入一条记录。
Namenode在本地
OS的文件系统中存储这个
Editlog。整个文件系统的
namespace,包括
block到文件 的映射、文件的属性,都存储在称为
FsImage的文件中,这个文件也是放在
Namenode所在系统的文件系统上。
Namenode在内存中保存着整个文件系统
namespace和文件
Blockmap的映像。这个关键的元数据设计得很紧凑,因而一个带有
4G内存的
Namenode足够支撑海量的文件和目录。当
Namenode启动时,它从硬盘中读取
Editlog和
FsImage,将所有
Editlog中的事务作 用(
apply)在内存中的
FsImage
,并将这个新版本的
FsImage从内存中
flush到硬盘上
,然后再
truncate这个旧的
Editlog,因为这个旧的
Editlog的事务都已经 作用在
FsImage上了。这个过程称为
checkpoint。在当前实现中,
checkpoint只发生在
Namenode启动时,在不久的将来我们将 实现支持周期性的
checkpoint。
Datanode并不知道关于文件的任何东西,除了将文件中的数据保存在本地的文件系统上。它把每个
HDFS数据块存储在本地文件系统上隔离的文件中。
Datanode并不在同一个目录创建所有的文件,相反,它用启发式地方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录创建 所有的文件不是最优的选择,因为本地文件系统可能无法高效地在单一目录中支持大量的文件。当一个
Datanode启动时,它扫描本地文件系统,对这些本地 文件产生相应的一个所有
HDFS数据块的列表,然后发送报告到
Namenode,这个报告就是
Blockreport。
六、通讯协议
所有的
HDFS通讯协议都是构建在
TCP/IP协议上。客户端通过一个可配置的端口连接到
Namenode,通过
ClientProtocol与
Namenode交互。而
Datanode是使用
DatanodeProtocol与
Namenode交互。从
ClientProtocol和
Datanodeprotocol抽象出一个远程调用
(RPC),在设计上,
Namenode不会主动发起
RPC,而是是响应来自客户端和
Datanode
的
RPC请求。
七、健壮性
HDFS的主要目标就是实现在失败情况下的数据存储可靠性。常见的三种失败:
Namenode failures, Datanode failures和网络分割(
network partitions)。
1、硬盘数据错误、心跳检测和重新复制
每个
Datanode节点都向
Namenode周期性地发送心跳包。网络切割可能导致一部分
Datanode跟
Namenode失去联系。
Namenode通过心跳包的缺失检测到这一情况,并将这些
Datanode标记为
dead,不会将新的
IO请求发给它们。寄存在
dead Datanode上的任何数据将不再有效。
Datanode的死亡可能引起一些
block的副本数目低于指定值,
Namenode不断地跟踪需要复制的
block,在任何需要的情况下启动复制。在下列情况可能需要重新复制:某个
Datanode节点失效,某个副本遭到损坏,
Datanode上的硬盘错 误,或者文件的
replication因子增大。
2、集群均衡
HDFS支持数据的均衡计划,如果某个
Datanode节点上的空闲空间低于特定的临界点,那么就会启动一个计划自动地将数据从一个
Datanode搬移 到空闲的
Datanode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并分布到集群中以满足应用的要求。这些均衡计划目前 还没有实现。
3、数据完整性
从某个
Datanode获取的数据块有可能是损坏的,这个损坏可能是由于
Datanode的存储设备错误、网络错误或者软件
bug造成的。
HDFS客户端 软件实现了
HDFS文件内容的校验和。当某个客户端创建一个新的
HDFS文件,会计算这个文件每个
block的校验和,并作为一个单独的隐藏文件保存这些 校验和在同一个
HDFS namespace下。当客户端检索文件内容,它会确认从
Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择 从其他
Datanode获取该
block的副本。
4、元数据磁盘错误
FsImage和
Editlog是
HDFS的核心数据结构。这些文件如果损坏了,整个
HDFS实例都将失效。因而,
Namenode可以配置成支持维护多 个
FsImage和
Editlog的拷贝。任何对
FsImage或者
Editlog的修改,都将同步到它们的副本上。这个同步操作可能会降低
Namenode每秒能支持处理的
namespace事务。这个代价是可以接受的,因为
HDFS是数据密集的,而非元数据密集。当
Namenode重启的 时候,它总是选取最近的一致的
FsImage和
Editlog使用。
Namenode在
HDFS是单点存在,如果
Namenode所在的机器错误,手工的干预是必须的。目前,在另一台机器上重启因故障而停止服务的
Namenode这个功能还没实现。
5、快照
快照支持某个时间的数据拷贝,当
HDFS数据损坏的时候,可以恢复到过去一个已知正确的时间点。
HDFS目前还不支持快照功能。
八、数据组织
1、数据块
兼容
HDFS的应用都是处理大数据集合的。这些应用都是写数据一次,读却是一次到多次,并且读的速度要满足流式读。
HDFS支持文件的
write- once-read-many语义。一个典型的
block大小是
64MB,因而,文件总是按照
64M切分成
chunk,每个
chunk存储于不同的
Datanode
2、步骤
某个客户端创建文件的请求其实并没有立即发给
Namenode,事实上,
HDFS客户端会将文件数据缓存到本地的一个临时文件。应用的写被透明地重定向到 这个临时文件。当这个临时文件累积的数据超过一个
block的大小(默认
64M),客户端才会联系
Namenode。
Namenode将文件名插入文件系 统的层次结构中,并且分配一个数据块给它,然后返回
Datanode的标识符和目标数据块给客户端。客户端将本地临时文件
flush到指定的
Datanode上。当文件关闭时,在临时文件中剩余的没有
flush的数据也会传输到指定的
Datanode,然后客户端告诉
Namenode文件已经 关闭。此时
Namenode才将文件创建操作提交到持久存储。如果
Namenode在文件关闭前挂了,该文件将丢失。
上述方法是对通过对
HDFS上运行的目标应用认真考虑的结果。如果不采用客户端缓存,由于网络速度和网络堵塞会对吞估量造成比较大的影响。
3、流水线复制
当某个客户端向
HDFS文件写数据的时候,一开始是写入本地临时文件,假设该文件的
replication因子设置为
3,那么客户端会从
Namenode
获取一张
Datanode列表来存放副本。然后客户端开始向第一个
Datanode传输数据,第一个
Datanode一小部分一小部分(
4kb)地接收数 据,将每个部分写入本地仓库,并且同时传输该部分到第二个
Datanode节点。第二个
Datanode也是这样,边收边传,一小部分一小部分地收,存储 在本地仓库,同时传给第三个
Datanode,第三个
Datanode就仅仅是接收并存储了。这就是流水线式的复制。
九、可访问性
HDFS给应用提供了多种访问方式,可以通过
DFSShell通过命令行与
HDFS数据进行交互,可以通过
java API调用,也可以通过
C语言的封装
API访问,并且提供了浏览器访问的方式。正在开发通过
WebDav协议访问的方式。具体使用参考文档。
十、空间的回收
1、文件的删除和恢复
用户或者应用删除某个文件,这个文件并没有立刻从
HDFS中删除。相反,
HDFS将这个文件重命名,并转移到
/trash目录。当文件还在
/trash目 录时,该文件可以被迅速地恢复。文件在
/trash中保存的时间是可配置的,当超过这个时间,
Namenode就会将该文件从
namespace中删除。 文件的删除,也将释放关联该文件的数据块。注意到,在文件被用户删除和
HDFS空闲空间的增加之间会有一个等待时间延迟。
当被删除的文件还保留在
/trash目录中的时候,如果用户想恢复这个文件,可以检索浏览
/trash目录并检索该文件。
/trash目录仅仅保存被删除 文件的最近一次拷贝。
/trash目录与其他文件目录没有什么不同,除了一点:
HDFS在该目录上应用了一个特殊的策略来自动删除文件,目前的默认策略是 删除保留超过
6小时的文件,这个策略以后会定义成可配置的接口。
2、
Replication因子的减小
当某个文件的
replication因子减小,
Namenode会选择要删除的过剩的副本。下次心跳检测就将该信息传递给
Datanode,
Datanode就会移除相应的
block并释放空间,同样,在调用
setReplication方法和集群中的空闲空间增加之间会有一个时间延迟。
参考资料:
HDFS Java API: http://hadoop.apache.org/core/docs/current/api/
HDFS source code: http://hadoop.apache.org/core/version_control.html
分享到:
相关推荐
为了应对这一挑战,研究者们开始探索使用基于Hadoop分布式计算平台的仿真方法。本文将详细阐述基于Hadoop的磁流体动力学模型仿真研究的相关知识点。 Hadoop是Apache基金会开发的分布式存储与计算框架,它允许分布式...
Hadoop分布式文件系统(HDFS)是Hadoop项目的核心组件之一,旨在为大规模数据集提供高效可靠的存储解决方案。HDFS的设计原则强调了数据的分布式存储与处理,通过将计算任务部署在数据所在的节点上,有效提升了数据...
本文将讨论如何基于Hadoop分布式存储与分析平台解决这一问题。 Hadoop是一个开源的分布式存储和处理大数据的框架,它能有效地存储和处理PB级别的数据。Hadoop的核心是HDFS(Hadoop Distributed File System),它...
对于视频存储的挑战,系统利用Hadoop分布式文件系统(HDFS)来存储视频,实现了大容量、高并发、高可靠、易扩展、易整合和易管理的特性。HDFS的高容错性允许存储大量数据,即使面对硬件故障也能保证数据安全和可用性...
【基于Hadoop分布式计算的混合神经网络负荷分类模型】 本文主要探讨了如何利用Hadoop分布式计算框架构建一个混合神经网络负荷分类模型。Hadoop作为大数据处理的重要工具,因其分布式存储和计算能力,使得大规模数据...
3. Hadoop分布式爬虫设计:Hadoop分布式爬虫设计是基于Hadoop分布式文件系统HDFS及其分布式计算框架MapReduce的基础上开发的分布式搜索引擎的爬虫设计相关技术、原理、流程图。 二、分布式爬虫技术原理 1. ...
Hadoop通过MapReduce实现了分布式计算,通过HDFS实现了数据的分布式存储,使得它能够处理海量的数据集。 Hadoop生态系统中的其它工具还有ZooKeeper,用于配置管理、命名服务、提供分布式同步和提供组服务;Avro,是...
通过阅读《HDFS——Hadoop分布式文件系统深度实践》,读者不仅可以掌握HDFS的基本操作,还能深入了解其内部机制,从而更好地利用HDFS来构建和管理自己的大数据存储系统。书中的实例和实践指导对于提升Hadoop开发者和...
在开始Hadoop分布式计算之前,我们需要先搭建Hadoop环境。这通常包括以下步骤: 1. 安装Java:Hadoop依赖Java运行环境,确保系统已安装JDK 8或更高版本。 2. 下载Hadoop:从Apache官方网站获取最新稳定版的Hadoop...
Hadoop分布式文件系统(HDFS)可以存储大规模的数据集,而MapReduce是Hadoop的核心组件,用于处理大规模数据集。除此之外,Hadoop生态系统中还包括了HBase(列式存储数据库)、Hive(数据仓库)、Pig(数据流语言)...
Hadoop分布式文件系统(Hadoop Distributed File System, HDFS)是一种高度可靠且具有极高可扩展性的分布式文件系统,能够支持大规模的数据存储需求[1]。HDFS的设计理念源于Google的文件系统(Google File System, ...
该系统由分布式文件系统和分布式计算框架两部分组成,提供了透明的分布式基础架构,允许处理大量数据的应用程序轻松地在Hadoop集群上运行。 Hadoop的存储机制主要使用HDFS(Hadoop Distributed File System),提供...
【标题】: "VirtualBox环境下基于多台Ubuntu虚拟机的Hadoop分布式计算环境搭建" 【描述】: 本文档详细介绍了如何在VirtualBox虚拟化环境中,利用多台Ubuntu虚拟机搭建一个Hadoop分布式计算环境。整个过程包括了...
Hadoop架构的应用实例——职工工资统计程序,展示了Hadoop在分布式计算领域的实际应用。在这个实例中,通过对职工工资数据进行统计处理,分析了在单节点模式、伪分布模式和完全分布模式下的运行效率。单节点模式是指...
Hadoop是一个开源的分布式存储和计算平台,它提供了一套完整的生态系统用于处理大规模数据集。Hadoop的核心是其分布式文件系统HDFS(Hadoop Distributed File System),它能够将数据存储在由大量廉价计算机组成的...
Hadoop分布式计算平台是大数据处理领域的一个核心工具,它的出现极大地推动了大数据处理技术的发展。这个源代码压缩包,版本为2.4.0,包含了Hadoop项目的所有源代码,对于学习、研究或者开发基于Hadoop的应用来说,...
总之,Hadoop分布式文件系统为云存储提供了高效、安全的数据检索机制,通过分布式计算和智能数据分布,降低了通信开销,提升了整体性能。这对于处理海量数据的企业和组织来说,是实现快速、可靠的数据存取和分析的...
本文将深入探讨Hadoop在分布式云存储系统中的应用及其核心组件——Hadoop分布式文件系统(HDFS)。 Hadoop是Apache软件基金会开发的一个开放源代码项目,主要由两个核心部分组成:HDFS和MapReduce。HDFS为大数据...