分布式文件系统HDFS(林子雨慕课课程)

文章目录

    • 3. 分布式文件系统HDFS
      • 3.1 分布式文件系统HDFS简介
      • 3.2 HDFS相关概念
      • 3.3 HDFS的体系结构
      • 3.4 HDFS的存储原理
      • 3.5 HDFS数据读写
        • 3.5.1 HDFS的读数据过程
        • 3.5.2 HDFS的写数据过程
      • 3.6 HDFS编程实战

3. 分布式文件系统HDFS

3.1 分布式文件系统HDFS简介

  • HDFS就是解决海量数据的分布式存储问题
    image-20231007184204043

  • 为什么会出现分布式文件系统?

    image-20231007184422101

  • 计算机集群基本架构

    • 每个机架由若干个节点构成

    image-20231007185008914

  • 机架的内部之间是通过光纤交换机进行连接,机架与机架通过带宽更高的光纤交换机进行连接

    image-20231007185237064

  • 分布式文件系统的存储结构

    • 主节点存储相关的元数据服务:目录存储服务,从节点需要完成相关的数据存储任务

      image-20231007185455319

  • HDFS是非常流行的一个分布式存储系统

    image-20231007185555670

  • HDFS实现的目标

    • 兼容廉价的硬件设备
    • 实现流数据读写
    • 支持大数据集
    • 支持简单的文件模型
    • 强大的跨平台兼容性:基于JAVA语言开发,JAVA语言有着良好的跨平台特性
  • HDFS局限性

    • 不适合低延迟数据访问:不能满足实时的处理需求
    • 无法高效存储大量小文件:因为HDFS是通过元数据指引到客户端的哪个节点找文件,这些namenode会被保存到内存中去,到内存中检索索引数据结构,如果小文件太多,这个索引结构会过于庞大,在索引结构中搜索的效率会越来越低
    • 不支持多用户写入以及任意修改文件

3.2 HDFS相关概念

  • 块的概念

    • 块的大小比普通文件系统大很多,普通文件系统可能几字节,它可以达到64M或者128M

    image-20231007190438988

    • HDFS采用这种抽象的块的概念设计好处?为什么要这样设计块?
      • 为了支持面向大规模的数据存储:对大文件进行切割,可以分别存储在不同的数据节点,可以突破单机存储的上线
      • 简化系统设计:通过块设计方便元数据管理,块大小固定,可以很容易知道一个文件需要几个块进行存储
      • 适合数据备份:一个块可以冗余的存储到多个不同的节点上
      • 同时降低分布式节点的寻址开销:访问HDFS数据需要经过三级寻址:元数据目录–>数据节点–>取数据
    • 块是否是设置的越大越好?
      • 不是,如果块过大会导致MapReduce就一两个任务时,在执行完全牺牲了MapReduce的并行度,发挥不了分布式并行处理的效果
  • HDFS的两大组件

    • 名称节点(NameNode):整个HDFS集群的管家,假如客户端访问一个特别大的文件,通过NameNode可以知道这个大文件的每一个块被放置在哪个机器节点之上

    • 数据节点(DateNode):负责存储实际数据,将数据保存到本地的Linux文件系统中去

      image-20231007191635266

  • 元数据的作用?

    image-20231007191714382

  • 名称节点包含的两大结构:FsImage和EditLog

    image-20231007191912022

    • FsImage包含内容

      注意FsImage不保存块具体在数据节点的位置,这个在单独的内存区域维护的

      数据节点中加入新数据–>向名称节点汇报数据节点中包含哪些块–>名称节点构建清单:包含各个块的位置分布

      image-20231007192051935

  • HDFS要如何利用NameNode的数据结构

    • shell命令启动NameNode–>将FsImage从后台加载到内存中去,和EditLog中的内容进行合并(对数据结构的修改记录存储在EditLog中)–>得到最新元数据–>将新版FsImage保留,创建空的EditLog
    • EditLog永远保存的是更新操作(增量操作),然后再将EditLog合并到FsImage中去

