1、简述HDFS的体系结构
HDFS的全称是 Hadoop Distributed System
HDFS采用的是 master/slaves 这种主从的结构模型来管理数据。这种结构模型主要由四部分组成,分别是:Client(客户端)、Namenode(元数据节点)、Datanode(数据节点)和SecondaryNamenode。
- 元数据节点用来管理文件系统的命名空间
- 其将所有的文件和文件夹的元数据保存在一个文件系统树中。
- 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)和修改日志(editlog)。
- 其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在磁盘上,而是在系统启动的时候从数据节点收集而成的。
- 数据节点是文件系统中真正存储数据的地方
- 客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。
- 其周期性的向元数据节点回报其存储的数据块信息
- 从元数据节点(secondary namenode)
- 从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。
- 其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。
- 合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。
简单来说
元数据节点(Namenode)存放的为对数据的描述,即哪些数据存在哪一个数据节点上,及其他一些数据自身的特征。
数据节点(datanode)为具体存放数据的地方。
从数据节点(secondary namenode)可以理解为备用节点
真正的⼀个HDFS集群包括⼀个 Namenode
和若干数目的 Datanode
。
体系结构解析
Namenode是一个中心服务器,负责管理文件系统的命名空间(namespace),它在内存中维护着命名空间的最新状态,同时对持久性文件 (fsimage和deit) 进行备份,防止宕机后,数据丢失。namenode还负责管理客户端对文件的访问,比如权限验证等等。
集群中的Datanode一般是一个节点运行一个Datanode进程,真正负责管理客户端的读写请求,在namenode的统一调度下进行对数据块的创建、删除和赋值等操作。数据块实际上都是保存在Datanode本地的Linux文件系统中的。每个Datanode会定期的向namenode发送数据,报告自己的状态(称之为心跳机制),没有按时发送心跳信息的datanode会被namenode标机为”宕机“,不会给它在分配任何的I/O请求。
用户在使用Client进行I/O操作是,仍然可以像使用普通文件系统那样,使用文件名去存储和访问文件,只不过,在HDFS中,一个文件会被切分成若干个数据块,然后被分布存储在若干个Datanode上。
比如,用户在client上需要访问一个文件时,HDFS的实际工作流程是:
客户端先把文件名发送给Namenode,Namenode根据文件名找到对应的数据块信息及其每个数据块所在的Datanode位置,然后把这些信息发送给客户端。之后,客户端就直接与这些Datanode进行通信,来获取数据(这个过程,Namenode并不参与数据块的传输)。这种设计方式,实现了并发访问,大大提高了