【大数据】三、HDFS 基础原理

news2024/9/20 1:20:39

HDFS

HDFS 是一种典型的分布式文件系统,但其不是唯一的分布式文件系统

HDFS 是一种新型的文件系统,不同于传统的文件系统,新型文件系统解决了传统文件系统存在的负载不均衡与网络瓶颈问题。

但归根结底、这些弊端都是由传统文件系统所存在的文件存储大小不均衡造成的:文件在拆分时导致某些磁盘利用率过高等等

注意:HDFS 选择使用 块机制 来解决这个问题,HDFS 中,每个块的大小为 128 MB

HDFS 中的块

我们在寻找分布式系统中的某一个文件时,会先在 NameNode 中寻找文件切开的块的位置和数量,再根据这些索引将文件取出来,故而如果将块分的太小,就会极大的增加寻址时间,这样会极大的降低效率。

元数据:每一个文件的名称、大小、存储位置等信息的合集,叫做元数据

另外,这个 HDFS 中的块也是可以配置的,我们进入 HADOOP 环境中的 share 目录中,这个目录中的文件都是 hadoop 中的配置信息

share 中的配置都是默认配置,我们在自行配置的时候一般在:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 四个文件中进行自己的自定义配置,hadoop 会先加载自己的默认配置,后加载自行添加的配置,这就会导致我们自行添加的配置将 hadoop 的配置覆盖掉,从而实现手动配置

首先将配置文件拷贝到 家 目录下

# 在 hadoop 的 share 目录下执行下面的操作:将目录中所有匹配的文件复制到 ~ 的根目录下
find -name "*-default.xml" -exec cp {} ~ \;

记得整理一下,创建一个新文件夹并将其全部移动到里面:

mkdir ...
mv *-default.xml ./default-conf

下面是一些配置文件的示例:

# hdfs-default.xml
# 这里的 dfs.blocksize 属性就代表 HDFS 中的块大小

<property>
  <name>dfs.blocksize</name>
  <value>134217728</value>		# 这里单位是字节
  <description>
      The default block size for new files, in bytes.
      You can use the following suffix (case insensitive):
      k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
      Or provide complete size in bytes (such as 134217728 for 128 MB).
  </description>
</property>

# 这里是块的存放位置,默认可以在 hdfs-site.xml 中找

<property>
  <name>dfs.datanode.data.dir</name>
  <value>file://${hadoop.tmp.dir}/dfs/data</value>
  <description>Determines where on the local filesystem an DFS data node
  should store its blocks.  If this is a comma-delimited
  list of directories, then data will be stored in all named
  directories, typically on different devices. The directories should be tagged
  with corresponding storage types ([SSD]/[DISK]/[ARCHIVE]/[RAM_DISK]) for HDFS
  storage policies. The default storage type will be DISK if the directory does
  not have a storage type tagged explicitly. Directories that do not exist will
  be created if local filesystem permission allows.
  </description>
</property>

HDFS 优点:

  1. 一个文件具有多个副本,具有高稳定性
  2. 适合做大数据集:GB、PB、TB 级的数据
  3. 一次性写入、多次读取;保证数据的一致性与安全性
  4. 构建成本低:可以构建在廉价机器上
  5. 基于 JAVA、多平台可移植
  6. 在多节点中动态的移动数据,以保证各节点的平衡
  7. Hadoop 具有可靠的存储与处理数据的能力

HDFS 缺点:

  1. HDFS 设计的初衷是处理大型数据集,其不适合做低延迟的数据处理
  2. 不适合小文件存取 找到小文件所需要的寻址时间十分长
  3. 不支持多用户对同一文件的写操作

HDFS体系结构

HDFS 采用主从结构来管理数据,该结构模型由四个部分组成:Client(客户端 )/ NameNode (名称节点)/ DataNode(数据节点) / SecondaryNameNode

其中 一个真正的 HDFS 集群主要包括一个 Namenode 和若干个 Datanode

