HDFS的基本结构
HDFS基本结构分NameNode、SecondaryNameNode、DataNode这几个。
NameNode
是Master节点,主节点,有点类似Linux里的根目录。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;对外接收请求,记录元数据,管理DataNode。 元数据在磁盘上的存储位置由属性hadoop.tmp.dir来决定,是放在core-site.xml文件中。如果不指定,默认情况下是放在/tmp下。
HDFS会对上传的文件进行切分处理,切出来的每一个数据块称为Block。
防止数据丢失,HDFS会对上传的文件进行自动的备份。每一个备份称之为是一个副本(replication/replicas)。如果不指定,默认情况下,副本数量为3(备份到其他节点上,加上原有的总共3份)
HDFS参考Linux设计了一套文件系统,允许将文件存储到不同的路径下,同时也设计了一套和Linux一样的权限策略。HDFS的根路径是/。
在HDFS中,将元数据拆分成了很多项,主要包含了以下几项:上传的文件名以及存储的虚拟路径,例如/log/a.log。文件对应的上传用户以及用户组。文件的权限,例如-rwxr-xr--。文件大小。
SecondaryNameNode
保存着NameNode的部分信息(不是全部信息NameNode宕掉之后恢复数据用),是NameNode的冷备份;合并fsimage和edits然后再发给namenode。(防止edits过大的一种解决方案)
DataNode(从节点)
负责存储client发来的数据块block;执行数据块的读写操作。是NameNode的小弟。DataNode是HDFS的从节点,主要用于存储数据,数据会以Block形式落地到磁盘上。数据在磁盘上的存储位置同样由hadoop.tmp.dir属性来决定。DataNode通过心跳机制向NameNode来注册信息。
举例
假设我们有一个包含100个数据块的文件,每个数据块的大小为80MB。当客户端需要读取或写入该文件时,NameNode和DataNode将扮演不同的角色。
当客户端需要读取文件时,它首先会向NameNode发送一个读取请求。NameNode会返回包含数据块位置信息的元数据给客户端。客户端根据元数据信息,直接与存储有所需数据块的DataNode进行通信,获取数据块并进行读取操作。
当客户端需要写入文件时,它首先会向NameNode发送一个写入请求。NameNode会返回一个包含可用的DataNode列表的元数据给客户端。客户端根据元数据信息,选择一个DataNode作为目标节点,并将数据块写入该节点。同时,客户端还会将数据块的副本分发给其他DataNode,以实现数据的冗余存储。