【HDFS】分布式存储之HDFS的介绍

目录

海量数据怎么存储?

分布式存储服务器的信息怎么管理?

分布式存储一个完整的数据集怎么表达?

从节点间通信如何完成?

HDFS分布式存储的流程?

主节点的元数据是怎么存储的?

删除分布式文件删除的流程?

如何保证主节点的元数据不会丢失?

如何解决editslog过大,数据难以恢复的问题?

如何查看fsimage?

为什么有fsimage还要有editslog?

 

问题引出:

海量数据怎么存储?

解决方法:数据集分块,每一块存储在不同的服务器上。

为了保证数据的可靠性,文件分成多个数据块后,需要对数据块做冗余操作,数据块的冗余会带来需要的磁盘空间变大,这二者不可兼得。在生产上一般设置3个备份,2份存储在相同机柜的两台不同服务器上,另一份存在不同机柜的一台服务器内。

分布式存储服务器的信息怎么管理?

比如总共有多少台服务器,每台服务器ip地址,每台服务器的磁盘容量,每台服务器健康情况怎么记录和管理?

答:在主节点上记录所有从节点的状态

分布式存储一个完整的数据集怎么表达?

答:通过元数据和真正的数据构成。

e5e211b478d04ee393f3db7e1cf5f2c1.png

通过元数据来访问磁盘上的数据,根据此原理,分布式存储将数据集分为元数据和磁盘上的数据,每一个数据块的元数据存储在主节点上,所有的真正的数据存储在从节点上。

因此得到架构为一主多从,主节点存储各个数据块的元数据,从节点存储真正的数据。

从节点间通信如何完成?

不同从节点之间的通信,通过RPC完成,RPC,其实也就是一种socket通信

HDFS分布式存储的流程?

客户端比如说要存储1TB的数据,向主节点发起请求,我要存储1TB数据,文件名是/test.txt,主节点先检查客户端有无权限,在检查有无此文件,如有权限,无此文件的话,接受请求,将此文件分为 n个,每个 x MB,并将元数据存储下来,将文件分块信息给客户端,客户端接收到分块信息,按照要求将文件分成不同的块存储在各个从节点上。

每块的真实数据存储在各从节点上,从节点向主节点上报元数据信息并且备份数据块,主节点记录了每个数据块的元数据情况,当客户端想要读取此文件时,主节点接受请求,分别从不同的从节点读取数据,给到客户端。

主节点的元数据是怎么存储的?

元数据本身数据量不大, 并且访问很频繁,会实时更新,因此元数据存储在主节点内存中,那么当主节点宕机,元数据丢失问题很严重,因此将元数据再在磁盘中冗余存储。那二者如何保证内存和磁盘的数据一致?引入一个辅助结点secondaryNameNode,帮助主节点完成内存元数据和磁盘元数据的同步工作。

因此我们得到HDFS集群:

8efabf0f533c4b1a9e4ee1b8e020ff3c.png

 

删除分布式文件删除的流程?

客户端发出请求,主节点NameNode接受请求,查看有无权限,是否存在,均为是,然后删除文件目录树,即元数据信息删除,当数据块所在的从节点DataNode向主节点向主节点发送心跳包,这时候主节点会向从节点发送指令,让其删除数据块。

如何保证主节点的元数据不会丢失?

editslog文件

EditsLog 将元数据的每次修改(创建、删除)都会记录在磁盘文件中

因此可以从editslog日志来恢复数据

如何解决editslog过大,数据难以恢复的问题?

合并editslog为fsimage,合并条件:

1. EditsLog 的条数(record数量)大于等于 1000000,

dfs.namenode.checkpoint.txns 来配置

2. 距离上次合并的时间超过了 3600 秒(1小时),

dfs.namenode.checkpoint.period 来配置

如何查看fsimage?

more fsimage 会出现乱码

查看的正确方法是:

hdfs oiv -p XML -i fsimage_XXXXXXXXXX -o ~/path/to/save.xml

more save.xml

为什么有fsimage还要有editslog?

FSImage 是某一时刻的内存元数据(其实就是文件目录树)的真实组织情况;

EditsLog 则是记录了该时刻后所有元数据的改动;

1. 从 NameNode 内存元数据中直接生成 FsImage 需要时间的

2. 不能时时生成 FsImage

FSImage + EditsLog 机制:

可以保证NameNode中的内存元数据不会丢掉

可以保证很快的从磁盘中恢复出来

 

 

 


版权声明:本文为qq_39965059原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。