一、HDFS基本概念
HDFS是一个高度容错性的系统,设计用来部署在低成本硬件上,提供高吞吐量的数据访问。它放宽了POSIX的一些要求,以实现对文件系统数据的流式访问。HDFS将文件以块(Block)的形式存储,每个块默认大小为128MB(在Hadoop 2.x版本中),但可以通过配置参数调整。
二、HDFS架构
HDFS架构主要包括以下几个部分:
-
NameNode(名称节点):
- 管理HDFS的命名空间(Namespace),包括文件和目录的元数据。
- 维护文件系统的树状结构,以及文件与数据块之间的映射关系。
- 持久化存储元数据,包括FsImage(元数据镜像文件)和EditLog(操作日志文件)。
-
DataNode(数据节点):
- 存储文件的实际数据块。
- 执行数据块的读写操作。
- 定期向NameNode发送心跳信息,并报告自己存储的数据块列表。
-
SecondaryNameNode(次级名称节点):
- 定期合并Fsimage和Edits,并将合并后的结果推送给NameNode。
- 在紧急情况下,可辅助恢复NameNode,但不能替代NameNode工作。
三、HDFS工作原理
1. 数据写入流程
- 客户端通过RPC(远程过程调用)向NameNode发起写入请求。
- NameNode检查文件是否存在、客户端是否有权限写入等,并返回数据块的位置信息给客户端。
- 客户端根据返回的位置信息,将数据块写入到相应的DataNode中。
- 每个数据块会被复制到多个DataNode上(默认3个副本),以确保数据的可靠性。
2. 数据读取流程
- 客户端通过RPC向NameNode请求读取文件。
- NameNode返回文件的元数据信息,包括数据块的位置信息。
- 客户端根据返回的位置信息,从最近的DataNode读取数据块。
- 客户端将所有读取的数据块合并成完整的文件。
四、数据复制与容错处理
HDFS通过数据复制来提高数据的可靠性和可用性。每个数据块都会被复制到多个DataNode上(默认3个副本)。当某个DataNode出现故障时,HDFS会自动从其他DataNode上的副本中读取数据,以确保数据的可用性。此外,HDFS还提供了多种容错机制,如数据块的自动恢复、NameNode的容错等。
五、HDFS访问方式
HDFS提供了多种访问方式,包括:
- Java API:通过Hadoop提供的Java API,可以编写程序来访问HDFS。
- HTTP方式:通过WebHDFS或HttpFS,可以通过HTTP协议来访问HDFS。
- Shell命令:Hadoop提供了一套Shell命令,可以在命令行中直接操作HDFS。