HDFS 分布式存储基石

本文详细介绍了HDFS的分布式存储基石,包括其基本概念、工作原理、数据读写过程、Namenode的深入解析、HDFS HA机制以及常见问题。HDFS设计目标是存储超大文件和海量文件,支持顺序写入,强调硬件容错和高吞吐量。文中还讨论了小文件问题、NameNode管理以及如何扩展存储容量。

HDFS 分布式存储基石

HDFS简介

HDFS是Hadoop 分布式文件系统。

所处角色

在这里插入图片描述

基本概念

  • 基于JAVA实现的一个分布式文件系统
  • 基于unix/linux
  • 是Hadoop最重要的核心组件
  • 支持顺序写入,而非随机定位读写

HDFS前提和设计目标

  • 存储超大文件
    HDFS 适合存储大文件,单个文件大小通常在百MB以上
    HDFS适合存储海量文件

  • 硬件容错
    基于普通机器搭建,硬件错误是常态而不是异常,因此错误检测和快速、自动的恢复是HDFS最核心的架构目标

  • 流式数据访问
    为数据批处理而设计,关注数据访问的高吞吐量

  • 简单的一致性模型
    一次写入,多次读取
    一个文件经过创建、写入、关闭之后就不需要改变

  • 本地计算
    将计算移动到数据附近

HDFS构成及工作原理解析

基本构成

  • 数据块
    • 文件以块为单位进行切分存储,块通常设置的比较大(最小6M,默认128M)
    • 块越大,寻址越快,读取效率越高,但同时由于MapReduce任务也是以块为最小单位来处理,所以太大的块不利于对数据的并行处理
    • 一个文件至少占用一个块(逻辑概念)
  • Namenode与Datanode
    • namenode负责维护整个文件系统的信息,包括:整个文件树,文件的块分布信息,文件系统的元数据,数据复制策略等
    • datanode存储文件内容存储文件内容,负责文件实际的读写操作,保持与namenode的通信,同步文件块信息

数据读写过程

集群结构

在这里插入图片描述

HDFS读取写入过程

在这里插入图片描述
通过网络拓扑图判断距离
在这里插入图片描述

namenode深入

作用

  • Namespace管理:负责管理文件系统的树状目录结构以及文件与数据块的映射关系
  • 块信息管理:负责管理文件系统中文件的物理块与实际存储位置的映射关系BlocksMap
  • 集群信息管理:机架信息,datanode信息
  • 集中式缓存管理:从Hadoop2.3开始,支持datanode将文件缓存到内存中,这部分缓存通过NN集中管理

存储结构

  • 内存:Namespace数据,BlocksMap数据,其他信息
  • 文件:
    • 已持久化的namespace数据:FsImage
    • 未持久化的namespace操作:Edits

启动过程
在这里插入图片描述

  1. 开启安全模式:不能执行数据修改操作
  2. 加载fsimage
  3. 逐个执行所有Edits文件中的每一条操作将操作合并到fsimage,完成后生成一个空的edits文件
  4. 接受datanode发送来的心跳消息和块信息
  5. 根据以上信息确定文件系统状态
  6. 退出安全模式
  • 安全模式:文件系统只接受读数据请求,而不接受删除、修改等变更请求
  • 什么情况下进入:NameNode主节点启动时,HDFS进入安全模式
  • 什么时候退出:系统达到安全标准时,HDFS退出安全模式
    • dfs.namenode.safemode.min.datanodes : 最小可用datanode数量
    • dfs.namenode.safemode.threshold-pct : 副本数达到最小要求后的block占系统总block数的百分比
    • dfs.namenode.safemode.extention : 稳定时间
  • 相关命令:
    • hdfs dfsadmin -safemode get : 查看当前状态
    • hdfs dfsadmin -safemode enter : 进入安全模式
    • hdfs dfsadmin -safemode leave : 强制离开安全模式
    • hdfs dfsadmin -safemode wait : 一直等待直到安全模式结束
HDFS HA
  • Datanode:通过数据冗余保证数据可用性
  • Namenode:在2.0之前存在SPOF风险,从2.0后:
    1.把name.dir指向NFS(Network File System)——冷备
    在这里插入图片描述
    2.QJM方案(公司常用)——热备
    在这里插入图片描述
HDFS文件格式

HDFS支持任意文件格式

HDFS文件类型

列式与行式存储
在这里插入图片描述

HDFS文件类型

常用文件类型
在这里插入图片描述
如何使用?

ALTER TABLE table_name SET FILEFORMAT PARQUET;
CREATE TABLE table_name (x INT, y STRING) STORED AS PARQUET;
SET hive.default.fileformat=Orc

HDFS常用设置及常见问题

常用配置

