Hadoop之hdfs详解

本文深入解析Hadoop的分布式文件系统HDFS,包括其设计思想、基本组成和架构特点。HDFS采用分块存储策略,每个文件按128M大小切分为数据块,并进行冗余备份,以提高数据安全性和容错性。HDFS采用一主多从的架构,NameNode存储元数据,DataNode存储实际数据并处理客户端读写请求。尽管HDFS存在延时较高和不适合小文件存储等缺点,但其低成本、高扩展性和高容错性使其成为大数据处理的理想选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@TOC@(Scala入门—)

Hadoop之hdfs详解

Hadoop由两部分组成,分别是分布式文件系统HDFS和分布式计算框架MapReduce。
在Hadoop中,MapReduce底层的分布式文件系统是独立模块,用户可按照约定的一套接口实现自己的分布式文件系统,然后经过简单的配置后,存储在该文件系统上的数据便可以被MapReduce处理。
Hadoop默认使用的分布式文件系统是HDFS(Hadoop Distributed File System)。

HDFS基本组成

HDFS的架构如下图所示:
在这里插入图片描述

hdfs的设计思:

假设有一个超级大的文件10T
服务器多台 ,每一个3T
超级大的文件如何存储呢?
存储方案:将超级大的文件 切分 每一个小文件进行存储在不同的节点上

  1. 分而治之的思想 (block) ,对文件进行分块存储
    这个时候需要一个切分标准:
    2.5T 合理吗?
    切分的数据块太大了 容易造成集群中节点的存储的负载不均衡
    1kb一个块合理吗?
    会造成一个文件切分过多的块 会造成namenode的压力过大
    关于这个标准 hdfs中已经帮我们设计好了:
    blocksize
    dfs.blocksize 134217728
    > hadoop2.0中默认的每一个块的大小 128M
    hadoop1.0中默认的每一个块的大小64M
    hadoop3.0中每一个块默认大小 256M
    总结:也就是说 如果我们用hadoop2.0, hdfs进行文件存储的时候 将文件进行切块 默认的一个块大小128M。如果一个文件400M ,就会切分成如下:
    0-128M blk01 128M
    129-256 blk02 128M
    257-384 blk03 128M
    384-400 blk04 16M 独立成一个块 不会和其他的文件的数据块合并又存储一个文件
    这个文件 单独成一个块
    一个文件不够128M 单独成一个块。
    而块的实际大小 实际存储的数据的大小
  2. 冗余存储
    解决数据丢失的问题 hadoop基于普通廉价机的
    用空间换取数据安全
    在hdfs中每一个数据块都会进行备份存储
    (
    dfs.replication
    2
    HDFS 的数据块的副本存储个数
    )
    目前我们集群中配置的每一个数据块存储2个副本
    这里的副本,不是备份的意思它代表的是总存储份数 这里的副本每一个副本都是同等地位的, 没有优先级 ,多个副本数据相互互为副本的 ,对外提供服务的时候谁有时间谁提供
    dfs.replication 3 默认配置 ,默认的情况下每一个数据块存储3份
    注意
    1)一个节点上可以存储多个数据块的 一个数据块只能存储在一个节点上
    但是同一个节点的多个数据块中肯定没有相同的
    同一个数据块的多个副本 不可能存储在一个节点的 不同的副本存储在不同的节点
    2)真实副本<设置值
    假设集群3个节点 副本配置2个 有一个块的一个副本的节点宕机了 会造成这个块的副本数低于配置的值 这个时候会复制出来这个块的一个副本存储在另一个节点上
    3)集群节点>副本
    集群节点3个 副本 4个
    会存储3份 另外与一份 namenode会进行"记账"当集群中的添加节点的时候将这个欠的副本复制出来
    4)真实副本> 设置
    集群中某一个节点宕机 这个节点上存储的所有的副本都会复制一份出来 过了一段时间 这个节点活了 造成这个节点上存储的数据块的副本多了 真实的副本大于设置的副本个数 等待1h左右删除多余的副本

hdfs的架构:一主多从的架构

hdfs的架构:
主从架构 一主多从的架构

