本文共 1767 字,大约阅读时间需要 5 分钟。
HDFS(Hadoop Distributed File System)是一种分布式文件管理系统,用于存储和处理大规模数据。它的架构包括NameNode和DataNode,分别负责文件块的位置管理和数据存储。以下是HDFS写入和读取数据的详细流程:
HDFS 写入数据流程
客户端请求上传文件:
- 客户端通过DistributedFileSystem接口向NameNode请求上传文件。
- NameNode检查目标文件是否已存在以及父目录是否存在,返回允许上传的状态。
选择目标DataNode:
- NameNode根据文件位置、网络拓扑结构等因素,选择最适合存储文件块的DataNode。
- HDFS使用“最接近”策略:优先选择本地机器上的DataNode,然后是同一网格的其他节点,最后是其他网格的节点。
数据传输:
- 客户端通过FSDataOutputStream模块向选定的DataNode上传数据。
- DataNode接收数据后,会将其传输到其他DataNode,形成通信链,确保数据块的完整传输。
提交块元数据:
- 客户端完成数据上传后,将块的元数据(如块ID、大小、校验和等)提交到NameNode。
- NameNode更新文件的目录树和块位置信息。
HDFS 读取数据流程
客户端请求下载文件:
- 客户端向NameNode请求下载特定文件的块位置。
- NameNode查找文件块所在的DataNode地址,并返回给客户端。
选择最近的DataNode:
- 客户端可以选择最近的DataNode或随机的DataNode读取数据,以提高读取速度。
- HDFS支持副本机制,优先读取最近的副本,减少网络延迟。
数据读取:
- DataNode从磁盘读取数据,并通过FSDataInputStream模块向客户端传输。
- 客户端以Packet为单位接收数据,写入目标文件中。
NameNode和SecondaryNameNode的工作机制
NameNode的角色:
- NameNode存储文件块的元数据,管理文件的目录树结构。
- 处理客户端的读写请求,定期与DataNode通信,收集块信息。
SecondaryNameNode的作用:
- SecondaryNameNode负责定期检查NameNode的编辑日志和镜像文件,合并最新的元数据。
- 在NameNode断电恢复时,SecondaryNameNode帮助快速恢复元数据,保证集群的连续性。
数据完整性和冗余机制
数据校验:
- DataNode在读取或写入数据时,计算校验和(如CRC、MD5、SHA-1)。
- 检查计算校验和与存储值是否一致,发现数据损坏时进行修复。
数据冗余:
- HDFS默认配置复制因子为3,确保每个文件块有三个副本,提高数据可用性。
- NameNode在选择DataNode时,会优先考虑节点的冗余情况,确保数据分布合理。
DataNode的工作机制
存储数据:
- DataNode将文件块以固定大小的文件形式存储在磁盘中,包括数据和元数据。
- 元数据记录块的大小、校验和、时间戳等信息。
周期性汇报:
- DataNode定期向NameNode汇报块信息,时间间隔由dfs.blockreport.intervalMsec配置,默认为21600000毫秒(30分钟)。
- DataNode还会扫描自身的数据目录,确保块信息的准确性。
心跳机制:
- DataNode每隔3秒发送一次心跳信号,NameNode记录节点信息。
- 若超过10分钟未收到心跳,NameNode认为节点不可用,触发数据重布局。
配置和优化
心跳和重校验:
- dfs.heartbeat.interval:心跳时间间隔,单位为秒,默认为3秒。
- dfs.namenode.heartbeat.recheck-interval:心跳重校验间隔,单位为毫秒,默认为300000毫秒(30秒)。
- dfs.datanode.directoryscan.interval:DataNode扫描数据目录的间隔,单位为秒,默认为21600秒(3小时)。
数据块大小:
- HDFS默认块大小为256MB,可根据存储设备容量和网络带宽调整,提升读写性能。
通过以上流程,HDFS能够高效地管理和存储大规模数据,支持高并发的读写操作,适用于处理海量数据任务。
转载地址:http://xqzr.baihongyu.com/