HDFS存储魔法解析:在二次元世界中跃动的数据冒险

news2024/11/24 9:40:17

文章目录

  • 版权声明
  • 零 引·缘起
  • 一 存储原理
  • 二 fsck命令
    • 2.1 副本块数量的配置
      • 2.1.1 全局设置方式
      • 2.1.2 临时设置方式
    • 2.2 检查文件的副本数
    • 2.3 block大小和复制策略配置
  • 三 NameNode元数据
    • 3.1 edits文件
    • 3.2 fsimage文件
    • 3.3 NameNode元数据管理维护
    • 3.4 元数据合并控制参数
    • 3.5 Checkpoint
    • 3.6 恢复和元数据操作
    • 3.7 SecondaryNameNode的作用
  • 四 HDFS数据的学读写流程
    • 4.1 数据写入流程
    • 4.2 数据读取流程
    • 4.3 读写流程总结

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

零 引·缘起

  • 在广袤的二次元世界中,一个神奇的存储魔法正在悄然运行,它就是 Hadoop Distributed File System(HDFS)。就像是一个巨大的魔法书库,HDFS 将大文件切成小块,然后将它们分散存放在不同的魔法书架上。每一本小块书都有多个魔法使在不同的书架上保留备份,确保即使魔法书架之一出现了问题,也能从其他书架上找回同样的知识宝藏。

  • 这个神奇的存储魔法是如何实现的呢?

第一步:魔法切割

  • 在魔法图书馆的中央,有一个超级大法师,称之为 NameNode。他是整个魔法图书馆的管理者,他会将每本大书切成相同大小的小块,让它们更容易管理。这些小块被称为魔法书页,每一页的大小是固定的,通常是128MB。这样一来,大书可以被分成许多小块,便于存储和传输。

第二步:魔法复制

  • 为了保证魔法书不会因为某个书架的崩溃而丢失,每一本魔法书页都会被复制到其他不同的书架上。这些复制品被称为魔法镜像。HDFS 默认会将每本书页的魔法镜像复制到三个不同的书架上,这样即使有一个书架受到了邪恶力量的袭击,还有两个书架保持着它的魔法知识。

第三步:魔法映射

  • NameNode 还会创建一个魔法地图,将每本魔法书页与它们的魔法镜像的位置关联起来。这样,无论你从哪里进入魔法图书馆,NameNode 都可以帮助你快速找到需要的魔法知识。

第四步:魔法管理

  • 每本魔法书页都有自己的守护精灵,称为数据节点。它们负责在书架上保管魔法书页和镜像,并定期向 NameNode 报告它们的状态。如果有一本魔法书页丢失了,数据节点会通过其他镜像或者新的魔法书页来恢复它,保证魔法知识不会被损坏。

就这样,在这个充满魔法与冒险的二次元世界里,HDFS 用它的存储魔法保护着宝贵的数据宝藏。无论是大魔法书还是小魔法页,它们都在这个神奇的存储系统中得到了安全而稳定的保护。一起加入我们的数据冒险队伍,探索这个充满奇迹和挑战的魔法世界吧!

一 存储原理

  • 分布式存储:数据存入HDFS是分布式存储,即每一个服务器节点,负责数据的一部分。
  • Hadoop Distributed File System (HDFS) 是 Hadoop 生态系统中的分布式文件系统,它将大文件切分成多个块,并在集群中的不同节点上进行存储。每个块都被复制到多个节点以提供容错性。
    在这里插入图片描述
  • 数据在HDFS上是划分为一个个Block块进行存储。
  • 为解决文件大小不一的问题,文件的最小存储单元设置为block块,大小为256MB
    在这里插入图片描述
  • 在HDFS上,数据Block块可以有多个副本,提高数据安全性
  • 为解决文件丢失问题,提高安全性。将每个Block块备份放入不同的服务器,默认备份数为2
    在这里插入图片描述

二 fsck命令

2.1 副本块数量的配置