配置文件路径:$ HADOOP_HOME $/etc/hadoop
主要配置文件:

  • hdfs-site.xml
  • core-site.xml
    在这里插入图片描述
常见问题
  • 小文件问题
    • 定义: 大量大小小于块大小的文件
    • 实际场景: 网页, Hive动态分区插入数据等
    • 背景: 每个文件的元数据对象约占150byte, 所以如果有1千万个小文件,
    • 每个文件占用一个block, 则NameNode大约需要2G空间。 如果存储1亿个文件, 则NameNode需要20G空间; 数据以块为单位进行处理。
    • 影响: 占用资源, 降低处理效率
    • 解决方案:
      • 从源头减少小文件
      • 使用archive打包
      • 使用其他存储方式, 如Hbase, ES等
Namenode管理

大数据量下的namenode问题:

  1. 启动时间边长
  2. 性能开始下降
  3. NameNode JVM FGC风险较高

解决方案:

  1. 根据数据增长情况,预估namenode内存需求,提前做好预案
  2. 使用HDFS Federation,扩展NameNode分散单点负载
  3. 引入外部系统支持NameNode内存数据
  4. 合并小文件
  5. 调整合适的BlockSize

反思问题

  • 数据块的复制策略?
  • 调整块的大小会造成哪些影响?
  • namenode 启动过程?
  • namenode HA方案?
  • secondary namenode 的作用?
  • hdfs常用文件格式有哪些? 各有什么优缺点?
  • 如何扩展HDFS的存储容量?