其中 Namenode 主要负责管理统筹,Namenode 中维护着一个目录树用来记录 HDFS 中文件存储的结构,另外,其中还有 Namespace,Namespace维护着Datanode中文件的信息(某个文件存储在哪几个块中等),此外其也维护着文件名、权限、最后修改时间等信息,另外,其也持久化了 fsimage 和 edit 用于备份,防止数据丢失。

数据块中的数据是保存在 Linux 系统本地的,Datanode 在 Namenode 的统筹下进行数据块的创建、删除、复制等操作,而 Datanode 会定期向Namenode中发送数据(心跳数据包(间隔 3 秒)),用于向Namenode证明自己的存活性,对于长时间没有发送心跳包的节点,Namenode会将其判定为宕机,不对其分配 存储、修改、删除等操作

同时,Namenode也负责客户端的访问

fsimage 与 edit

fsimage 是映像文件,可以当做是系统目录的一个实时镜像,其会每间隔一段时间进行拍摄,edit log 相当于在镜像基础上的一个操作日志,其记录了镜像在拍摄之后的操作记录。

这样当我们发生宕机时,就可以利用 fsimage 先拉取一个镜像,再加载 edit log 来完全恢复宕机之前的状态

集群的启动过程

集群启动时内存为空,Namenode 会根据 fsimage 和 edit log 加载内容,加载完成后,Datanode 为安全模式,此时不能进行任何的操作,等待 Datanode 心跳包传入 99.9% 时,进入正常模式,开始正常操作

edit log 会在

  • 手动滚动
  • 正在写入的 editlog 大小满 64M
  • 操作到达 100 万次
  • 设定的时间到了(默认一小时)

时滚动一次,也就是创建新的 edit log

而:fsimage 会在

  • Namenode 启动并加载镜像文件与编辑日志时产生
  • SecondaryNamenode 生成的 fsimage.checkpoint 替换 fsimage 时重新生成

心跳机制

HDFS 中的 Namenode 不会因为一次两次没有收到心跳包就判定其死亡,而是会在两次重试时间(默认5分钟)和10 次心跳接收时间(每次 3 秒)后再被判定为宕机

Secondary 的主要作用是辅助 Namenode 进行 fsimage 和 edit log 的结合,加快安全模式的退出,提高程序运行效率

在触发检查点机制后(事物操作达到 100 W 次、edit log 大小达到 64M、edit 时间达到了 1 小时)

  1. Secondarynamenode请求 Namenode 停止当前正在使用的 edit log
  2. Secondarynamenode 创建新的 edit log 给Namenode使用
  3. Secondarynamenode 通过 HTTP 协议获取最新的 fsimage 和刚刚停止的 edit log
  4. Secondarynamenode 对 fsimage 和 edit log 进行合并,最终生成一个 fsimage.ckpt 文件(示例:fsimage_56.ckpt),也就是通过检查点机制新创建的 fsimage 文件,将这个文件通过 HTTP 协议传给 Namenode,Namenode 将这个文件更名为 fsimage_56,也就是去掉检查点后缀,之后当做最新的 fsimage 文件使用

HDFS 读数据

在这里插入图片描述

  1. HDFS Client 发送读数据的请求(通过 open() 创建一个 DistributeInputStream):
  2. Namenode 根据 HDFS Client 提供的文件在对应的目录树位置找到合适的位置,判断该位置是否存在对应的文件,以及判断用户是否有权限获取该文件
  3. Namenode 会返回目标文件的元数据,并作为一个FSDataInputStream 对象返回 此处注意:这个对象包含以下信息:目标文件的所有块的位置,以及每个块分布在的 Datanode,并按照能够最快获取 Datanode 的速度进行排序,以让 HDFS Client 能够在一开始就获取到能够最快获取所有文件的速度。
  4. HDFS Client 会找到对应的 Datanode 并从中读取数据,将读到的数据返回给本地文件,并依次将读到的块中的内容向文件的末尾添加。

若在读取文件时 datanode 发生错误的情况,则会选取第二个备份的机器中搜寻对应的 内容

