一::总体结构概述
1:HDFS采用Master/Slave架构对文件系统进行管理.
各个组成部分如下及其功能如下:
NameNode:
负责存储元数据和管理目录树.这些信息是以fsimage(HDFS元数据镜像文件)和editlog两个文件形式存放在本地磁盘.当HDFS重
启时根据这两个重新构造
NameNode,NameNode还负责监控dataNode的健康状况.
DataNode:
负责储存真实的数据
,以及块数据校验和
Secondary NameNode:对元数据进行热备份(不是最重要的任务),其最重要的任务是
周期性合并编辑日志中的命名空间镜像,以避免编辑日志
过大;可辅助恢复NameNode;分
担NameNode工作
Client:文件切分;与NameNode交互;获取文件位置信息;与DataNode交互,读取或者写入数据;管理和访问HDFS
2:支架的概念
(1)副本存放是HDFS可靠性和性能的关键.优化的副本存放策略正是HDFS某一重要特性之一.
(2)支架的作用:
①
改进数据的可靠性,可用性,和网络带宽的利用率;
②
副本存放在不同的机架上,有效防止整个机架失效时数据丢失,并且允许读数据充分利用多个机架的带宽
③
分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式
集
群。机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。
(3
)hadoop集群中副本存放准则
具体到Hadoop集群,由于hadoop的HDFS对数据文件的分布式存放是按照分块block(64M)存储,每个block会有多个副本(默认为3),并且为了数据的安全和高效,所以
hadoop
默认对3个副本的存放策略为:
第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的)。
第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。
第三个副本似乎放置在与第一个副本所在节点同一机架的另一个节点上
如果还有更多的副本就随机放在集群的node里。
这样的策略可以保证对该block
所属文件的访
问能够优先在本rack下找到,如果整个rack发生了异常,也可以在另外的rack上找到该block的副本。这样足够的高效,并
且同
时做到了数据的容错。
但是,hadoop对机架的感知并非是自适应的,亦即,hadoop集群分辨某台slave机器是属于哪个rack并非是只能的感知的,而是需要hadoop的管理者人为的告知hadoop
哪台机器属于哪个rack,这样在hadoop的namenode启动初始化时,会将这些机器与rack的对应信息保存在内存中,用来作为对接下来所有的HDFS的写块操作分配
datanode列表时(比如3个block对应三台datanode)的选择datanode策略,做到hadoop allocate block的策略:尽量将三个副本分布到不同的rack。
3:安全模式
NameNode启动后会进入一个称为安全模式的特殊状态.处于安全模式的NameNode不会进行数据库的复制,NameNode接受所有DataNode心跳信号与块状态报告.块状态报告包含某个DataNode所有的数据块列表.每个数据块都有最少的副本数,当NameNode确认数据块达到这个最少值就会退出安全模式.如果不达到数量,则会复制数据库到其他DataNode上.
二:HDFS文件读取过程
当客户端发出读取请求的时,会调用flieSystem的open方法.fileSystem是DistributedFileSystem的一个实例.之后
DistributedFileSystem通过RPC协议想NameNode请求获取块的位置,此时NameNode会返回相应的块所在的DataNode地址(根据离客户端的距离排好序).
接着
DistributedFileSystem会向客户端返回一个支持文件定位的输入对象FSDataInputStream,
FSDataInputStream连接到相应的块中,接着客户端调用read来读取相应的数据
三:HDFS文件的写入过程
通过使用
DistributedFileSystem在NameNode中创建文件,创建成功后返回一个FSDataOutputStream给客户端进行写入数据.
当客户端写入数据时候,
FSDataOutputStream将文件分割成包,放进队列,这个队列为数据队列,
数据队列会想Namenode请求分配DataNode,返回DataNode位置后,就进行包的写入,第一个DataNode储存好后,就向第二个DataNode发送,接着第二个DataNode向第三个DataNode发送,当发送完成后,第三个DataNode返回确认信息给第二个DataNode,第二个DataNode返回确认信息给第一个DataNode,第一个DataNode返回确认信息给
FSDataOutputStream,当全部写入完成就可以关闭
FSDataOutputStream.