2.1.1 全局设置方式

  • HDFS文件系统的数据安全,是依靠多个副本来确保的,设置文件上传到HDFS中拥有的副本数量,可以在hdfs-site.xml中配置如下属性:
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
  • 这个属性默认是3,一般情况下,无需主动配置(除非需要设置非3的数值)
  • 如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml文件,并设置此属性

2.1.2 临时设置方式

  • 除了配置文件外,还可以在上传文件的时候,临时决定被上传文件以多少个副本存储
# 临时设置其副本数为2
hadoop fs -D dfs.replication=2 -put test.txt /tmp/
  • 对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令
# 指定path的内容将会被修改为2个副本存储
# -R选项可选,使用-R表示对子目录也生效
hadoop fs -setrep [-R] 2 path

2.2 检查文件的副本数

  • 使用hdfs提供的fsck(file system check)命令来检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
  • fsck:可以检查指定路径是否正常
  • -files:可以列出路径内的文件状态
  • -files -blocks : 输出文件块报告(有几个块,多少副本)
  • -files -blocks -locations: 输出每一个block的详情

2.3 block大小和复制策略配置

  1. 块大小(Block Size): HDFS 将大文件切分为固定大小的块,通常情况下默认块大小为 256MB(可以通过配置进行修改)。块大小的选择会影响到文件存储的效率和性能。较小的块大小可能会导致存储开销增加,而较大的块大小可能会导致数据的粒度不够细,影响并行处理能力。
    • 配置项:dfs.blocksize,默认值为 256MB
    • 示例配置,设置为512MB:
    <property>
    	<name>dfs.blocksize</name>
    	<value>536870912</value>
    </property>
    
  2. 块复制策略(Replication Placement Policy): HDFS 支持多种块复制策略,用于确定块的复制位置。默认策略是随机选择不同的机架上的节点进行复制,以增加容错性和性能。
    • 可以选择使用不同的策略,如 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault 或自定义的策略。
    • 配置项:dfs.block.replicator.classname,默认值为 org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault
    • 示例配置:
<property>
	<name>dfs.block.replicator.classname</name>
	<value>org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicyDefault</value>
</property>

三 NameNode元数据

  • 在hdfs中,文件是被划分了一堆的block块,Hadoop使用namenode记录和整理文件和block块的关系
    在这里插入图片描述
  • NameNode基于一批edits和一个fsimage文件的配合完成整个文件系统的管理和维护

3.1 edits文件

  • Edit Logs(编辑日志): 编辑日志记录了所有文件系统的变更操作,比如文件的创建、删除、重命名等。编辑日志保留了文件系统的完整修改历史,是文件系统的操作日志。
  • edits文件是流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block
    在这里插入图片描述

  • edits文件的合并
    在这里插入图片描述

3.2 fsimage文件

  • File System Image(文件系统镜像): 文件系统镜像是一个快照,它表示文件系统的当前状态,包括所有文件、目录、权限、属性等信息。
  • 文件系统镜像在某个时间点捕获了文件系统的元数据信息,它是静态的。
  • 将全部的edits文件,合并为最终结果,即可得到一个FSImage文件
    在这里插入图片描述

3.3 NameNode元数据管理维护

NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。

  1. 每次对HDFS的操作,均被edits文件记录
  2. edits达到大小上线后,开启新的edits记录
  3. 定期进行edits的合并操作
    • 如当前没有fsimage文件, 将全部edits合并为第一个fsimage
    • 如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage
  4. 重复123流程

3.4 元数据合并控制参数

  • 对于元数据的合并,是一个定时过程,基于:
    • dfs.namenode.checkpoint.period,默认3600(秒)即1小时
    • dfs.namenode.checkpoint.txns,默认1000000,即100W次事务
      只要有一个达到条件就执行。
  • 检查是否达到条件,默认60秒检查一次,基于:dfs.namenode.checkpoint.check.period,默认60(秒),来决定