<think>我们正在讨论HDFS分布式文件系统的基本原理和应用场景。根据用户提供的引用材料,我们可以总结如下: HDFSHadoop Distributed File System)是Hadoop的核心组件之一,设计用于储和管理大规模数据集(TB级甚至PB级)。它基于“分而治之”的思想,将大文件分割成多个块(Block),并分布储在多台机器上,同时通过副本机制提供高容错性。 ### 基本原理 1. **主从架构**:HDFS采用Master/Slave架构,包含两类节点: - **NameNode(主节点)**:负责管理文件系统的命名空间(NameSpace),储元数据(如文件目录树、文件到数据块的映射、数据块位置等)[^2][^4]。 - **DataNode(从节点)**:储实际的数据块,并定期向NameNode发送心跳和块报告[^2][^4]。 2. **数据分块与副本**: - 文件被分割成固定大小的块(默认为128MB),每个块被复制多份(默认3份)储在不同的DataNode上,以实现容错和高可用[^2][^5]。 - 副本放置策略:第一个副本放在客户端所在节点(或随机节点),第二个副本放在不同机架的节点,第三个副本放在与第二个副本相同机架的不同节点[^2]。 3. **写数据流程**: 1. 客户端向NameNode发起写请求。 2. NameNode检查权限后,返回可写入的DataNode列表。 3. 客户端将数据块写入第一个DataNode,该节点再转发给第二个节点,依次形成流水线复制。 4. 所有DataNode确认写入成功后,客户端通知NameNode完成写入[^2][^4]。 4. **读数据流程**: 1. 客户端向NameNode请求文件位置。 2. NameNode返回文件块所在的DataNode列表(按网络拓扑排序)。 3. 客户端直接从最近的DataNode读取数据块[^2][^4]。 5. **容错机制**: - **NameNode高可用**:通过主备模式(如Secondary NameNode或HA方案)防止单点故障[^2][^4]。 - **数据完整性**:DataNode使用校验和验证数据块完整性,损坏的块会从其他副本恢复[^4][^5]。 - **安全模式**:启动时NameNode入安全模式,等待DataNode汇报块信息,确保系统状态健康[^2]。 ### 应用场景 1. **大数据储**: - 适用于储海量数据(如日志、视频、图像等非结构化数据),支持PB级扩展[^3][^5]。 2. **批处理分析**: - 与MapReduce、Spark等计算框架集成,支持离线数据分析(如用户行为分析、报表生成)[^3][^5]。 3. **高吞吐访问**: - 设计为“一次写入,多次读取”模式,适合数据写入后频繁读取的场景(如数据仓库查询)[^2][^3]。 4. **容灾备份**: - 多副本机制可防止硬件故障导致的数据丢失,适合对可靠性要求高的场景[^5]。 ### 优缺点分析 | 优点 | 缺点 | |------|------| | 高容错性(副本机制) | 不适合低延迟访问(如毫秒级响应) | | 高吞吐量(并行读写) | 小文件储效率低(占用NameNode内) | | 可扩展性(支持10k+节点) | 不支持文件修改(仅追加写) | | 低成本(通用硬件) | | > 💡 **总结**:HDFS是构建大数据平台的基础储系统,核心价值在于**分布式存储**和**高容错性**。它解决了单机无法储海量数据的问题,并通过副本机制保障数据安全。实际应用中常与YARN、MapReduce、Spark等组件配合使用[^1][^3]。 §§相关问题§§ 1. HDFS副本放置策略如何优化跨机架容灾? 2. 为什么HDFS不适合储小文件?如何解决? 3. HDFS的Secondary NameNode与HA方案有何区别? 4. 如何通过FUSE实现HDFS挂载为本地文件系统? > 引用来源: > [^1]: HDFS解决了单机储瓶颈问题,实现多机文件统一管理 > [^2]: HDFS主从架构与读写流程详解 > [^3]: HDFS适用于海量数据储与批处理场景 > [^4]: HDFS的容错机制与运维管理 > [^5]: HDFS设计原理与核心特性(高可用、高吞吐)</think>### HDFS分布式文件系统基本原理与应用场景 #### **一、HDFS的核心概念** 1. **设计目标** - 解决单机储瓶颈:通过分布式架构储**超大规模数据**(TB/PB级)[^1]。 - **高容错性**:自动处理硬件故障(如节点宕机、磁盘损坏)。 - **高吞吐量**:支持海量客户端并发读写,适合批处理场景[^5]。 2. **核心组件** | 组件 | 作用 | |------------------|----------------------------------------------------------------------| | **NameNode** | 储元数据(文件目录树、数据块位置),管理文件系统命名空间[^2][^4]。 | | **DataNode** | 储实际数据块,定期向NameNode发送心跳和块报告[^2][^4]。 | | **Secondary NameNode** | 辅助NameNode合并元数据快照(非热备)[^4]。 | | **Client** | 读写请求发起端,通过SDK与HDFS交互[^5]。 | 3. **数据储原理** - **分块储**:文件被分割为固定大小的块(默认128MB),分散储在多台DataNode上[^2]。 - **多副本机制**:每个数据块默认复制3份,放置在不同机架的节点上,确保容灾[^4][^5]。 ```plaintext 副本放置策略: 副本1: 客户端所在节点 副本2: 同一机架的不同节点 副本3: 不同机架的节点 ``` --- #### **二、HDFS的工作原理** 1. **文件写入流程** ```mermaid graph LR A[Client] --> B[请求NameNode写入路径] B --> C[NameNode验证权限并分配DataNode列表] C --> D[Client将数据块写入第一个DataNode] D --> E[DataNode流水线复制到其他节点] E --> F[所有DataNode确认写入成功] F --> G[Client通知NameNode完成写入] ``` - 关键点:数据通过**流水线复制**(Pipeline)并行传输,提升效率[^2][^5]。 2. **文件读取流程** ```mermaid graph LR A[Client] --> B[请求NameNode获取数据块位置] B --> C[NameNode返回最近的DataNode列表] C --> D[Client直接从DataNode读取数据块] D --> E[合并数据块输出完整文件] ``` - 关键点:Client**就近读取**数据块,减少网络延迟[^4]。 3. **容错机制** - **DataNode故障**:NameNode检测到心跳超时后,触发副本复制到健康节点[^4]。 - **数据校验**:通过**校验和**(Checksum)验证数据完整性,损坏时自动修复[^4]。 - **安全模式**:启动时NameNode不响应写请求,等待DataNode汇报块信息[^2]。 --- #### **三、HDFS的应用场景** 1. **适合场景** - **海量数据储**:日志、视频、图像等非结构化数据仓库(如数仓底层储)[^3][^5]。 - **批处理分析**:与MapReduce/Spark集成,处理离线数据(如用户行为分析)[^3]。 - **高吞吐读写**:流式数据访问(如传感器数据实时入库)[^2]。 - **容灾备份**:多副本机制保障数据安全[^5]。 2. **不适用场景** - ❌ 低延迟访问:如在线交易系统(HDFS设计为高吞吐,非低延迟)。 - ❌ 频繁修改文件HDFS仅支持**追加写入**,不支持随机修改[^2][^4]。 - ❌ 小文件储:大量小文件会耗尽NameNode内(需合并为SequenceFile等格式)。 --- #### **四、HDFS的优缺点** | **优点** | **缺点** | |-----------------------------------|-----------------------------------| | 高容错性(多副本机制)[^5] | 不适合低延迟访问[^2] | | 高吞吐量(并行读写)[^5] | 小文件储效率低[^4] | | 可扩展性(支持10k+节点)[^5] | 不支持文件随机修改[^4] | | 低成本(通用硬件)[^5] | 单NameNode瓶颈(联邦集群可缓解) | > 💡 **总结**: > HDFS是**分布式数据储的基石**,核心价值在于通过分块、多副本和主从架构,实现**海量数据的高可靠储与高吞吐访问**。适合大数据离线分析、日志储等场景,但需避免用于实时交互系统[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值