HDFS 写数据

在这里插入图片描述

  1. HDFS Client 先对需要上传的文件进行切块
  2. HDFS Client 调用 create() 方法 创建一个 DistributeFileSystem 对象,向 Namenode 请求创建文件
  3. Namenode 对文件进行检查,检查文件是否在当前目录存在以及对象是否在当前目录下具有上传的权限,若都成功,则会返回一个 FSDataOutputStream
  4. HDFS Client 利用这个 FSDataOutputStream 进行写入,同时的,Namenode 根据集群中心选出距离最近的三个 Datanode 机器
  5. HDFS Client 与最近的 Datanode 建立 pipeline 管道连接,Datanode 再与下一个需要保存副本的 Datanode 建立连接
  6. 之后进行数据发送,每次发送结束每个节点都会返回一个收到信息
  7. 发送完毕后,关闭所有管道

客户端是看不到正在写的块的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用matplotlib对list数据画曲线

平时有时候分析数据需要画一张如下较为完整的图&#xff0c;所以写个博文在有需要的时候过来快速粘贴下 import matplotlib.pyplot as plt# 两个示例列表 list_xl [0.219683, 0.217855, 0.214003, 0.211832, 0.211356, 0.210974, 0.210622, 0.210312, 0.210040, 0.209794,0.…

qt5-入门-国际化

参考&#xff1a; Qt 国际化(上)_w3cschool https://www.w3cschool.cn/learnroadqt/fwkx1j4j.html QT5实现语言国际化&#xff08;中英文界面动态切换&#xff0c;超详细&#xff09;_qt qevent::languagechange-CSDN博客 https://blog.csdn.net/m0_49047167/article/details/…

Mysql总结(附思维导图)

Mysql Mysql索引 使用 创建主键索引 在对应字段后指定primary_key&#xff1a;id int primary key 创建唯一索引 在对应字段后指定unique_key&#xff1a;name varchar(20) unique 创建普通索引 在创建表的最后&#xff0c;指定某列或某几列&#xff1a;index(name) 创建全…

vue前端解析jwt

vue前端解析jwt 我们可以用在线解析看解析的结果&#xff1a;https://www.lddgo.net/encrypt/jwt-decrypt 但是如果在前端需要解析token&#xff0c;拿到其中的权限信息&#xff0c;可以这样解决。 在线的&#xff1a; 完美解决&#xff1a; 代码&#xff1a; function par…

(MYSQL)数据库中排序与分页操作

排序&#xff1a; 使用ODER BY 语句&#xff08;在select语句的末尾&#xff09;进行排序其中&#xff1a; 加ASC 升序&#xff1b; 加DESC 降序&#xff1b; 排序举例&#xff1a; SELECT id,name,salary FROM employees ORDER BY id; 注&#xff1a;此时就是以id升序排列表…

【Flutter学习笔记】9.7 动画过渡组件

参考资料&#xff1a;《Flutter实战第二版》9.7 动画过渡组件 “动画过渡组件”指的是在Widget属性发生变化时会执行过渡动画的组件&#xff0c;其最明显的一个特征就是会在内部管理一个AnimationController。controller定义了过渡动画的时长&#xff0c;而animation对象的定义…

Hutool中的这些工具类,太实用了

前言 今天给大家介绍一个能够帮助大家提升开发效率的开源工具包:hutool。 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 Hutool的设计思想是尽量减少重复的定义…

SAP PM 维护计划参数详解

本文的主要目的是解释调度参数如何影响预防性维护中计划日期的计算——基于时 间的单周期计划。 调度参数&#xff1a; 我们直接在维护计划中维护单周期计划的调度参数&#xff0c;如下图 计划标识 是计算计划日期的依据&#xff1a; 时间&#xff1a; 月份的计算基础始终…

成为高效Java工程师的干货笔记

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技术交流群】 作为一名Java工程师&…

CSS字体图标