image-20231007193050764

  • 但是若是不断的修改操作,会使得EditLog不断增加,影响整体使用的性能?怎么办?

  • 引入第二名称节点(SecondNameNode):

    • 作为名称节点的冷备份
    • 对EditLog的处理

    image-20231007193341520

    • 在第一名称节点的EditLog较大时,第二名称节点会告诉第一名称节点停止使用EditLog文件,并将EditLog写入自己机器

    image-20231007193415994

    • 1.此时NameNode会马上停止,此时生成edits.new,将新到达的更新写到edits.new中,将原来旧的editlog内容由secondNameNode取走

      image-20231007194717745

    • 2.SecondNameNode会通过http的get方式,将NameNode的FsImage和EditLog都下载到本地,然后在SecondNameNode做合并操作,得到新的FsImage,然后发送给NameNode

      image-20231007194939029

    • 3.NameNode再将Edits.new更改为EditLog:即实现了不断增加的Editlog和FsImage合并,又实现了冷备份效果

      image-20231007195126055

  • 数据节点:存储数据,数据节点拿到存储数据的文件目录,又将数据保留到各自的linux文件系统中去

    image-20231007195324803

3.3 HDFS的体系结构

  • 主节点:管家作用;从节点:数据存储作用

    image-20231007195605954

  • HDFS的命名空间

    • HDFS的目录访问和普通目录相同,都是通过/进行访问

      image-20231007195715117

    • 所有的HDFS基于TCP/IP的通信协议,不同组件之间的通信协议有差异:例如客户端向名称节点发起TCP连接,使用客户端协议和名称节点进行交互;客户端和数据节点进行交互是通过远程调用:RPC来进行实现的

      image-20231007200100150

  • HDFS体系结构的局限性:

    image-20231007200154491

    注意secondNamenode并不能保证集群的可用性:

    因为secondNameNode是冷备份,就是在故障发生时,必须停止一段时间,慢慢恢复,这个恢复的过程会导致整个集群的不可用

image-20231007200402623

  • 如何解决?HDFS2.0

    image-20231007200501421

3.4 HDFS的存储原理

  • 冗余数据保存问题

    • HDFS建立在廉价机器上,其缺点是会不停出故障,因此以块为单位,会将数据进行冗余保存,一般情况下一份数据会被保存为3份

      image-20231007200755388

    • 有何好处?

      • 加快数据传输速度:因为假设3个客户端ABC,需要访问同一个数据块,在冗余数据存储可以使三个客户端并行进行访问

        image-20231007200937628

      • 很容易检查数据错误:可以通过三个副本之间对照来检查数据是否有误

      • 保证数据可靠性:即使有机器down了,仍然能保有其他机器是可用的

  • 数据保存策略问题

    image-20231007201203030

    • 假设此时有一个块存入

      • 首先创建三个副本,假设块是由数据节点1发起的,这个副本称为第一副本,其则直接将其放在数据节点1上,不需要通过网络复制到其他节点上

      • 若是集群外部的某个节点发起了写数据请求,HDFS会随机挑选一个磁盘不太满,cpu不太忙的节点作为第一副本。

      • 第二副本会放置在和第一个副本不同的机架上

      • 第三副本放置在第一个副本相同机架的其他节点上

      • 若还有其他副本,则通过随机算法,放置在任意节点上

        image-20231007201828997

    • 数据读取问题:

      image-20231007202044890

  • 数据恢复的问题

    • 名称节点出错?

      • HDFS1.0:会将整个HDFS暂停一段时间,即从secondNameNode中进行冷备份恢复一段时间,再进行对外服务

      • HDFS2.0:不需要暂停,直接热备份

        image-20231007202350004

    • 数据节点出错?

      • 数据节点会隔一段时间向名称节点发送心跳信息,说明其还活着,若是名称节点收不到该数据节点的心跳信息,说明该数据节点发生故障

      • 名称节点会在该数据节点列表上将其标记为宕机,即不可用,把存储在这个节点上的数据重新分发到其他的机器上去

      • 当负载不均衡的时候,某个节点的负载过重,也会将这个节点的数据迁移到其他节点

        image-20231007202840257

    • 数据本身出错?

      • 客户端读取数据会对它进行校验码校验,如果发现校验码不正确,说明数据出错

      • 这个校验码是在客户端写入数据时,为数据块生成校验码,保存在同一个文件目录中去,下次读数据块时,会对读到的数据进行校验码计算,

        将计算的校验码和原来得到的校验码进行对比,不一致说明发生错误

        image-20231007203203892

3.5 HDFS数据读写

