在上一篇已经知道了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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。