3.5 Checkpoint

  • Checkpoint(检查点): 为了防止编辑日志无限增长并提高元数据的恢复效率,NameNode 会定期将当前的编辑日志与文件系统镜像合并,生成一个新的文件系统镜像。这个过程被称为检查点。
  • 检查点包含了前一个文件系统镜像和从上一个检查点之后的所有编辑日志记录。

3.6 恢复和元数据操作

  • 恢复和元数据操作: 当 NameNode 启动时,它会加载最近的检查点和相关的编辑日志。
  • 首先,它加载检查点,使其成为内存中的文件系统状态。然后,它会逐一应用之后的编辑记录,将文件系统状态还原到最新状态。这样,NameNode 可以确保文件系统的元数据在启动后是一致的。

3.7 SecondaryNameNode的作用

在这里插入图片描述

  • Secondary NameNode(次要名称节点)是 Hadoop Distributed File System(HDFS)中的一个辅助组件,它的主要作用是帮助 NameNode 进行部分元数据的维护和检查点(Checkpoint)的生成,以减轻 NameNode 的负载并提高系统的可用性。尽管名字中带有 “Secondary”,但 Secondary NameNode 并不是 NameNode 的备用副本。

Secondary NameNode 的作用包括以下几个方面:

  1. 检查点生成: HDFS 中的 NameNode 在运行过程中会不断地记录文件系统的编辑操作(edits)到编辑日志中。为了避免编辑日志过大并提高元数据的恢复效率,Secondary NameNode 定期从 NameNode 复制文件系统的编辑日志(edits)和文件系统镜像(fsimage),然后将这些信息合并,生成一个新的文件系统镜像。这个合并的过程就是检查点生成。

    • 生成的检查点包括了最近的文件系统镜像和之后的编辑操作,而不包括之前的编辑操作。检查点的生成减少了启动时恢复编辑日志的工作量,提高了系统的性能。
  2. 减轻 NameNode 负载: 在检查点生成的过程中,Secondary NameNode 会执行一些元数据操作,比如合并文件系统镜像和编辑日志。这些操作可以减轻 NameNode 的负载,因为原本这些操作需要由 NameNode 自己执行。通过将这些操作委托给 Secondary NameNode,可以使 NameNode 更专注于处理实际的文件系统请求,提高了系统的响应能力。

  3. 辅助故障恢复: 在某些情况下,如果 NameNode 发生了故障并需要从备份恢复,Secondary NameNode 可以作为辅助工具。虽然 Secondary NameNode 本身不能替代 NameNode 运行,但它可以提供一个合并后的文件系统镜像,使恢复过程更加高效。

  • 注意,尽管 Secondary NameNode 在检查点生成过程中能够减轻 NameNode 的负载,但它并不是 NameNode 的备用副本。在 Hadoop 2.x 版本之后,引入了 High Availability(高可用性)功能,允许使用两个或多个真正的活动 NameNode 实例,以提供更高的可用性和容错性。

四 HDFS数据的学读写流程

4.1 数据写入流程

在这里插入图片描述

  1. 客户端向NameNode发起请求
  2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
  3. 客户端向指定的DataNode发送数据包
  4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
  5. 如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4
  6. 写入完成客户端通知NameNode,NameNode做元数据记录工作

关键信息点:

  • NameNode不负责数据写入,只负责元数据记录和权限审批
  • 客户端直接向1台DataNode写数据,这个DataNode一般是离客户端最近(网络距离)的那一个
  • 数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)

4.2 数据读取流程

在这里插入图片描述

  1. 客户端向NameNode申请读取某文件
  2. NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
  3. 客户端拿到block列表后自行寻找DataNode读取即可

  • 关键点:
    1. 数据同样不通过NameNode提供
    2. NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的。这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取

