关于这个问题,HDFS(Hadoop Distributed File System)由以下几个组件组成:
1. NameNode(名称节点):负责管理文件系统的命名空间,包括文件和目录的创建、删除、重命名等操作,并维护文件的元数据。
2. DataNode(数据节点):负责存储实际的数据块,并响应客户端或NameNode的读写请求。
3. SecondaryNameNode(辅助名称节点):定期与NameNode进行通信,帮助它合并编辑日志(Edit Log)和内存镜像(FsImage),以减少NameNode的启动时间。
4. Client(客户端):与HDFS交互的应用程序,通过访问NameNode获取文件的元数据,然后通过DataNode读取或写入数据。
5. Block(数据块):HDFS将文件分成固定大小的数据块(默认为128MB),并将这些数据块存储在不同的DataNode上,实现数据的分布式存储和并行处理。
6. Rack(机架):HDFS将DataNode分组放置在不同的机架上,以提高数据冗余和容错性。
7. Replication(复制):HDFS通过将数据块复制到不同的DataNode上来实现数据的冗余备份,提高可靠性。
8. Checkpointing(检查点):辅助名称节点定期与名称节点进行通信,将名称节点的元数据持久化到本地磁盘上,以便在名称节点故障时快速恢复。
9. MapReduce(分布式计算):HDFS与MapReduce紧密结合,通过将数据存储在HDFS上,并利用HDFS的数据复制和容错机制,实现分布式计算的高性能和可靠性。
HDFS主要由三个组件构成,分别是NameNode、SecondaryNameNode和DataNode,其中NameNode和SecondaryNameNode运行在master节点上,DataNode运行在slave节点上。
1. NameNode
NameNode管理HDFS文件系统的命名空间,它维护文件系统树及树中的所有文件和目录。同时NameNode也负责这些文件和目录的打开、关闭、移动和重命名等操作。而实际文件数据的操作是由DataNode负责。
当Client端发起请求,该请求首先会到达NameNode,NameNode分析请求,然后告诉Client该去哪个DataNode上找什么位置的数据块。得到消息后的Client会直接和DataNode进行交互。
NameNode中元数据种类有:
(1)文件名目录及它们的层级关系;(2)文件目录的所有者及其权限;(3)每个文件块的名称及文件有哪些块组成。
需要注意的是,NameNode保存的元数据信息并不包含每个数据块的位置信息,只包含块的名称及文件由哪些块组成。块的位置信息会在NameNode每次重启时从DataNode获取,并且NameNode通过心跳机制和DataNode保持通信,实时监控文件系统是否在正常运行。
2. DataNode
DataNode运行在slave节点上,也称为工作节点。它负责存储数据块,也负责为Client端提供读写服务,同时还接收NameNode指令,进行创建、删除和复制等操作。DataNode还通过心跳机制定期向NameNode发送所存储文件块列表信息。并且DataNode还和其他DataNode节点通信,复制数据块已达到冗余的目的。
3. SecondaryNameNode
NameNode元数据信息存储在FsImage中,NameNode每次重启后会把FsImage读取到内存中,在运行过程中为了防止数据丢失,NameNode的操作会被不断的写入本地EditLog文件中。
当检查点被触发,FsImage会把EditLog文件中的操作应用一遍,然后把新版的FsImage写回磁盘中,删除EditLog文件中旧的事务信息。检查点有两种触发机制:(1)按秒为单位的时间间隔触发(dfs.namenode.checkpoint.period);(2)达到文件系统累加的事务值触发(dfs.namenode.checkpoint.txns)。
FsImage和EditLog文件的合并就用到了SecondaryNameNode组件,它的工作过程如下:
(1)合并之前通知NameNode把所有操作写入新的EditLog文件中,并将其命名为edits.new;
(2)SecondaryNameNode从NameNode处请求合并FsImage和EditLog;
(3)SecondaryNameNode把FsImage和EditLog合并为新的FsImage文件;
(4)NameNode从SecondaryNameNode获取合并好的新的FsImage并将旧的替换掉,并把EditLog用(1)中创建的edits.new替换。
(5)更新Fstime中的检查点。
总而言之:
(1)FsImage:保存的是上个检查点的HDFS的元数据信息;
(2)EditLog:保存的是从上个检查点开始发生的HDFS元数据信息状态改变信息;
(3)Fstime:保存了最后一个检查点的时间戳。