![Hadoop+Spark大数据技术(微课版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/911/53255911/b_53255911.jpg)
2.2.3 DataNode
HDFS的DataNode用于存储并管理元数据,DataNode用于存储文件的数据块。为了防止数据丢失,一个数据块会在多个DataNode中进行冗余备份,每个数据块默认有3个副本,而一个DataNode最多只存储文件的一个数据块的一个备份。DataNode负责处理文件系统的用户具体的数据读写请求,同时也处理NameNode对数据块的创建、删除指令。DataNode上存储了数据块ID和数据块内容,以及它们的映射关系。
一个HDFS集群可能包含上千个DataNode,这些DataNode定时和NameNode进行通信,接受NameNode的指令。为了减轻NameNode的负担,NameNode上并不永久保存每个DataNode上数据块的信息,而是通过DataNode启动时的汇报来更新NameNode上的映射表。DataNode和NameNode建立连接后,就会不断地向NameNode进行信息反馈,反馈信息也包含NameNode对DataNode的一些命令的操作情况,如删除数据块或者把数据块复制到另一个DataNode。
注意:NameNode不会主动向DataNode发起请求。
DataNode也可作为服务器接受来自客户端的访问,处理数据块的读写请求。DataNode之间还会相互通信,执行数据块的复制任务。同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性。DataNode会通过心跳(heartbeat)机制定时向NameNode发送所存储的数据块信息。
所有文件的数据块都存储在DataNode中,但客户端并不知道某个数据块的具体位置信息,所以不能直接通过DataNode进行数据块的相关操作,所有这些位置信息都存储在NameNode中。因此,当客户端需要执行数据块的创建、复制和删除等操作时,需要首先访问NameNode以获取数据块的位置信息,然后访问指定的DataNode来执行相关操作,具体的文件操作最终由客户端进程而非DataNode来完成。