Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HDFS系列(1) | HDFS文件系统的简单介绍

HDFS系列(1) | HDFS文件系统的简单介绍

作者头像
不温卜火
发布于 2020-10-28 07:36:12
发布于 2020-10-28 07:36:12
1.3K00
代码可运行
举报
文章被收录于专栏:不温卜火不温卜火
运行总次数:0
代码可运行

Hadoop分布式环境搭建(简单高效~)这篇博客中,博主在最后为大家带来了HDFS的初体验。但是当时只是尝试测试一下集群是否有错误,因此,本篇博文为大家带来HDFS的文件系统介绍。

在介绍文件系统之前我们首先需要了解HDFS的作用。我们都知道HDFS是Hadoop的一个核心组件,那在Hadoop中HDFS扮演着怎样的一个角色呢?我们可以通过下图直观的了解。

  • 上图中个部分的作用:
  • HDFS:一个高可靠、高吞吐量的分布式文件系统,对海量数据的存储。
  • MapReduce:一个分布式的资源调度和离线并行计算框架。
  • Yarn:基于HDFS,用于作业调度和集群资源管理的框架。

话不多说,开始进入正题

一. HDFS基本介绍

HDFSHadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一,作为最底层的分布式存储服务而存在。

分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。

可以把HDFS理解为将多个节点上的容量汇总到一起,拼接成一个大的文件系统,在一个节点上上传数据,在其他的节点上都能够访问使用。

二. HDFS的组成架构及作用

  • 1. 在HDFS中,使用主从节点的方式,即使用Master和Slave结构对集群进行管理。一般一个 HDFS 集群只有一个Namenode 和一定数目的Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。

那么如何生动的理解这一过程呢,博主准备如下图片使大家能够使大家能够能加容易的理解这一概念:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
由上图可知:
   NameNode(Master)管理者 - 只负责管理,管理集群内各个节点。
   SecondaryNameNode 辅助管理 – 只负责辅助NameNode管理工作。
   DataNode(Slave) 工作者,是负责工作,周期向NameNode汇报,进行读写数据。
  • 2. HDFS集群包括,NameNode,DataNode,clent以及Secondary Namenode(在第九部分有图解)

①NameNode(Master)

  • 1.管理HDFS的名称空间
  • 2.配置副本策略
  • 3.管理数据块(Block)映射信息
  • 4.处理客户端读写请求

②DataNode(Slave)

  • 1.存储实际的数据块
  • 2.执行数据块的读/写操作

③ Client

  • 1.文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传
  • 2.与NaneNode交互,获取文件的位置信息
  • 3.与DataNode交互,读取或者写入数据
  • 4.Client提供一些命令来管理HDFS,比如NameNode格式化
  • 5.Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作

④SecondaryNameNode:

  • 1.辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
  • 2.在紧急情况下,可辅助恢复NameNode

三. HDFS分块存储

HDFS将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的统一大小和形式进行存储,方便我们的分布式文件系统对文件的管理。

块的默认大小在Hadoop2.x版本中是128M,老版本为64M。block块的大小可以通过hdfs-site.xml当中的配置文件进行指定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <property>
        <name>dfs.block.size</name>
        <value>块大小 以字节为单位</value>//只写数值就可以
    </property>

注意: 你需要了解知识点: 一个文件100M,上传到HDFS占用几个快?一个块128M,剩余的28M怎么办? 事实上,128只是个数字,数据超过128M,便进行切分,如果没有超过128M,就不用切分,有多少算多少,不足128M的也是一个块。这个块的大小就是100M,没有剩余28M这个概念。

四. 抽象成数据块的好处

为什么要要将数据抽象成数据块呢?又有哪些好处?

  1. 一个文件有可能大于集群中任意一个磁盘 10T*3/128 = xxx块 2T,2T,2T 文件方式存—–>多个block块,这些block块属于一个文件
  2. 使用块抽象而不是文件可以简化存储子系统
  3. 块非常适合用于数据备份进而提供数据容错能力和可用性

通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。

例如: 连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。 用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组。 例如一个文件 130M,会被切分成2个block块,保存在两个block块里面,实际占用磁盘130M空间,而不是占用256M的磁盘空间

五. HDFS副本机制

HDFS视硬件错误为常态,硬件服务器随时有可能发生故障。为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。 数据副本默认保存三个副本,我们可以更改副本数以提高数据的安全性,怎样修改副本数呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim hdfs-site.xml

