设为首页 加入收藏

TOP

HDFS架构简介
2019-04-23 00:05:28 】 浏览:43
Tags:HDFS 架构 简介

转自:http://asyty-cp.blog.163.com/blog/static/117542439201191322858356/

一、HDFS框架简述

HDFS架构简介 - 爱上一条鱼 - 轨迹

1HDFS框架图

HDFS设计目标

1.容错性

2.流式数据访问

3.大规模数据集

4.简单的一致性模型

5.移动计算到数据附近

6.可移植性

二、HDFS分解简述

NameNode / DataNode

HDFS采用Master/Slave架构,HDFS集群是由一个NameNode和多个DataNodes组成。NameNode是中心服务器,负责管理文件系统的名字空间(namespace)以及客户端的访问。DataNode负责管理它所在节点上的存储。用户能够通过HDFS文件系统的名字空间以文件的形式在上面存储数据。

对于内部存储,一个文件被切分为一个或多个块,存储在一组DataNode上。NameNode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体DataNode节点的映射。

数据存储副本容错

HDFS文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。HDFS中的文件都是一次性写入的,并且在任何时候只能有一个写入者。

NameNode全权管理数据块的复制,它周期性地从集群中的每个DataNode接收心跳信号和块状态报告(Block Report)。块状态报告包含了一个该DataNode上所有数据块的列表。

HDFS架构简介 - 爱上一条鱼 - 轨迹

2数据块副本存储

副本放置策略

副本的放置策略是区分文件系统的重要特性之一,也是HDFS性能和可靠性的关键,HDFS采用了机架感知(rack-aware)的策略来存储副本。

在大多数情况下,副本系数是3HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。整个机架的错误远远比单个节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。于此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀分布在不同的机架上。三分之一的副本在一个节点上,三分之二的副本在一个机架上,如果大于3个副本,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。

机架感知

一个大型集群大多会被分为多个机架(Rack),一个机架包含多个节点,一般来说,机架内部机器的通信速度要高于机架之间的通信速度,而且往往机架之间的通信受到上层交换机等的带宽限制。

HDFS中,对机架的感知并非是自适应的,即机架的配置是由配置文件决定,并且是人工指定的,这些rackid信息可以通过topology.script.file.name配置,通过IP到机架id的映射指定哪些节点属于哪个机架,在NameNode启动时将配置信息读取到内存中,保存在一个map中。

通过机架感知,NameNode就可以画出DataNode以及交换机等节点的网络拓扑图,通过拓扑图就可以计算出任意两个DataNode之间的距离,得到最优的存放策略,优化整个集群的网络带宽均衡以及数据最优分配。

安全模式

安全模式是指NameNode的一种特殊状态。处于安全模式的NameNode是不进行数据块的复制的。NameNode从所有的DataNode接收心跳信号和块状态报告。当Namenode检测确认某个数据块的副本数目达到该数据块的最小副本数,那么该数据块会被认为是副本安全(safely replicated)的。

Namenode退出安全模式状态后,它会确定哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他DataNode上。

元数据持久化

HDFS通过dfs.name.dir这个参数设置HDFS的元数据信息存放在NameNode本地操作系统的目录,目录里通常包括以下文件:editsFsImageFsTimeVERSION

EditLog

Namenodeedits文件来保存对元数据进行的每次操作,比如创建文件,删除文件,修改文件的副本系数。类似于mysql中的binlog机制。

SecondNameNode

SecondNamenode其实只是一个简单的元数据备份进程,它会定期(缺省是1小时)把edits文件的内容合并到fsimage文件,同时保存最新的元数据副本在SecondNamenode进程所在机器的文件系统里。

FileImage

整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在FsImage的文件中,FsImage结合edits才能准确表示内存中的元数据信息。

NameNode启动时,它从硬盘中读取EditlogFsImage,将所有Editlog中的事务作用合并到内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint),在当前实现中,检查点只发生在NameNode启动时,在不久的将来将实现支持周期性的检查点,此时这个时候系统处于安全模式,NameNode等待DataNode上报各自的block数据块信息。

FormatHDFS系统

hadoopnamenode-format命令用来初始化HDFS系统,事实就是初始化dfs.name.dir目录中的四个文件editsFsImageFsTimeVERSION