3.5.1 HDFS的读数据过程
  • HDFS的FileSystem的基类,会有很有子类继承它而实现不同的功能

  • FileSystem基本方法:open read close 。open创建输入流封装了DFSInputStream, 是专门针对 HDFS的实现;create方法创建了FSoutputstream,同样封装了DFSoutputstream

    image-20231007204448453

  • FileSystem.get(conf):获得工程目录下的两个配置文件 hdfs-site.xml 和core-site.xml

    image-20231007204701148
  • HDFS读数据的整个流程

    • 1.打开文件:用FileSystem声明文件对象,生成DistributedFileSystem的实例对象;创建输入流:FSDataInputStream,获取数据块信息,与名称节点通过远程过程调用进行沟通

      image-20231007205057155

    • 2.获取数据块信息:获取读取的数据块被保存在的数据节点位置信息,名称节点会把包含这个文件开始部分(文件可能包含很多块)的数据块位置信息返回

      image-20231007205234434

    • 3.客户端获得输入流,可以调用read函数读取数据,会根据数据节点距离客户端的远近进行排序,客户端拿到排序后的数据节点位置列表,选择距离客户端最近的数据节点建立连接,读数据

      image-20231007205643646

      1. 将数据从数据节点读取到客户端

      image-20231007205809929

    • 5.因为文件可能分为多个块,需要读取这个文件其他块的信息,通过ClientProtocal.getBlockLocations()查找下一数据块的位置

      image-20231007205935512

    • 6.然后又读取该块节点的数据,又关闭输入流;一直循环直到完成这个文件所有块的读取

      image-20231007210021115

    • 7.最后关闭文件

      image-20231007210205703

3.5.2 HDFS的写数据过程
  • 1.创建文件请求,实例化Distributed FileSystem;创建FSDataOutputStream,其内部封装DFSOutputStream,与名称节点打交道

    image-20231007210435519

    1. 输出流通过远程过程调用rpc,让名称节点在文件系统命名空间中新建一个文件,名称节点会检查文件是否存在,以及客户端是否有权限创建这个文件,若是通过,则该名称节点会创建这个文件

      image-20231007211004578

  • 3.写入数据

    将整个数据分包:并将其放入DFSOutputStream的内部队列中去,DFSOutputStream向名称节点申请保存这个数据包的数据节点

image-20231007211518227

    1. 写入数据包

      流水线复制:将数据包复制到第一个节点,再由第一个节点复制到第二个节点,形成流水线复制

      image-20231007211633020

  • 5.接受确认包

    • 确认包由最后一个数据节点传到前一个数据节点,一直往前传,客户端收到确认信息,说明全都写完

    image-20231007211957114

  • 6.最后关闭文件

    image-20231007211943223

3.6 HDFS编程实战

见:HDFS编程实践(Hadoop3.3.5)_厦大数据库实验室博客 (xmu.edu.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/151530.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记——C++高性能编程(一至三)

《C高性能编程》作者:费多尔.G.皮克斯 版本:2022年11月第1版 第一章.性能基础 描述了吞吐量,功耗,实时应用性能的含义。 阐述了“虽然几乎不可能提前预测最佳优化,但是可以确定某些设计决策将使后续优化变得非常困难…

C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)

目录 前言 一、system V IPC对象图解 1.流程图解: ​编辑 2.查看linux内核中的ipc对象: 二、消息队列 1.消息队列的原理 2.消息队列相关的API 2.1 获取或创建消息队列(msgget) 实例代码如下: 2.2 发送消息到消…

单元测试该怎么写

单元测试对于开发人员来说很熟悉,各种语言都提供了单元测试的框架,用于自动化执行单元测试并生成测试报告。它通常提供了一组API和工具,使开发人员能够编写和运行测试用例,比较预期行为和实际行为之间的差异,并准确地识…

多线程锁-synchronized字节码分析

从字节码角度分析synchronized实现 javap -c(v附加信息) ***.class 文件反编译 synchronized同步代码块 >>>实现使用的是monitorenter和monitorexit指令 synchronized普通同步方法 >>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置&#xf…

【数据结构-二叉树 九】【树的子结构】:树的子结构

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【子结构】,使用【二叉树】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

不同数据类型在单片机内存中占多少字节?

文章目录 前言一、不同编译器二、C51* 指针型 三、sizeof结构体联合体 前言 在C语言中,数据类型指的是用于声明不同类型的变量或者函数的一个广泛的系统。变量的类型决定了变量存储占用的空间 一、不同编译器 类型16位编译器大小32位编译器大小64位编译器大小char…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务…

软件设计原则 1小时系列 (C++版)

