HDFS 核心概念
HDFS(Hadoop Distributed File System)是 Hadoop 的核心组件之一,设计用于存储超大规模数据集,并运行在廉价硬件上。其核心特点包括:
- 分布式存储:数据分散存储在集群的多个节点上。
- 高容错性 :通过数据副本(默认 3 份)保障数据安全。
- 流式访问:适合批处理场景,而非低延迟访问。
HDFS 架构
- NameNode :主节点,管理文件系统的元数据(如文件目录树、块位置)。
- DataNode:从节点,存储实际数据块并定期向 NameNode 汇报。
- Secondary NameNode:辅助 NameNode 合并编辑日志,防止日志过大。
HDFS 文件读写流程
写入流程
- 客户端向 NameNode 发起写入请求,NameNode 检查权限并分配 DataNode 列表。
- 客户端将数据分块(默认 128MB)并写入第一个 DataNode,该节点进一步复制到其他节点。
- 写入完成后,NameNode 更新元数据。
读取流程
- 客户端向 NameNode 请求文件块位置信息。
- 客户端直接从最近的 DataNode 读取数据块。
元数据的定义
- 元数据(Metadata)是描述数据的数据,用于提供关于其他数据的上下文、结构、特征或管理信息。它帮助用户理解、查找、管理和使用数据资源。
类似:数据块的大小,数据块存放的位置,文件类型,文件大小。
- 适合顺序读写,不适合频繁修改或低延迟访问。
元数据的应用场景
- 数据治理:确保数据质量、一致性和可追溯性。
- 搜索引擎优化 :HTML中的
<meta>标签(如description、keywords)提升网页检索效率。 - 科学研究:科研数据集的标准描述(如DOI标识符、FAIR原则)。
HDFS 常用命令
# 查看文件列表
hdfs dfs -ls /path
# 上传文件
hdfs dfs -put localfile /hdfs/path
# 下载文件
hdfs dfs -get /hdfs/path localfile
# 删除文件
hdfs dfs -rm /hdfs/path
# 查看文件内容
hdfs dfs -cat /hdfs/path
HDFS 配置参数
关键配置文件为 hdfs-site.xml,常见参数:
<property>
<name>dfs.replication</name>
<value>3</value> <!-- 副本数 -->
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value> <!-- 块大小(字节) -->
</property>
HDFS 高可用(HA)
通过 Zookeeper 和共享存储(如 JournalNode)实现 NameNode 的主备切换,避免单点故障。
高可用模式(HA启用时)
通过配置高可用性,集群会部署两个NameNode:
- Active NameNode:处理所有客户端请求和元数据操作。
- Standby NameNode :实时同步Active NameNode的元数据,准备在故障时接管服务。
两者通过共享存储(如Quorum Journal Manager或NFS)保持元数据同步,并通过ZooKeeper实现自动故障转移。
关键注意事项
- 物理服务器数量:两个NameNode通常部署在不同物理服务器上以避免单点故障。
- 扩展性:HDFS不支持横向扩展多个NameNode(即不能超过两个),但可通过联邦模式(HDFS Federation)将命名空间分区到多个NameNode。
HDFS 副本计算距离公式
HDFS(Hadoop Distributed File System)通过副本机制确保数据的可靠性和容错性。副本的放置策略基于网络拓扑距离计算,以优化数据访问性能和网络带宽利用率。
网络拓扑距离计算
HDFS 使用树状网络拓扑模型,将节点分为多个层级(如数据中心、机架、节点)。距离计算公式如下:
- 同一节点:距离为 0(即本地副本)。
- 同一机架不同节点:距离为 2。
- 不同机架:距离为 4。
- 不同数据中心:距离为 6(通常由配置决定)。
副本放置策略
默认策略(3 副本)的放置规则:
- 第一个副本放在写入请求的客户端所在节点(若客户端不在集群内,则随机选择)。
- 第二个副本放在与第一个副本不同机架的随机节点。
- 第三个副本放在相同机架的不同节点。
HDFS 适用场景
- 海量数据存储(如日志、ETL 中间结果)。
HDFS 不适合的场景
HDFS(Hadoop Distributed File System)是为大数据批处理设计的分布式文件系统,但在某些场景下表现不佳:
低延迟数据访问
HDFS 针对高吞吐量而非低延迟优化,不适合需要毫秒级响应的场景(如在线交易系统)。其设计基于顺序读写,随机访问性能较差。
大量小文件存储
NameNode 将文件元数据存储在内存中,单个小文件会占用与大型文件相同的元数据空间。存储大量小文件会导致内存压力,影响集群扩展性。
实时数据写入
HDFS 采用"一次写入多次读取"模型,不支持文件随机修改。仅允许追加写入,且实时同步写入效率低于传统文件系统。
多用户写入同一文件
HDFS 不支持并发写入同一文件,仅允许单写入者多读取者模式。需要频繁协作编辑的场景(如共享文档)不适用。
学习资源推荐
- 官方文档:Apache HDFS
- 实践工具:Hadoop 单机/集群环境搭建(如 Docker 或 Cloudera QuickStart VM)。