弁言
Hadoop散播式文件体系 (。
条件 和计划 方针
硬件过错
硬件过错 是常态而不是非常 。HDFS也许由成百上千的做事器所构成 ,每个做事器上存储着文件体系 的部分 数据。我们面对 的实际 是构成 体系 的组件数量 是伟大的,并且 任一组件都有也许失效,这意味着总是有一部分 HDFS的组件是不事变 的。因此过错 检测和快速、主动 的规复 是HDFS最核心 的架构方针 。
流式数据拜访
运行在HDFS上的操纵和平凡 的操纵差别 ,必要 流式拜访它们的数据集。HDFS的计划 中更多的思量 到了数据批处理 赏罚 ,而不是用户交互处理 赏罚 。比之数据拜访的低耽误 题目 ,更关键的在于数据拜访的高吞吐量。POSIX标准 设置的很多 硬性约束对HDFS操纵体系 不是必需的。为了前进数据的吞吐量,在一些关键方面对 POSIX的语义做了一些批改。
大局限 数据集
运行在HDFS上的操纵具有很大的数据集。HDFS上的一个典范 文件巨细 一样平常 都在G字节至T字节。因此,HDFS被调理以支持 大文件存储。它应当 能供给 团体 上高的数据传输带宽,能在一个集群里扩张到数百个节点。一个单一的HDFS实例应当 能支持 数以千万 计的文件。
大略 的同等 性模子
HDFS操纵必要 一个“一次写入多次读取”的文件拜访模子 。一个文件颠末 创建 、写入和封闭 之后就不必要 变化 。这一假设简化了数据同等 性题目 ,并且 使高吞吐量的数据拜访成为也许。Map/Reduce操纵可能网络爬虫操纵都非常适宜 这个模子 。如今尚有 阴谋在将来 扩充这个模子 ,使之支持 文件的附加写操纵 。
“移动打定比移动数据更划算”
一个操纵哀求的打定,离它操纵 的数据越近就越高效,在数据到达 海量级别的时间 更是云云 。由于 如许 就能低落 网络壅闭 的影响,前进体系 数据的吞吐量。将打定移动到数据左近 ,比之将数据移动到操纵地点 显然更好。HDFS为操纵供给 了将它们本身 移动到数据左近 的接口。
异构软硬件平台间的可移植性
HDFS在计划 的时间 就思量 到平台的可移植性。这种特性 利便 了HDFS作为大局限 数据操纵平台的推广。
Namenode 和 Datanode
HDFS采用 master/slave架构。一个HDFS集群是由一个Namenode和肯定 数方针Datanodes构成 。Namenode是一此中 心做事器,认真 管理 文件体系 的名字空间(namespace)以及客户端对文件的拜访。集群中的Datanode一样平常 是一个节点一个,认真 管理 它地点 节点上的存储。HDFS裸露 了文件体系 的名字空间,用户可以或许 以文件的形式在上面存储数据。从内部看,一个文件着实 被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode推行 文件体系 的名字空间操纵 ,比如 打开、封闭 、重定名 文件或目次 。它也认真 断定 数据块到具体 Datanode节点的映射。Datanode认真 处理 赏罚 文件体系 客户端的读写哀求。在Namenode的同一 调治 下举办数据块的创建 、删除和复制。
Namenode和Datanode被计划 成可以在平凡 的商用呆板 上运行。这些呆板 一样平常 运行着GNU/Linux操纵 体系 (
文件体系 的名字空间 (namespace)
HDFS支持 传统的条理 型文件构造 结构。用户可能操纵措施可以创建 目次 ,然后将文件生涯 在这些目次 里。文件体系 名字空间的条理 结构和大多数现有的文件体系 类似:用户可以创建 、删除、移动或重定名 文件。当前,HDFS不支持 用户磁盘配额和拜访权限独霸,也不支持 硬链接和软链接。但是HDFS架构并不阴碍 实现这些特性 。
Namenode认真 掩护文件体系 的名字空间,任何对文件体系 名字空间或属性的批改都将被Namenode记实 下来。操纵措施可以设置HDFS生涯 的文件的副本数量 。文件副本的数量 称为文件的副本系数,这个信息也是由Namenode生涯 的。
数据复制
HDFS被计划 成可以或许 在一个大集群中跨呆板 可靠地存储超大文件。它将每个文件存储成一系列的数据块,除了末了 一个,全部 的数据块都是同样巨细 的。为了容错,文件的全部 数据块都市 有副本。每个文件的数据块巨细 和副本系数都是可设置 的。操纵措施可以指定某个文件的副本数量 。副本系数可以在文件创建 的时间 指定,也可以在之后变化 。HDFS中的文件都是一次性写入的,并且 严肃哀求 在任何时间 只能有一个写入者。
Namenode全权管理 数据块的复制,它周期性地从集群中的每个Datanode经受 心跳信号和块状况 陈诉 (Blockreport)。经受 到心跳信号意味着该Datanode节点事变 正常。块状况 陈诉 包孕 了一个该Datanode上全部 数据块的列表。
副本寄放 : 最最起头的一步
副本的寄放 是HDFS可靠性和性能的关键。优化的副本寄放 计策是HDFS区分于其他大部分散播式文件体系 的重要 特性 。这种特性 必要 做大宗的调优,并必要 履历 的积累。HDFS采用 一种称为机架感知(rack-aware)的计策来改进 数据的可靠性、可用性和网络带宽的操作率。如今实现的副本寄放 计策只是在这个方向 上的第一步。实现这个计策的短期方针 是验证它在生产环境 下的有效 性,观察 它的行径,为实现更先辈 的计策打下测试和研讨 的根本 。
大型HDFS实例一样平常 运行在超过 多个机架的打定机构成 的集群上,差别 机架上的两台呆板 之间的通讯 必要 颠末 交换机。在大多数情况下,同一个机架内的两台呆板 间的带宽会比差别 机架的两台呆板 间的带广大 。
通过一个的过程,Namenode可以断定 每个Datanode所属的机架id。一个大略 但没有优化的计策就是将副本寄放 在差别 的机架上。如许 可以有效 预防当所有机架失效时数据的损失,并且 允许读数据的时间 充沛 操作多个机架的带宽。这种计策设置可以将副本匀称 散播在集群中,有利于当组件失效情况下的负载均衡 。但是,由于 这种计策的一个写操纵 必要 传输数据块到多个机架,这增进了写的代价。
在大多数情况下,副本系数是3,HDFS的寄放 计策是将一个副本寄放 在内地 机架的节点上,一个副本放在同一机架的另一个节点上,末了 一个副本放在差别 机架的节点上。这种计策镌汰 了机架间的数据传输,这就前进了写操纵 的遵从 。机架的过错 远远比节点的过错 少,以是 这个计策不会影响到数据的可靠性和可用性。于此同时,由于 数据块只放在两个(不是三个)差别 的机架上,以是 此计策镌汰 了读取数据时必要 的网络传输总带宽。在这种计策下,副本并不是匀称 散播在差别 的机架上。三分之一的副本在一个节点上,三分之二的副本在一个机架上,其他副本匀称 散播在剩下的机架中,这一计策在不侵吞 数据可靠性和读取性能的情况下改进 了写的性能。
当前,这里先容 的默认副本寄放 计策正在开拓的过程中。
副本选择
为了低落 团体 的带宽损耗和读取延时,HDFS会只管 让读取措施读取离它近来 的副本。假如 在读取措施的同一个机架上有一个副本,那么就读取该副本。假如 一个HDFS集群超过 多个数据中心,那么客户端也将起首 读内地 数据中心的副本。
安详模式
Namenode启动后会进入一个称为安详模式的出格状况 。处于安详模式的Namenode是不会举办数据块的复制的。Namenode从全部 的 Datanode经受 心跳信号和块状况 陈诉 。块状况 陈诉 包孕了某个Datanode全部 的数据块列表。每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数量 到达 这个最小值,那么该数据块就会被认为 是副本安详(safely replicated)的;在肯定 百分比(这个参数可设置 )的数据块被Namenode检测确认是安详之后(加上一个稀奇 的30秒等待工夫),Namenode将退出安详模式状况 。接下来它会断定 尚有 哪些数据块的副本没有到达 指定命 目,并将这些数据块复制到其他Datanode上。
文件体系 元数据的恒久化
Namenode上生涯 着HDFS的名字空间。对付 任何对文件体系 元数据发生 批改的操纵 ,Namenode都市 应用 一种称为EditLog的事宜日记 记实 下来。譬喻,在HDFS中创建 一个文件,Namenode就会在Editlog中插入一条记实 来表示;同样地,批改文件的副本系数也将往Editlog插入一条记实 。Namenode在内地 操纵 体系 的文件体系 中存储这个Editlog。所有文件体系 的名字空间,包孕数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode地点 的内地 文件体系 上。
Namenode在内存中生涯 着所有文件体系 的名字空间和文件数据块映射(Blockmap)的映像。这个关键的元数据结构计划 得很紧凑,因而一个有4G内存的Namenode充足 支持 大宗的文件和目次 。当Namenode启动时,它从硬盘中读取Editlog和FsImage,将全部 Editlog中的事宜作用在内存中的FsImage上,并将这个新版本的FsImage从内存中生涯 到内地 磁盘上,然后删除旧的Editlog,由于 这个旧的Editlog的事宜都已经作用在FsImage上了。这个过程称为一个反省 点(checkpoint)。在当前实现中,反省 点只发生在Namenode启动时,在不久的将来 将实现支持 周期性的反省 点。
Datanode将HDFS数据以文件的形式存储在内地 的文件体系 中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在内地 文件体系 的一个单独的文件中。Datanode并不在同一个目次 创建 全部 的文件,实际 上,它用摸索 的行动 来断定 每个目次 的最佳文件数量 ,并且 在恰当 的时间 创建 子目次 。在同一个目次 中创建 全部 的内地 文件并不是最优的选择,这是由于 内地 文件体系 也许无法高效地在单个目次 中支持 大宗的文件。当一个Datanode启动时,它会扫描内地 文件体系 ,发生 一个这些内地 文件对应的全部 HDFS数据块的列表,然后作为陈诉 发送到Namenode,这个陈诉 就是块状况 陈诉 。
通讯 协议
全部 的HDFS通讯 协议 都是成立 在TCP/IP协议 之上。客户端通过一个可设置 的
硬朗 性
HDFS的重要 方针 就是纵然 在堕落 的情况下也要担保数据存储的可靠性。常见的三种堕落 情况是:Namenode堕落 , Datanode堕落 和网络盘据(network partitions)。
磁盘数据过错 ,心跳检测和重新复制
每个Datanode节点周期性地向Namenode发送心跳信号。网络盘据也许导致一部分 Datanode跟Namenode失去联系。Namenode通过心跳信号的缺失来检测这一情况,并将这些近期不再发送心跳信号Datanode符号 为宕机,不会再将新的
集群均衡
HDFS的架构支持 数据均衡 计策。假如 某个Datanode节点上的空闲空间低于特定的临界点,服从 均衡 计策体系 就会主动 地将数据从这个Datanode移动到其他空闲的Datanode。当对某个文件的哀求忽然 增进,那么也也许启动一个阴谋创建 该文件新的副本,并且 同时重新均衡 集群中的其他数据。这些均衡 计策如今还没有实现。
数据完备 性
从某个Datanode获取的数据块有也许是粉碎 的,粉碎 也许是由Datanode的存储装备 过错 、网络过错 可能软件bug造成的。HDFS客户端软件实现了对HDFS文件内容的校验和(checksum)反省 。当客户端创建 一个新的HDFS文件,会打定这个文件每个数据块的校验和,并将校验和作为一个单独的躲藏 文件生涯 在同一个HDFS名字空间下。当客户端获取文件内容后,它会查验 从Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,假如 不匹配,客户端可以选择从其他Datanode获取该数据块的副本。
元数据磁盘过错
FsImage和Editlog是HDFS的核心 数据结构。假如 这些文件粉碎 了,所有HDFS实例都将失效。因而,Namenode可以设置 成支持 掩护多个FsImage和Editlog的副本。任何对FsImage可能Editlog的批改,都将同步到它们的副本上。这种多副本的同步操纵 也许会低落 Namenode每秒处理 赏罚 的名字空间事宜数量 。然而这个代价是可以经受 的,由于 纵然 HDFS的操纵是数据麋集 的,它们也非元数据麋集 的。当Namenode重启的时间 ,它会选取近来 的完备 的FsImage和Editlog来应用 。
Namenode是HDFS集群中的单点妨碍 (single point of failure)地点 。假如 Namenode呆板 妨碍 ,是必要 手工过问干与 的。如今,主动 重启或在另一台呆板 上做Namenode妨碍 转移的功能还没实现。
快照
快照支持 某一特定时候 的数据的复制备份。操作快照,可以让HDFS在数据粉碎 时规复 到已往 一个已知精确 的工夫点。HDFS如今还不支持 快照功能,但阴谋在将来 的版本举办支持 。
数据构造
数据块
HDFS被计划 成支持 大文件,适用HDFS的是那些必要 处理 赏罚 大局限 的数据集的操纵。这些操纵都是只写入数据一次,但却读取一次或多次,并且 读取速率 应能满意 流式读取的必要 。HDFS支持 文件的“一次写入多次读取”语义。一个典范 的数据块巨细 是64MB。因而,HDFS中的文件总是服从 64M被切分成差别 的块,每个块尽也许地存储于差别 的Datanode中。
Staging
客户端创建 文件的哀求着实 并没有立即 发送给Namenode,究竟 上,在刚起头阶段HDFS客户端会先将文件数据缓存到内地 的一个临时 文件。操纵措施的写操纵 被透明地重定向到这个临时 文件。当这个临时 文件累积的数据量高出 一个数据块的巨细 ,客户端才会联系Namenode。Namenode将文件名插入文件体系 的条理 结构中,并且 分派 一个数据块给它。然后返回Datanode的标识符和方针 数据块给客户端。接着客户端将这块数据从内地 临时 文件上传到指定的Datanode上。当文件封闭 时,在临时 文件中剩余的没有上传的数据也会传输到指定的Datanode上。然后客户端见告 Namenode文件已经封闭 。此时Namenode才将文件创建 操纵 提交到日记 里举办存储。假如 Namenode在文件封闭 前宕机了,则该文件将损失。
上述行动 是对在HDFS上运行的方针 操纵举办认真思量 后得到的结果。这些操纵必要 举办文件的流式写入。假如 不采用 客户端缓存,由于网络速率 和网络堵塞会对吞预计 造成比拟 大的影响。这种行动 并不是没有先例的,早期的文件体系 ,比如
流水线复制
当客户端向HDFS文件写入数据的时间 ,一起头是写到内地 临时 文件中。假设该文件的副本系数设置为3,当内地 临时 文件累积到一个数据块的巨细 时,客户端会从Namenode获取一个Datanode列表用于寄放 副本。然后客户端起头向第一个Datanode传输数据,第一个Datanode一小部分 一小部分 (4 KB)地经受 数据,将每一部分 写入内地 客栈,并同时传输该部分 到列表中第二个Datanode节点。第二个Datanode也是如许 ,一小部分 一小部分 地经受 数据,写入内地 客栈,并同时传给第三个Datanode。末了 ,第三个Datanode经受 数据并存储在内地 。因此,Datanode能流水线式地从前一个节点经受 数据,并在同时转发给下一个节点,数据以流水线的行动 从前一个Datanode复制到下一个。
可拜访性
HDFS给操纵供给 了多种拜访行动 。用户可以通过接口拜访,也可以通过C语言的封装API拜访,还可以通过涉猎 器的行动 拜访HDFS中的文件。通过
DFSShell
HDFS以文件和目次 的形式构造 用户数据。它供给 了一个下令 行的接口(DFSShell)让用户与HDFS中的数据举办交互。下令 的语法和用户熟识 的其他shell(譬喻 bash, csh)器材类似。下面是一些举措 /下令 的示例:
DFSShell 可以用在那些通过脚本语言和文件体系 举办交互的操纵措施上。
DFSAdmin
DFSAdmin 下令 用来管理 HDFS集群。这些下令 只有HDSF的管理 员手法应用 。下面是一些举措 /下令 的示例:
涉猎 器接口
一个典范 的HDFS安装会在一个可设置 的TCP端口开启一个Web做事器用于裸露 HDFS的名字空间。用户可以用涉猎 器来涉猎 HDFS的名字空间和查察 文件的内容。
存储空间采取
文件的删除和规复
当用户或操纵措施删除某个文件时,这个文件并没有立即 从HDFS中删除。实际 上,HDFS会将这个文件重定名 转移到/trash目次 。只要文件还在/trash目次 中,该文件就可以被敏捷 地规复 。文件在/trash中生涯 的工夫是可设置 的,当高出 这个工夫时,Namenode就会将该文件从名字空间中删除。删除文件会使得该文件干系 的数据块被开释 。留意 ,从用户删除文件到HDFS空闲空间的增进之间会有肯定 工夫的耽误 。
只要被删除的文件还在/trash目次 中,用户就可以规复 这个文件。假如 用户想规复 被删除的文件,他/她可以涉猎 /trash目次 找回该文件。/trash目次 仅仅生涯 被删除文件的末了 副本。/trash目次 与其他的目次 没有什么不同,除了一点:在该目次 上HDFS会操纵一个出格计策来主动 删除文件。如今的默认计策是删除/trash中生涯工夫高出 6小时的文件。将来 ,这个计策可以通过一个被优良界说 的接口设置 。
镌汰 副本系数
当一个文件的副本系数被减小后,Namenode会选择过剩 的副本删除。下次心跳检测时会将该信息转达 给Datanode。Datanode遂即移除相应的数据块,集群中的空闲空间加大。同样,在调用setReplication API收场 和集群中空闲空间增进间会有肯定 的耽误 。