文章目录 1. 概念2. 阿里图标 iconfont2.1. 网址2.2. 使用方法2.3. 注意事项2.3.1. 原因 3. font-awesome 图标3.1. 网址3.2. 使用方法 1. 概念 本质就是一个字体&#xff0c;可以灵活修改它的样式&#xff0c;降低服务器请求的次数&#xff0c;同时相比图片更加清晰。 2. 阿…

IBM:《CEO生成式 AI行动指南利用生成式 AI推动变革--所需了解的事项和所需采取的行动》

2024年2月IBM分享《CEO生成式 AI行动指南利用生成式 AI推动变革》报告。在该报告中&#xff0c;讨论了成功转型所必不可少的基本领导素质&#xff0c;并展示了如何将这些技能应用于培养 AI 赋能的人才、发展 AI 赋能的业务&#xff0c;以及利用 AI 赋能的数据与技术。 报告提到…

【环境搭建和安装】thingsboard二次开发环境搭建

文章目录 1.安装JAVA2.安装maven环境3.安装nodeJS4.安装git环境5.安装npm依赖关系 提示&#xff1a; 1.我自己下载存放路径比较混乱&#xff0c;下载的文件尽量在一个新建的文件夹存放&#xff0c;目录全英更好。 2.环境是为了开源物联网平台&#xff0c;环境搭建和安装部署是成…

力扣刷题Days20-151. 反转字符串中的单词(js)

目录 1,题目 2&#xff0c;代码 1&#xff0c;利用js函数 2&#xff0c;双指针 3&#xff0c;双指针加队列 3&#xff0c;学习与总结 1&#xff0c;正则表达式 / \s /&#xff1a; 2&#xff0c;结合使用 split 和正则表达式&#xff1a; 1,题目 给你一个字符串 s &am…

【数据集】全球土地利用数据集:GRIPCmap

GRIPCmap数据概述 GRIPC&#xff08;Global rain-fed, irrigated, and paddy croplands&#xff09;论文介绍数据下载 参考 GRIPC&#xff08;Global rain-fed, irrigated, and paddy croplands&#xff09; 论文介绍 数据下载 下载地址-Index of /public/friedl/GRIPCmap/ …

mysql面试题以及答案

1 基础 1.1、MySQL有哪些数据库类型&#xff1f; 数值类型 有包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT&#xff0c;分别表示 1 字节、2 字节、3 字节、4 字节、8 字节的整数类型。 1&#xff09;任何整数类型都可以加上 UNSIGNED 属性&#xff0c;表示无符号整数。 …

做外贸soho 是最好的选择吗

前几日&#xff0c;见到一个创业的朋友又去找了一个单位上班&#xff0c;询问其原因&#xff0c;对方说不是没有客户&#xff0c;也不是没有回头客。 只是比起创业更重要的是一家老小的生存问题&#xff0c;他说家里有两个要吃奶粉的孩子&#xff0c;老婆也不能上班&#xff0…

【pycharm】作为Array查看出现数据无法显示问题(已解决)

【pycharm】作为Array查看出现数据无法显示问题&#xff08;已解决&#xff09; 当我们在调试代码的时候&#xff0c;需要对某个变量进行查看&#xff0c;就如同在matlab中&#xff0c;我们可以直接在工作区对某个变量进行双击查看矩阵变量的具体数值 在这里我遇到一个问题&am…

第十二届蓝桥杯省赛CC++ 研究生组-货物摆放

还是整数分解问题,注意n本身也是约数 #include <iostream> int main(){printf("2430");return 0; }#include <iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const ll n 2021041820210418LL…

深度学习之本地部署大模型ChatGLM3-6B【大模型】【报错】

文章目录 0.前言1.模型下载2.配置环境2.1 下载项目文件2.2 配置环境 3.开始推理4.总结 0.前言 本博客将介绍ChatGLM3-6B大模型在Ubuntu上的本地部署教程 1.模型下载 由于毛毛张的服务器服务无法科学上网&#xff0c;所以模型的相关文件必须现在本地下载好&#xff0c;再上传到…