HDFS-数据的读写流程

📅 2026/7/1 2:32:54
HDFS-数据的读写流程
HDFS概述HDFSHadoop Distributed File System是 Apache Hadoop 生态的核心分布式文件系统设计用于在商用硬件上存储海量数据TB 乃至 PB 级。它借鉴了 Google File SystemGFS的设计思想以一次写入、多次读取为访问模型优先保障高吞吐而非低延迟。核心架构组件HDFS 采用 Master / Slave 主从架构主要由以下角色构成NameNodeNNNameNodeNN集群主节点。管理文件系统命名空间目录树、文件名到块映射以及数据块的副本策略。是整个集群的 大脑。主要功能是进行元数据的管理、接收客户端额请求以及和datanode进行通信。DataNodeDNDataNodeDN从节点集群中每台工作机器运行一个 DN。负责存储实际数据块、响应客户端的读写请求并定期向 NN 汇报自身状态。Secondary NameNode2NNSecondary NameNode2NN辅助 NN 合并编辑日志edits 到 fsimage将元数据文件进行合并并非 NN 的热备。关键概念数据块Block数据块BlockHDFS 默认块大小为 128 MB可配置远大于普通文件系统的 4 KB。超大块设计旨在减少寻址开销、降低 NN 元数据压力。副本Replication副本Replication每个块默认 3 个副本分布在不同机架Rack的节点上以平衡容错与带宽。机架感知Rack Awareness机架感知Rack AwarenessNN 通过机架 ID 分布副本同机架节点间带宽大、延迟低跨机架提供容错。HDFS 数据读取流程当客户端需要读取HDFS中的一个文件时首先客户端会通过DistributedFileSystem来向namenode发起读取的请求namenode在收到请求之后就会通过查找元数据来获取文件的相关的块的信息然后找到每个块的所有的副本的地址返回给客户端客户端在接收并解析到各个块地址后逐个读取块然后针对每个块根据网络距离选择最近的DN建立连接并发送读取请求;DN收到读取请求之后开始传数据当前块读取完毕之后关闭当前DN的连接重复上面的部分步骤读取下一块信息全部读取完毕之后释放所有的网络连接和资源。HDFS 数据写入流程当客户端需要向HDFS中写入一个文件时首先客户端会通过DistributedFileSystem的create()来向namenode发起写入的请求待namenode返回准许后客户端开始写入数据通过DFSOutputStreamDFSOutputStream将数据切分成一个个packet64kB构建好的pkt存入队列当客户端积累到pkt后DFSOutputStream向namenode请求分配块随后开始写入到datanode中namenode根据机架感知为这个块选择副本的存放节点这个块的最后一个副本节点存放数据完毕之后ack给到DFSOutputStream便得知该块写入完毕当最后一个块的工作完成之后释放所有的网络连接和资源。HDFS常用的shell命令-cat 主要用来查看 HDFS 中的非压缩文件的内容 -- hadoop fs -cat /data/data.txt -checksum 查看 HDFS 中文件的校验和。 -- hadoop fs -checksum /data/data.txt -chmod 修改HDFS中文件或目录的访问权限-R 选项可以修改目录下的所有子目录的访问权限执行此命令的用户必须是文件或目录的所有者或超级用户。 -- hadoop fs -chmod 700 /data/data.txt -chown 修改文件或目录的所有者-R选项可以修改目录下所有子目录的所有者此命令的用户必须是超级用户。 -- hadoop fs -chown alice:alice /data/data.txt -count 显示目录下的子目录数、文件数、占用字节数、所有文件和目录名-q 选项显示目录和空间的配额信息。 -- hadoop fs -count /data/ -cp 复制文件或目录如果源文件或目录有多个则目标必须为目录。 -- hadoop fs -cp /data/data.txt /data/data.tmp -df 查看 HDFS 中目录空间的使用情况。 -- hadoop fs -df -h /data -du 查看 HDFS 或目录中的文件大小。 -- hadoop fs -du -h -s -x /data -find 查找 HDFS 中指定目录下的文件。 -- hadoop fs -find /data /data/data.txt -get 将 HDFS 中的文件复制到本地服务器。 -- hadoop fs -get /data/data.txt /home/hadoop/input -getmerge 将 HDFS 中的多个文件合并为一个文件复制到本地服务器。 -- hadoop fs -getmerge /data/a.txt /data/b.txt /home/hadoop/input/data.local -ls 列出 HDFS 中指定目录下的信息 -- hadoop fs -ls /data -mkdir 在 HDFS 上创建目录 -- hadoop fs -mkdir /test/data -mv 移动 HDFS 中的目录到 HDFS 中的另一个目录下。 -- hadoop fs -mv /data/data.local /test -moveFromLocal 移动本地服务器上的某个文件到 HDFS 中。 -- hadoop fs -moveFromLocal /home/hadoop/input/data.local /data/ -moveToLocal 移动 HDFS 中的文件到本地服务器的某个目录下。 -- hadoop fs -moveToLocal /data/data.txt /home/hadoop/input/ -put 复制本地文件到 HDFS 中的某个目录下。 -- hadoop fs -put /home/hadoop/input/data.local /data -rm 删除文件或目录。 -- hadoop fs -rm /data/data.local -text 查看文件内容。text 命令除了能够查看非压缩的文本文件内容之外也能查看压缩后的文本文件内容cat命令只能查看非压缩的文本文件内容。 -- hadoop fs -text /data/data.txt -usage 列出指定命令的使用格式。 -- hadoop fs -usage cat