故障容错

DataNode数据复制

每个DataNode周期性地向NameNode发送心跳。网络割裂可能导致部分DataNodeNameNode失去联系。NameNode将近期不发送心跳信号DataNode标记为宕机,不会再将新的IO请求发给它们。NameNode通过复制操作将新的副本复制到有效的DataNode

在下列情况下,可能需要重新复制:某个DataNode节点失效,某个副本遭到损坏,DataNode上的硬盘错误,或者文件的副本系数增大。

集群均衡

HDFS的架构支持数据均衡策略。如果某个DataNode节点上的空闲空间低于特定的临界点,系统就会自动地将数据从该DataNode移动到其他DataNode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。这些均衡策略目前还没有实现。

数据完整性

HDFS客户端实现了对HDFS文件内容的校验和(checksum)检查。当客户端创建一个新的HDFS文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会校验文件的完整性,如果数据错误,客户端可以选择从其他DataNode获取该数据块的副本。

元数据错误

FsImageEditlogHDFS的核心数据结构,如果损坏了,整个HDFS都将失效。因而,NameNode可以配置成支持维护多个FsImageEditlog的副本。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。这种多副本的同步操作可能会降低NameNode每秒处理的名字空间事务数量。然而这个代价是可以接受的,因为即使HDFS的应用是数据密集的,它们也非元数据密集的。当NameNode重启的时候,它会选取最近的完整的FsImageEditlog来使用。

NameNodeHDFS集群中的单点故障(single point of failure)所在。如果NameNode机器故障,是需要手工干预的。目前,自动重启或在另一台机器上做NameNode故障转移的功能还没实现。

快照

快照支持某一特定时刻的数据的复制备份。利用快照,可以让HDFS在数据损坏时恢复到过去一个已知正确的时间点。HDFS目前还不支持快照功能,但计划在将来的版本进行支持。

数据模型

数据分段

创建文件时以及写数据时,客户端的请求其实并没有立即发送给NameNode,事实上,HDFS客户端会先将文件数据缓存到本地的一个临时文件。写操作被透明地重定向到这个临时文,当临时文件的数据量超过一个数据块的大小,客户端才会联系NameNodeNameNode将文件名插入文件系统的层次结构中,并且分配一个数据块给它。然后返回DataNode的标识符和目标数据块给客户端。客户端再将数据从本地临时文件上传到指定的DataNode上。

当文件关闭时,在临时文件中没有上传的数据也会传输到指定的DataNode上,客户端会告诉NameNode文件已经关闭。此时NameNode才将文件创建操作提交到日志里进行存储。如果NameNode在文件关闭前宕机了,则该文件将丢失。

上述方法是对在HDFS上运行的目标应用进行认真考虑后得到的结果。这些应用需要进行文件的流式写入。如果不采用客户端缓存,由于网络速度和网络堵塞会对吞估量造成比较大的影响。

流水线复制

客户端向HDFS文件写入数据时,首先写入本地临时文件,假设该文件的副本系数为3,当本地临时文件累积到一个数据块的大小时,客户端会从NameNode获取一个DataNode列表用于存放副本,然后客户端向第一个DataNode传输数据,第一个DataNode一小部分一小部分(4 KB)地接收数据并写入本地仓库,并同时传输该部分到列表中第二个DataNode节点。第二个DataNode接收数据,并同时传给第三个DataNode。因此,DataNode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个DataNode复制到下一个

简单一致性模型

HDFS主要应用于大规模的数据处理,一个数据集通常由数据源生成或复制,在此基础上进行各种分析。每个分析至少都会涉及数据集中的大部分数据(甚至全部),因此读取整个数据集的时间比读取第一条记录的延迟更为重要。

因此HDFS对文件操作需要的是一次写入,多次读取的。一个文件一旦创建、写入、关闭之后就不需要修改了。这个假定简化了数据一致的问题和高吞吐量的数据访问。文件的修改、写操作只能append(),在文件的末尾增加,它不支持在文件的任意位置修改。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇sqoop   把 hdfs 和关系型数.. 下一篇问题记录:Linux系统中HDFS文件夹..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目