哇!这就是HDFS(哇!这就是光遇吗? 好温馨啊好漂亮啊用英语怎么说)
wxin55 2024-11-11 14:42 21 浏览 0 评论
好消息!为了庆祝小史获得大厂offer,他约吕老师和小伙伴们一起吃饭;
为了照顾每个人的胃口,小史让大家自行点菜,自己也是忙里忙外的招呼;
服务员面对几桌子,忘记哪些桌子上了哪些菜,小史在旁边提醒......
【饭后】
【分布式文件系统】
小史:这个简单,文件系统就是用来管理文件的一个系统。
【文件切块】
小史:大文件被切成若干块,存储在若干机器上,嫁接统一接口。
【潜在问题】
吕老师:这样效率很低,还存在个问题就是,万一机器坏了,那文件访问不了怎么办?
吕老师:这样,你计算一下,如果我们分布式系统有1000台电脑运作,每台电脑出现问题的平均概率是0.1%,那么,运行一天这个系统出问题的概率有多大呢?
吕老师:当然存在这个问题,分布式系统是相当复杂的。
【hdfs架构】
吕老师:举个例子,假设每个桌子都是DataNode,每道菜是一个切块,服务员是client,而你就是NameNode。
DataNode的功能是存储数据,NameNode是一名管理者角色,NameNode明确DataNode的存储信息,client属于统一操作接口。
小史:我明白了,我会告诉服务员哪桌上什么菜。就类似于client执行查询文件任务的时候,会在NameNode查询文件在哪个DataNode上。
小史:那就去别的桌上吃,那么,hdfs会将数据保存备份吗?
吕老师:没错,hdfs在写数据的时候,会将其写入多个DataNode中,保证数据安全不丢失。
【hdfs读写流程】
小史:好的,我认为读取文件分为以下步骤:
小史:文件写入流程分为以下步骤:
【SecondNameMode】
小史:文件的元数据很重要,我们可以持久化到硬盘上,每次重启之后再从硬盘把数据恢复到内存。
小史:是应该考虑这个问题,但写硬盘需要找到文件元信息的具体位置,效率不是很高。
吕老师:是的,这样操作效率不高,所以hdfs不这样执行。
hdfs会把操作日志记录下来,存在editlog中,下次重启的时候,先加载editlog,回访日志,达到重启前的状态。
小史:NameNode长时间运行,editlog就会很大,导致重启时间变长。
吕老师:没错,但SecondNameNode,就是用来解决这个问题。
我们知道,NameNode会回放editlog,但不会从头回放,它会加载文件元数据的内存快照,在此基础上回放editlog,随后会立马清空editlog,再把当前文件元数据的内存状态写入fsimage,方便下一次加载。
【hdfs的HA】
小史:吕老师,万一NameNode奔溃了,会有SecondNameNode来接替工作吗?
吕老师:不是的,其实,SecondNameNode是不能替代NameNode的,万一NameNode奔溃了,整个系统也会随之奔溃。
吕老师:没错,所以hadoop1.x有本身的不稳定性。但是hadoop2.x之后,可以在集群中多配置NameNode,就会避免此类问题。
吕老师:这个问题和系统的设计理念有关,虽然hadoop1.x存在一个NameNode单点,但是它大大简化了系统的复杂度,并且数据量在一定范围内时,NameNode并没有这么容易挂,所以能够被接受的。但是随着数据量越来越大,这个单点始终是个隐患,所以设计者不得不升级为更加复杂的hadoop2.x,来保证NameNode的高可靠。
吕老师:两个NameNode只能有一个是活跃状态active,另一个是备份状态standby。以下为两个NameNode的架构图。
吕老师:因为active的NameNode奔溃之后,standby的NameNode要马上接替它,所以它们的数据需要保持一致,在写入数据的时候,两个NameNode内存中都要记录数据的元信息,并保持一致。这个JournalNode就是用来在两个NameNode中同步数据的,并且standby NameNode实现了SecondNameNode的功能。
吕老师:active NameNode有操作之后,它的editlog会被记录到JournalNode中,standby NameNode会从JournalNode中读取到变化并进行同步,同时standby NameNode会监听记录的变化。
【hdfs优缺点】
小史:可以,hdfs可以存储海量数据,并且高可用的,数据有备份,不存在丢失问题。
吕老师:这都是小事儿,不过,你想想如果我们吃饭点很多小分量的菜,你还会记得哪桌点哪些吗?
小史:我明白了,每个小文件都有元信息,它们都存在NameNode里面,可能造成NameNode的内存不足?
小史:如果要随机写,由于文件被切块,需要先找到内容在哪个块,然后读入内存,修改完成之后再更新所有备份,由于一个块并不小,这个效率会很低。
【笔记】
1、hdfs是一个分布式文件系统,简单理解就是多台机器组成的一个文件系统。
2、hdfs中有3个重要的模块,client对外提供统一操作接口,DataNode真正存储数据,NameNode协调和管理数据,是一个典型的master-slave架构。
3、hdfs会对大文件进行切块,并且每个切块会存储备份,保证数据的高可用,适合存储大数据。
4、NameNode通过fsimage和editlog来实现数据恢复和高可用。
5、hdfs不适用于大量小文件存储,不支持并发写入,不支持文件随机修改,查询效率大概在秒级。
相关推荐
- ES6中 Promise的使用场景?(es6promise用法例子)
-
一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...
- JavaScript 对 Promise 并发的处理方法
-
Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...
- Promise的九大方法(promise的实例方法)
-
1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...
- 360前端一面~面试题解析(360前端开发面试题)
-
1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...
- 前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?
-
Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...
- 最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式
-
看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...
- 前端分享-Promise可以中途取消啦(promise可以取消吗)
-
传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...
- 手写 Promise(手写输入法 中文)
-
前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...
- 什么是 Promise.allSettled()!新手老手都要会?
-
Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...
- 前端面试-关于Promise解析与高频面试题示范
-
Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...
- 宇宙厂:为什么前端离不开 Promise.withResolvers() ?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...
- Promise 新增了一个超实用的 API!
-
在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...
- 一次搞懂 Promise 异步处理(promise 异步顺序执行)
-
PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...
- Promise 核心机制详解(promise机制的实现原理)
-
一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...
- javascript——Promise(js实现promise)
-
1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- ES6中 Promise的使用场景?(es6promise用法例子)
- JavaScript 对 Promise 并发的处理方法
- Promise的九大方法(promise的实例方法)
- 360前端一面~面试题解析(360前端开发面试题)
- 前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?
- 最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式
- 前端分享-Promise可以中途取消啦(promise可以取消吗)
- 手写 Promise(手写输入法 中文)
- 什么是 Promise.allSettled()!新手老手都要会?
- 前端面试-关于Promise解析与高频面试题示范
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)