hdfs中主是:namenode 主节点,是hdfs的老大,它的功能是
1)存储元数据信息
这里的元数据指的是描述datanode上的存储的真实的数据的数据
datanode上存储数据的块的对应关系
存储路径:

dfs.namenode.name.dir
/home/hadoop/data/hadoopdata/name
namenode (存储元数据的目录)

2)namenode记录的元数据 包含3部分内容的:
1 抽象目录树
通过目录树查看文件系统中存储的文件目录结构的,其中目录树是从**/开始的目录结构
目录树不属于任何一个具体节点,它是一个抽象的一个目录,假如目前集群中3个从节点,分别是hdp01,hdp02,hdp03
/指的是3个从节点共同组成的一个存储系统的抽象的/**目录
2 目录树中的文件和数据块的对应关系,如下有一个180M大小的文件
/jdk-8u73-linux-x64.tar.gz 180M
0-128M blk_1073741825
129-180M blk_1073741826
注意:hadoop集群中 每一个数据块都会有一个唯一编号,并且是全局唯一的
3 数据块和节点的对应关系 数据块存储位置
/jdk-8u73-linux-x64.tar.gz 180M
0-128M blk_1073741825 [hdp03 hdp01]
129-180M blk_1073741826 [hdp03 hdp01]
da1
2)datanode 从节点 包含2部分内容的:
1)负责真正的数据存储
真正的干活的
每一个节点将对应的数据块存储在自己的本地
存储路径在哪里?

dfs.datanode.data.dir
/home/hadoop/data/hadoopdata/data
datanode 存储真实数据的目录

数据块的存储目录
/home/hadoop/data/hadoopdata/data
current 核心数据
in_use.lock 锁文件
current目录下:
BP-1453129122-192.168.191.201-1556592207649 块池文件夹 存储namenode管理的所有数据块信息的
VERSION 版本信息
数据块的存储目录:
/home/hadoop/data/hadoopdata/data/current/BP-1453129122-192.168.191.201-1556592207649/current/finalized/subdir0/subdir0
blk_1073741825
blk_1073741826 真实数据块
blk_1073741825_1001.meta
blk_1073741826_1002.meta 数据块的元数据信息 用于数据校验的 校验数据块的完整性的
2) 负责处理客户端真正的读写请求的
secondarynamenode 助理 namenode的冷备份节点
1)帮助namenode备份元数据 防止namenode元数据丢失
namenode元数据损坏或丢失的时候可以通过 secondarynamenode进行恢复的
2)减轻namenode的压力
帮助namenode做一些工作
帮助namenode进行元数据合并

hdfs的架构:优缺点

缺点:
1)延时性比较高
不适合实时读取
2)不适合存储大量的小文件
原因:
1)不划算
集群中 存储了大量的 1kb一个文件 10w个
数据查询的时候
1数据块的寻址
client — namenode (抽象目录树 数据-块 块存储位置)
client—datanode — 对应的块id
2 开始读取
读取数据可能 1ms
寻址时间 远远大于 读取数据的时间 不划算
3 会造成namenode的压力很大
一个数据块 — 一条元数据
大量的小文件 — 大量的数据块— 大量的元数据信息
一条元数据信息 150byte
原始数据块 元数据
128M — 150byte
1kb ---- 150byte
10w * 1kb === 100000kb= 100M 原始数据 100g 多个从节点
10w * 150byte ==15000000byte=15M 元数据 15G 一个节点
3)不支持文件修改 支持文件追加
一次写入多次读取
修改的成本太高 首先需要先确定修改的数据所属的数据块id 在进行修改所有的对应的数据块的副本 hdfs干脆关闭了修改的功能
虽然支持文件追加 不建议使用
优点:
1)成本低
基于普通廉价机
2)高扩展性
集群的从节点 可以无限横向扩展 原则没有上线
3)高容错性
副本机制 保证数据的安全性
只要所有副本不同时宕机 就能访问数据
副本个数=节点个数 数据安全性 容错机制最好
空间—数据安全
4)高可用性
hadoop2 namenode的高可用方案
集群可以7*24 服务
5)适合批处理 大数据处理

### 关于 UniApp 框架推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值