在上一篇曾经晓得了 HDFS 是把文件切成块后,再存储在多个服务器中,并且为了数据的安全性,都做了多个正本进行冗余存储。那在 HDFS 中,是谁对文件进行切块?是谁决定了块存储在哪里?是谁治理存储的文件?
在 HDFS 中,有这几种角色:
- NameNode:负责解决 Client 的申请、元数据管理等其余性能。
- DataNode:次要就是存储文件块的。
- Client:客户端,与 NameNode、DataNode 交互。
- SecondaryNamenode:分担 NameNode 的压力,次要是元数据的合并。
Client
上传文件的时候,Client 会把一个大文件切成一个个块,在新近的版本中,每个块是 64M 的,前面的版本是 128M 每个块,这个能够依据零碎的应用进行调整。
切成块后,再询问 NameNode 他每个块要寄存哪里,等拿到 NameNode 的回复后,就开始把块的数据上传到 DataNode 中。
如果是读文件的话,就会询问 NameNode 每个块在哪里,而后依据 NameNode 的回复,从相应的 DataNode 读取文件,最初把块拼接合并成文件。
除了读写文件外,Client 也会通过其余的命令来和 NameNode 以及 DataNode 交互。
NameNode
NameNode 有一个 50070 端口的 HttpServer,提供各种性能,比方咱们用 50070 拜访网页的时候,就是这个服务提供的性能。这个 HttpServer 服务还有一个提供了 imagetransfer
性能,用于元数据合并。
除了 Http 服务,NameNode 也提供了两个 RPCServer,一个是 ClientRpcServer 一个是 ServiceRpcServer。
ClientRpcServer 是用来响应 Client 的读写申请以及其余申请。
ServiceRpcServer 是用来响应 DataNode 的申请,比方注册、心跳。
NameNode 负责解决 Client 的申请,因为他晓得块的每个正本要怎么存储,每个正本曾经存储在哪里,那他怎么晓得的呢?
比方上图的文件,被分成 4 块,读取的时候,咱们怎么晓得把哪些块读取进去合并成,还原到原来的文件?咱们又怎么晓得要读取的块寄存在哪个 DataNode?
这些信息都是元数据来记录的,NameNode 会在硬盘和内存中存储一个叫元数据的货色,一个文件被分成多个块,那这个文件和每个块的对应关系是记录在元数据里的。每个块又存储在多个 DataNode,这些信息也是记录在元数据里的。
DataNode
DataNode 是实际上读写文件的中央,他存储着所有的文件,每个 DataNode 都不能保障不出故障,所以咱们文件是以多正本的模式存储在 DataNode 中。
和 NameNode 一样,DataNode 也提供了 HttpServer 和 RPCServer。
HttpServer 用于解决 NameNode 和其余 DataNode 的申请。
RPCServer 用于解决 Client 和其余 DataNode 的申请。
当 Client 要上传文件的时候,NameNode 须要告知 Client 上传到哪个 DataNode,这些 DataNode 必须是失常的,为了让 NameNode 晓得本人是失常的,NameNode 会定期的发送心跳信息给 NameNode。