在上一篇曾经晓得了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。