Hadoop分布式文件系统(HDFS)是一个专为大规模数据处理和存储而设计的分布式架构,它的核心理念在于高容错性和低成本,适用于离线计算任务,如海量Web日志和机器学习数据的处理。HDFS巧妙地将架构分解为客户端(DFSClient)、Namenode(主从备份)和Datanode(三副本复制)三个关键组件,以实现数据的高效管理和扩展。
Namenode,作为数据元空间的管理者,负责命名空间的组织以及元数据的存储。它与DataNode协作,通过分离元数据和数据,实现系统的无限扩展。DFSClient作为客户端接口,提供强大的读写功能,如网络读取、短路读取(利用Domain Socket在本地机上实现高效传输)和零拷贝读取,确保了数据的快速访问。
DataNode负责实际的数据存储,每个文件被分割成多个数据块,每个块在三个不同的Datanode上进行三副本复制,以提高数据的可靠性和容错性。写入数据时,首先通过Namenode获取文件状态,计算写入的packet大小,可能需要重传。写入过程涉及Packet缓存和DataStreamer,以及在Append模式下的新数据块分配和管理。
对于block复制,Namenode会监控replications状态,从非写集合的节点选取源,目标遵循机架和Datanode的策略。当检测到数据损坏时,会通过比较Datanode和Namenode的信息进行校验,确保数据一致性。Datanode管理triplet映射,Decommission机制确保副本达到标准,同时区分新旧副本,Namenode则通过主恢复节点同步数据至目标状态,实现租约管理。
Federation引入了多Namenode支持,BlockPoolManager负责管理这些BlockPool,DataBlockScanner和DirectoryScanner确保元数据和数据的正确性。数据存储由DataStorage、BlockPoolSliceStorage和FsDataset等模块分别管理,它们协作处理数据块操作和存储目录的维护。
在升级Datanode Storage时,HDFS采用备份和硬链接技术,数据组织在current目录下,不同BlockPool的数据分布在不同目录。StorageDirectory负责所有操作,包括目录扫描、状态恢复和状态转换。DataStorage负责文件结构管理,确保升级过程中的数据一致性。
读写操作中,FsDatasetImpl是数据块状态管理的核心,通过维护数据块的状态(如RBW、FINALIZED),并处理写入时的copy-on-write。DataTransferProtocol提供流式接口,通过BlockSender发送数据并计算校验和,DataXceiverServer则接收和转发数据,实现高效的数据交换。通过生产者-消费者模型,HDFS的错误处理机制确保了数据的可靠传输。
尽管HDFS在某些方面可能显得有些过时,但其背后的工程实践和设计原则,如Datanode的级联写入和错误处理机制,对于理解大规模分布式系统具有不可忽视的价值。深入研究这些细节,无疑能提升我们对分布式计算系统的理解与应用能力。