<property>
      <name>dfs.replication</name>
      #  这里填写副本数,修改完毕之后记得重启集群生效
      <value>3</value>
</property>

六. Hadoop2.7.2副本节点选择

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于相同机架,随机节点。
第三个副本位于不同机架,随机节点。

七. 名字空间(NameSpace)

HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。 Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode 记录下来。 HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件, 形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。

八. Namenode 元数据管理

  • 1.我们把目录结构及文件分块位置信息叫做元数据。Namenode负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的id,及所在的datanode服务器)。
  • 2. Namenode节点负责确定指定的文件块到具体的Datanode结点的映射关系。在客户端与数据节点之间共享数据。
  • 3.管理Datanode结点的状态报告,包括Datanode结点的健康状态报告和其所在结点上数据块状态报告,以便能够及时处理失效的数据结点。

九. Datanode 数据存储

  • 1. 文件的各个 block 的具体存储管理由 datanode 节点承担。每一个 block 都可以在多个datanode 上。Datanode 需要定时向 Namenode 汇报自己持有的 block信息。 存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)。
  • 2.向Namenode结点报告状态。每个Datanode结点会周期性地向Namenode发送心跳信号和文件块状态报告。

心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。 DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。

  • 3.执行数据的流水线复制。当文件系统客户端从Namenode服务器进程获取到要进行复制的数据块列表后,完成文件块及其块副本的流水线复制。

一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