文章目录 前言基本概念 Design Principles⭐单一职责原则(SRP) Single Responsibility PrincipleCode ⭐里氏替换原则(LSP) Liskov Substitution PrincipleCode ⭐开闭原则(OCP) Open Closed PrincipleCode ⭐依赖倒置原则(DIP) Dependency Inversion PrincipleCode ⭐接口隔离…

【抢先体验】开通使用 ChatGPT 语音版功能保姆级教程

大家好,我是苍何,一个土木转码的非典型程序员,也是一名技术管理者,同时也是 AI 应用的探索者。今天在视频号上看到和 ChatGPT 语音对话的视频,其声音的真实感太让人震撼了,于是也想去抢先体验一下 ChatGPT …

Centos7安装MongoDB7.xxNoSQL数据库|设置开机启动(骨灰级+保姆级)

一: mongodb下载 MongoDB 社区免费下载版 MongoDB社区下载版 [rootwww tools]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.1.0-rc4.tgz 二: 解压到指定目录 [rootwww tools]# mkdir -p /usr/local/mongodb [rootwww tools]# tar -zxvf mongodb-…

选择适合普通公司的项目管理软件

不管是打工人还是学生党都适合使用Zoho Projects项目管理软件。利用项目概览功能,将整体项目尽收眼底,作为项目管理者,项目日程、进度都可见,Zoho Projects项目管理APP助推项目每一环节的进展,更便于管理者设计项目的下…

ThingsBoard如何自定义tcp-transport

1、概述 很久没有更新了,一直忙于其他的事情,最近去搞了一个在ThingsBoard中自定义一个tcp-transport,用于连接使用tcp长连接的设备,目前使用tcp和mqtt协议连接服务端的设备还是很多,ThingsBoard的PE版提供了Integration是可以实现tcp的接入,但是CE版是没有提供接入tcp长…

【MySQL】基本查询(二)

文章目录 一. 结果排序二. 筛选分页结果三. Update四. Delete五. 截断表六. 插入查询结果结束语 操作如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chi…

IO 之 操作properties属性文件

propreties文件: properties文件是一种用于存储配置信息的文本文件,通常以“.properties”为文件扩展名。它是一种简单的键值对格式,用于保存应用程序的配置参数。 在properties文件中,每一行都包含一个键值对,键和值…

HTTPS工作过程,国家为什么让http为什么要换成https,Tomcat在MAC M1电脑如何安装,Tomcat的详细介绍

目录 引言 一、HTTPS工作过程 二、Tomcat 在访达中找到下载好的Tomcat文件夹(这个要求按顺序) zsh: permission denied TOMCAT的各部分含义: 引言 在密码中一般是:明文密钥->密文(加密) &#xff…

Spring源码解析——IOC属性填充

正文 doCreateBean() 主要用于完成 bean 的创建和初始化工作,我们可以将其分为四个过程: 最全面的Java面试网站 createBeanInstance() 实例化 beanpopulateBean() 属性填充循环依赖的处理initializeBean() 初始化 bean 第一个过程实例化 bean在前面一篇…

复旦大学EMBA:揭秘科创企业,领略未来战略!

智能制造,国之重器。作为制造强国建设的主攻方向,智能制造的发展水平关系到我国未来制造业在全球的地位与影响力。发展智能制造,是加快建设现代化产业体系的重要手段,提升供给体系适配性的有力抓手,也是建设数字中国的…

【C++设计模式之状态模式:行为型】分析及示例

简介 状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,看起来就像是改变了其类。状态模式将对象的状态封装成不同的类,并使得对象在不同状态下有不同的行为。 描述 状态模式通过…

Android用户登录与数据存储:从权限请求到内外部存储的完整实践【完整实践步骤、外部存储、内部存储】

步骤 1: 登录页面布局 在 MainActivity 中实现用户登录功能&#xff0c;首先创建一个布局文件 activity_main.xml 包含用户名和密码的输入字段以及登录按钮。 <!-- activity_main.xml --> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/andr…

Qt之实现圆形进度条

在Qt自带的控件中&#xff0c;只有垂直进度条、水平进度条两种。 在平时做页面开发时&#xff0c;有些时候会用到圆形进度条&#xff0c;比如说&#xff1a;下载某个文件的下载进度。 展示效果&#xff0c;如下图所示&#xff1a; 实现这个功能主要由以下几个重点&#xff1a…