4.3 读写流程总结

  1. 对于客户端读取HDFS数据的流程中
    • 不论读、还是写,NameNode都不经手数据,均是客户端和DataNode直接通讯
    • 不然对NameNode压力太大
  2. 写入和读取的流程,简单来说就是:
    1. NameNode做授权判断(是否能写、是否能读)
    2. 客户端直连DataNode进行写入(由DataNode自己完成副本复制)、客户端直连DataNode进行block读取
    3. 写入,客户端会被分配找离自己最近的DataNode写数据
    4. 读取,客户端拿到的block列表,会是网络距离最近的一份
  3. 网络距离
    • 最近的距离就是在同一台机器
    • 其次就是同一个局域网(交换机)
    • 再其次就是跨越交换机
    • 再其次就是跨越数据中心
    • HDFS内置网络距离计算算法,可以通过IP地址、路由表来推断网络距离

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

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

相关文章

热门歌曲的伴奏--源代码

目录 使用方法 《起风了》歌词伴奏 《起风了》歌词 《生日歌》歌词伴奏 《生日歌》歌词 《童话》歌词伴奏 《童话》歌词 《光阴的故事》歌词伴奏 《光阴的故事》歌词 ​《千本樱》歌词伴奏 《千本樱》中文歌词 《平凡之路》歌词伴奏 《平凡之路》歌词 《孤勇者》…

Linux-在Ubuntu搭建ftp服务器

By: Ailson Jack Date: 2023.08.20 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/151.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

EndNote(一)【界面+功能介绍】

EndNote界面&#xff1a; 顶上小图标的介绍&#xff1a; ①&#xff1a;同步 ②&#xff1a;分享 ③&#xff1a;检索全文 对于第三个&#xff08;检索全文的功能&#xff09;&#xff1a; &#xff08;不做任何操作的情况下的界面&#xff0c;检索全文的按钮是灰的&…

详解:Mybatis参数获取和动态SQL以及分页功能

详解&#xff1a;Mybatis参数获取和动态SQL以及分页功能 前置准备项目结构在pom文件导入依赖创建properties配置文件创建Mapper接口创建Mapper映射文件SqlSession对象创建对应的表在数据库中实体类 SQL语句中的参数获取单个参数两个参数比较参数找不到的情况单个参数&#xff0…

C语言小练习(一)

&#x1f31e; “人生是用来体验的&#xff0c;不是用来绎示完美的&#xff0c;接受迟钝和平庸&#xff0c;允许出错&#xff0c;允许自己偶尔断电&#xff0c;带着遗憾&#xff0c;拼命绽放&#xff0c;这是与自己达成和解的唯一办法。放下焦虑&#xff0c;和不完美的自己和解…

自动方向识别式 TXB型电平转换芯片

大家好,这里是大话硬件。 在上一篇文章分析了LSF型的电平转换芯片,LSF型电平转换芯片最常见是应用在I2C总线上。I2C为OD型总线,LSF使用时增加电阻。 对于不是OD型总线的电平转换,比如UART,SPI,普通GPIO口信号,这些信号在进行双向电平转换使用什么样的芯片呢? 从上面…

Python写一个创意五子棋游戏

前言 在本教程中&#xff0c;我们将使用Python的Tkinter库和OpenAI的GPT-3模型构建一个简单的对话弹窗软件&#xff0c;用于与老板进行对话。我们将介绍如何创建图形用户界面、集成OpenAI API以生成回复&#xff0c;并提供一些进一步的扩展和优化建议。 &#x1f4dd;个人主页→…

岩土工程安全监测隧道中使用振弦采集仪注意要点?

岩土工程安全监测隧道中使用振弦采集仪注意要点&#xff1f; 岩土工程的安全监测是非常重要的&#xff0c;它可以帮助工程师及时发现可能存在的问题&#xff0c;并及时解决&#xff0c;保障施工进度以及施工质量&#xff0c;保障工程的安全运行。其中&#xff0c;振弦采集仪是…

Liunx系统编程:进程信号的概念及产生方式

目录 一. 进程信号概述 1.1 生活中的信号 1.2 进程信号 1.3 信号的查看 二. 信号发送的本质 三. 信号产生的四种方式 3.1 按键产生信号 3.2 通过系统接口发送信号 3.2.1 kill -- 向指定进程发送信号 3.2.2 raise -- 当自身发送信号 3.2.3 abort -- 向自身发送进程终止…