本次的分享就到这里了,喜欢的各位小伙伴们希望你们能够点赞和关注呀

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Boot – 使用 ModelMapper 将实体映射到 DTO
在企业应用中,我们使用RESTful服务来建立客户端和服务器之间的通信。总体思路是客户端将请求发送到服务器,服务器用一些响应来响应该请求。一般来说,我们大多数应用程序都具有三个不同的层:Web层、业务层和数据库层。这些层中的对象大多彼此不同。例如,Web层对象与数据库层中的同一对象完全不同。由于数据库对象可能包含 Web 层对象中不需要的字段,例如自动生成的字段、密码字段等。
用户1418987
2023/10/26
1.3K0
Spring Boot – 使用 ModelMapper 将实体映射到 DTO
Spring Boot开发中,经常听到的PO、VO、DAO、BO、DTO、POJO到底是什么?
在Spring Boot开发中,我们经常会听到诸如PO、VO、DAO、BO、DTO、POJO等概念。这些术语看起来很相似,但它们之间有着不同的含义和用途。在本文中,我们将详细介绍这些概念,并解释它们在Spring Boot开发中的作用和用法。
网络技术联盟站
2023/06/03
5.1K0
深入理解 toDto 与 toEntity
在现代软件开发中,尤其是后端开发中,数据传输对象(DTO)和实体对象的转换是一个常见且重要的操作。理解和正确实现这种转换不仅能提高代码的可维护性,还能提升应用的性能和安全性。本文将深入探讨 toDto 和 toEntity 方法,并结合 Eladmin 框架,帮助开发者更好地掌握这一关键技术。
繁依Fanyi
2024/06/19
2680
使用双向 @OneToOne 注解避免 Spring Boot 中的 StackOverflowError
在使用 Java Spring Boot 开发过程中,实体之间的关系映射是一个非常常见的需求。为了便于理解,我们将介绍双向 @OneToOne 关系映射,以及如何避免由此产生的 StackOverflowError 问题。
繁依Fanyi
2024/08/20
2350
Spring Boot 实现解耦和隔离的技术指南
在现代软件开发中,解耦和隔离是保证代码可维护性和可扩展性的关键。Spring Boot 作为一种流行的 Java 框架,通过其强大的依赖注入和配置管理功能,使得开发者可以轻松实现模块之间的解耦和隔离。本文将介绍如何在 Spring Boot 项目中实现解耦和隔离,并分享一个实际应用的案例。
小马哥学JAVA
2024/06/13
4470
SpringBoot项目结构
演示代码地址:kuizuo/spring-boot-demo (github.com)
愧怍
2022/12/27
1.4K1
SpringBoot项目结构
Spring Boot 常用注解
注解 annotation 用来定义一个类、属性和一些方法,以便程序能够被编译处理。
Jimmy_is_jimmy
2023/07/31
2190
Spring Boot 常用注解
springboot第12集:DAO功能代码
在Spring Boot中,DAO是数据访问对象的缩写,它是一种设计模式用于提供对数据库操作的抽象层。通过使用DAO模式,我们可以将数据操作与业务逻辑分离,并提供一个单独的接口来执行所有的数据库操作。
达达前端
2023/10/08
4810
springboot第一集:由springboot的dto拓展的内容
DTO: Data Transfer Object. 通常是在 OpenApi . 即此项目与其他外界项目交互时使用的对象.
达达前端
2023/10/08
5750
使用Spring Boot快速搭建Java Web应用
Spring Boot 是一个基于 Spring 框架的快速开发应用程序的工具,可以大大简化 Java Web 应用的搭建过程。下面将详细介绍如何使用 Spring Boot 快速搭建 Java Web 应用。
用户1289394
2023/12/28
5350
使用Spring Boot快速搭建Java Web应用
Spring源码学习之旅:从理解到实战的深度探索
文章地址:https://cloud.tencent.com/developer/article/2470521
小马哥学JAVA
2024/11/28
1180
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。
程序猿DD
2023/09/19
1.1K0
Spring Boot虚拟线程的性能还不如Webflux?
Springboot项目中VO包的含义
在Spring Boot项目中,VO(Value Object)是一个非常重要的概念。VO代表值对象,它用于封装业务逻辑中的数据,并且在应用程序的不同层之间进行传递。VO在Spring Boot项目中起到了很多重要的作用,下面我们来详细讲解一下。
GeekLiHua
2025/01/21
1780
Java Spring Boot中的AOP、DI和IOC
AOP是一种编程范式,它允许开发人员将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,例如日志记录、性能监控、事务管理等。在Spring Boot中,AOP通过切面(Aspect)和通知(Advice)实现。
GeekLiHua
2025/01/21
1300
简单地聊一聊Spring Boot的构架
本文小编将详细解析Spring Boot框架,并通过代码举例说明每个层的作用。我们将深入探讨Spring Boot的整体架构,包括展示层、业务逻辑层和数据访问层。通过这些例子,读者将更加清晰地了解每个层在应用程序中的具体作用。通过代码实例,我们将帮助读者更好地理解和应用Spring Boot框架,从而提高应用程序的可维护性和可扩展性。
葡萄城控件
2023/11/15
8980
简单地聊一聊Spring Boot的构架
DTO和VO的区别及使用场景详解
随着互联网的发展,前后端分离的开发模式越来越流行。在前后端数据交互过程中,为了保证数据的安全性和效率,通常会采用 DTO 和 VO 来封装数据。本篇博客将详细介绍 DTO 和 VO 的区别以及使用场景。
Yeats_Liao
2023/12/11
5.9K0
springboot第2集:springboot的domain中的vo是什么
在Spring Boot中,VO代表Value Object,通常用于封装返回给客户端的数据,它是一种特殊的DTO(Data Transfer Object)。VO的作用是将业务逻辑处理的结果打包成一个不可修改的对象,以方便数据的传输和处理,它通常只包含少量的属性,也不包含任何业务逻辑。VO常见的用途是作为前端展示数据的模型类,用于在不同层次之间进行数据传递的介质。
达达前端
2023/10/08
1.6K0
MySQL驱动扯后腿?Spring Boot用虚拟线程可能比用物理线程还差
这个问题确实之前就有看到过相关的评测,顺着个这个问题,重新把相关评测找出来,给大家分享一下。
程序猿DD
2024/01/23
8030
MySQL驱动扯后腿?Spring Boot用虚拟线程可能比用物理线程还差
Java分层开发必知:PO、BO、DTO、VO、POJO概念详解
在Java企业级开发中,我们经常会遇到POJO、PO、DTO、BO、VO等各种对象概念,这些看似相似的术语常常让开发者感到困惑。本文将深入解析这些核心概念的区别与联系,并通过代码示例展示它们在实际项目中的正确使用方式。
冬天vs不冷
2025/05/13
380
Java分层开发必知:PO、BO、DTO、VO、POJO概念详解
Spring Boot实现用户注册验证全过程
首先,我们需要一个DTO来囊括用户的注册信息。这个对象应该包含我们在注册和验证过程中所需要的基本信息。
翊君
2022/03/08
1.4K0
相关推荐
Spring Boot – 使用 ModelMapper 将实体映射到 DTO
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验