HDFS

HDFS(Hadoop Distributed File System)是 Hadoop 的分布式文件系统,专为一次写入、多次读取的大文件场景设计。将文件切分为固定大小的 Block(默认 128MB),分散存储到多个 DataNode,并通过副本机制保证数据可靠性。


架构

Client
  │
  ▼
NameNode(元数据:文件名、Block 列表、DataNode 位置)
  │
  ├── DataNode 1(Block A, Block C)
  ├── DataNode 2(Block A副本, Block B)
  └── DataNode 3(Block B副本, Block C副本)
角色职责
NameNode管理文件系统命名空间和元数据,不存储实际数据
DataNode存储 Block,定期向 NameNode 发送心跳
SecondaryNameNode定期合并 EditLog 和 FsImage,减轻 NameNode 压力(非 HA 备份)

读写流程

写文件:

Client → NameNode(申请写入,获取 DataNode 列表)
Client → DataNode1 → DataNode2 → DataNode3(流水线写入)
写完后 → NameNode(更新元数据)

读文件:

Client → NameNode(查询 Block 所在 DataNode)
Client → 就近 DataNode(直接读取 Block)

常用命令

# 查看目录
hdfs dfs -ls /
hdfs dfs -ls -R /user          # 递归列出
 
# 上传 / 下载
hdfs dfs -put localfile.txt /hdfs/path/
hdfs dfs -get /hdfs/path/file.txt ./local/
 
# 创建目录
hdfs dfs -mkdir -p /user/data
 
# 删除
hdfs dfs -rm /hdfs/path/file.txt
hdfs dfs -rm -r /hdfs/dir       # 递归删除目录
 
# 查看文件内容
hdfs dfs -cat /hdfs/file.txt
hdfs dfs -tail /hdfs/file.txt
 
# 查看文件大小
hdfs dfs -du -h /hdfs/path
 
# 修改副本数
hdfs dfs -setrep 2 /hdfs/file.txt
 
# 检查集群健康状态
hdfs fsck /
hdfs fsck / -files -blocks -locations  # 详细 Block 信息
 
# 查看集群状态报告
hdfs dfsadmin -report

关键配置(hdfs-site.xml)

<!-- 副本数(默认 3) -->
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>
 
<!-- Block 大小(默认 128MB) -->
<property>
  <name>dfs.blocksize</name>
  <value>134217728</value>
</property>
 
<!-- DataNode 数据存储目录 -->
<property>
  <name>dfs.datanode.data.dir</name>
  <value>/data/hdfs/datanode</value>
</property>
 
<!-- NameNode 元数据目录 -->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>/data/hdfs/namenode</value>
</property>

HA 高可用

生产环境通过两个 NameNode(Active/Standby)实现 HA,依赖 Zookeeper 进行主备切换,JournalNode 集群同步 EditLog。

Active NameNode  ←→  JournalNode × 3  ←→  Standby NameNode
        ↕                                         ↕
              Zookeeper(ZKFC 监控,自动切换)

相关链接

  • Hadoop — HDFS 所属的大数据框架,提供 YARN 和 MapReduce
  • Hive — 将 SQL 转为 MapReduce,数据存储在 HDFS
  • Flume — 采集日志数据写入 HDFS
  • Spark — 直接读取 HDFS 数据进行内存计算