Docker修改daemon.json添加日志后无法启动的问题

docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升…

视频转云存的痛点

现在运营商体系里面&#xff0c;有大量的视频转云存储的需求&#xff0c;但是视频云存储有一个比较大的痛点&#xff0c;就是成本&#xff01; 成本一&#xff1a;存储成本&#xff1b; 我们以1000路2M视频转云存&#xff0c;存储时间为90天为例&#xff08;B端存储时间有时候…

明星都偏爱的多燕瘦活酵素,不含非法添加事件更健康

不少瘦身人士信奉“运动就能瘦”的准则&#xff0c;每天坚持高强度运动&#xff0c;一段时间后却发现&#xff0c;不仅体重没有下降&#xff0c;甚至整个人看起来都变得更加壮实了&#xff0c;这是为什么&#xff1f; 首先&#xff0c;运动是分为减脂和增肌两种类型的&#xff…

我的创作纪念日 - CSDN创作者4周年,感谢平台,未来可期!

CSDN创作者4周年&#xff0c;感谢平台&#xff0c;未来可期&#xff01; 不知不觉已经加入这个平台4周年了&#xff0c;恍惚昨日之景&#xff0c;有些事情&#xff0c;你不在意&#xff0c;平台却已经写好了程序来给它画上了标记&#xff0c;思想无线&#xff0c;故程序也无边…

Vulnhub靶机系列 Hackadmeic.RTB1

系列&#xff1a;Hackademic&#xff08;此系列共2台&#xff09; 难度&#xff1a;初级 信息收集 主机发现 netdiscover -r 192.168.80.0/24端口扫描 nmap -A -p- 192.168.80.143访问80端口 使用指纹识别插件查看是WordPress 根据首页显示的内容&#xff0c;点击target 点击…

(已解决)PySpark : AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘

AttributeError: ‘DataFrame’ object has no attribute ‘iteritems’ 原因在使用SparkSession对象中createDataFrame函数想要将pandas的dataframe转换成spark的dataframe时出现的 因为createDataFrame使用了新版本pandas弃用的iteritems()&#xff0c;所以报错 解决办法&…

webSocket 开发

1 认识webSocket WebSocket_ohana&#xff01;的博客-CSDN博客 一&#xff0c;什么是websocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽…

这些Linux基础命令你总得掌握吧

B站|公众号&#xff1a;啥都会一点的研究生 写在前面 很多深度学习/机器学习/数据分析等领域&#xff08;或者说大多数在Python环境下进行操作的领域&#xff09;的初学者入门时是在Windows上进行学习&#xff0c;也得益于如Anaconda等工具把环境管理做的如此友善 但如果想在…

阿里网盘海外使用速度很慢

小虎最近在HK使用阿里云盘&#xff0c;速度突然变得很慢&#xff0c;但是百度的没问题。查了发现是阿里的DNS做的不好&#xff0c;所以换了一个DNS速度就上来了。 解决方案 在这个网站&#xff1a;[原创工具] DNS优选(挑选最合适的DNS服务器,拒绝DNS劫下载DNS推荐工具&#x…

如何取消订阅IEEE membership的email

最近小虎开了一个IEEE Student Member&#xff0c;邮箱都快被IEEE给爆箱了。所以想办法取消订阅其邮件&#xff0c;但是保留其member身份。 方法 在profile界面选择communication preferences and policies, Uncheck所有communications&#xff0c;选择I only want to recei…

Flink内核源码解析--Flink中重要的工作组件和机制

Flink内核源码 1、掌握Flink应用程序抽象2、掌握Flink核心组件整体架构抽象3、掌握Flink Job三种运行模式4、理解Flink RPC网络通信框架Akka详解5、理解TaskManager为例子&#xff0c;分析Flink封装Akka Actor的方法和整个调用流程6、理解Flink高可用服务HighAvailabilityServ…