Hadoop三大框架之HDFS

一、概述

  1. HDFS产生的背景及定义

  1. HDFS产生背景

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS是分布式文件管理系统中的一种

  1. HDFS定义

HDFS(Hadoop Distributed File System)是一个文件系统,用于存储文件,通过目录树来定位为文件。它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

使用场景:适合一次写入、多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

  1. HDFS优缺点

  • 优点

  1. 高容错性

  • 数据自动保存多个副本。通过增加副本的形式,提高容错性。

  • 某一个副本丢失以后,可以自动恢复。

  1. 适合处理大数据

  • 数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据

  • 文件规模:能够处理百万规模以上的文件数量,数量相当之大。

  1. 构建在廉价机器上,通过多副本机制,提高可靠性

  • 缺点

  1. 不适合低延时数据访问,比如无法处理毫秒级的存储数据。

  1. 无法高效的对大量小文件进行存储

  • 存储大量小文件会占用NameNode大量的内存来存储文件目录和块信息,而NameNode的内存是有限的。

  • 小文件存储的寻址时间会超过读取时间,违反HDFS的设计目标

  1. 不支持并发写入、文件随即修改

  • 一个文件只能有一个写,不允许多个线程同时写

  • 仅支持数据追加(append),不支持文件的随即修改

  1. HDFS组成架构

Namenode(nn)

就是master,是一个主管者、管理者

  • 管理HDFS的名称空间

  • 配置副本策略

  • 管理数据块(block)映射信息

Datanode

就是slave。namenode下达命令,datanode执行实际的操作

  • 存储实际的数据块

  • 执行数据块的读/写操作

Client

就是客户端。客户端是一个抽象的概念,无论是命令行还是通过API还是web界面来操作都是客户端

  • 文件切分。文件上传HDFS的时候,client将文件切分成一个个Block,然后进行上传

  • 与NameNode交互,获取文件的位置信息

  • 与DataNode交互,读取或写入数据

  • Client提供一些命令来管理HDFS,比如NameNode格式化

  • Client可以通过一些命令来访问HDFS,比如对HDFS增删改查操作

Secondary NameNode

并非NameNode的热备。当NameNode挂掉的时候,并不能马上替换NameNode并提供服务

  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode

  • 在紧急情况下,可辅助回复NameNode

  1. HDFS文件块大小

HDFS中的文件在物理上是分块存储 (Block)块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M

寻址时间为传输时间的1%时,则为最佳状态。因此,传输时间=10ms/0.01=1000ms=1s。而目前磁盘的传输速率普遍为100MB/s。

思考:为什么块的大小不能设置太小,也不能设置太大?
(1) HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置
(2) 如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

总结HDFS块的大小设置主要取决于磁盘传输速率

二、HDFS的读写流程

  1. HDFS写数据流程

在HDFS 写数据的过程中,NameNode 会选择离待上传数最近距离的 DataNode 接收数据。那么这个最近距离怎么计算呢?

节点距离:两个节点到达最近的共同祖先的距离总和。

写数据流程:

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

(2)NameNode返回是否可以上传。

(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。

(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。

(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

(6)dn1、dn2、dn3逐级应答客户端。

(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

  1. HDFS读数据流程

读取数据流程:

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

三、NN和2NN

硬盘和内存就像阴阳两极的对立,硬盘可靠但慢,内存快但不可靠。

开机启动:

将硬盘里的 edits_inprogress_001(编辑日志)和 fsimage(镜像文件)加载进内存。

客户端client发出操作请求:

1.新建一份空白的 edits_inprogress_002,用作后续的编辑日志写入。

2.将内存里的 edits_inprogress_001 改名为 edits_001,用作数据备份。

3.将操作请求内容写入 edits_inprogerss_002。

CheckPoint触发:(定时时间到/edits中的数据满了)

1.拷贝 edits_001 和 fsimage 到 2NN。

2.加载 edits_001 和 fsimage 到内存,合并生成结果命名为 fsimage.chkpoint。

3.拷贝 fsimage.chkpoint 到 NN。

4.将NN里的 fsimage.chkpoint 重命名为 fsimage ,覆盖掉原来的 fsimage。

NameNode被格式化之后,将在/opt/module/hadoop-3.1.3/data/tmp/dfs/name/current目录中产生如下文件:
fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION

(1) Fsimage文件:HDFS文件系统元数据的一个 永久性的检查点。其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
(2) Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
(3) seen_txid文件:保存的是一个数字,就是最后一个edits 的数字
(4) 每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。

四、Datanode工作原理

工作机制:

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

2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。

3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟30秒没有收到某个DataNode的心跳,则认为该节点不可用。

4)集群运行中可以安全加入和退出一些机器。

HeartBeat

超时时长的计算公式为:

timeout = 2 * heartbeat.recheck.interval + 10 *dfs.heartbeat.interval

默认的heartbeat.recheck.interval大小为5分钟dfs.heartbeat.interval默认为3秒

需要注意的是hdfs-site.xml配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。

所以,如果像下面的配置,总的超时时间为2*2+3*10=34秒

<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
</property>
 
<property>
    <name>heartbeat.recheck.interval</name>
    <value>2000</value>
</property>

五、HDFS重点

  1. HDFS文件块大小

  1. HDFS的shell操作

  1. HDFS的读写流程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高&#xff0c;这我可就不同意了&#xff1a; 程序员的薪资哪里是很高&#xff0c;而是非常高&#xff01;而会接私活的程序员更是能拿到更高的收入&#xff01;作为一个程序员&#xff0c;这些接私活的网站一定要收藏起来&#xff0c;让你在“八小时外…

ChatGPT transformer 5篇经典论文以及代码和解读

一次性读懂ChatGPT的技术演进路线&#xff0c;根据李沐老师推荐的5篇经典论文&#xff0c;整理了论文原文、论文解读、Github代码实现。 2017Transformer继MLP、CNN、RNN后的第四大类架构2018GPT使用 Transformer 解码器来做预训练2018BERTTransformer一统NLP的开始2019GPT-2更…

区块链概论

目录 1.概述 2.密码学原理 2.1.hash函数 2.2.签名 3.数据结构 3.1.区块结构 3.2.hash pointer 3.3.merkle tree 3.3.1.概述 3.3.2.证明数据存在 3.3.3.证明数据不存在 4.比特币的共识协议 4.1.概述 4.2.验证有效性 4.2.1.验证交易有效性 4.2.2.验证节点有效性 …

YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py

前言 在上一篇中&#xff0c;我们简单介绍了YOLOv5的配置文件之一 yolov5s.yaml&#xff0c;这个文件中涉及很多参数&#xff0c;它们的调用会在这篇 yolo.py 和下一篇 common.py 中具体实现。 本篇我们会介绍 yolo.py&#xff0c;这是YOLO的特定模块&#xff0c;和网络构建有…

python【selenium的环境配置】

selenium 1.环境配置 1&#xff09;在环境设置里面安装selenium第三方库 pip install --user selenium2&#xff09; from selenium.webdriver import Chrome# 创建谷歌 b Chrome() # 获取网页 b.get(http://www.baidu.com) # 防止自动关闭 input()3&#xff09;在此之前&…

Rancher系列文章-Rancher v2.6使用脚本实现导入集群

概述 最近在玩 Rancher, 先从最基本的功能玩起, 目前有几个已经搭建好的 K8S 集群, 需要批量导入, 发现官网已经有批量导入的文档了. 根据 Rancher v2.6 进行验证微调后总结经验. 1. Rancher UI 获取创建集群参数 访问Rancher_URL/v3/clusters/&#xff0c;单击右上角“Crea…

第07章_单行函数

第07章_单行函数 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某…

进程地址空间+环境变量

目录 环境变量 进程地址空间 理解虚拟地址空间 进程地址空间区域划分 虚拟内存和物理内存建立联系 深刻理解虚拟地址空间 环境变量 当我们需要使用一个物品的时候&#xff0c;首先要先找到这个物品。同样的&#xff0c;当要运行一个程序&#xff08;指令&#xff09;时&a…

大公司为什么禁止SpringBoot项目用Tomcat?

前言 在SpringBoot框架中&#xff0c;我们使用最多的是Tomcat&#xff0c;这是SpringBoot默认的容器技术&#xff0c;而且是内嵌式的Tomcat。同时&#xff0c;SpringBoot也支持Undertow容器&#xff0c;我们可以很方便的用Undertow替换Tomcat&#xff0c;而Undertow的性能和内…

低功耗技术——流水线设计(加法器和乘法器)

文章目录前言一、流水线1、16bit加法器2、无符号4bit乘法器3、编写一个4bit乘法器模块&#xff0c;并例化该乘法器求解c12*a5*b二、降低FPGA功耗1、静态功耗2、动态功耗前言 2023.3.31 今天学习降低功耗的一些方法 一、流水线 电路最高工作频率&#xff1a;取决于最长的组合逻…

Windows下的详细Git安装

网址链接&#xff1a; Githttps://git-scm.com/ 下载后得到这个程序&#xff1a; 这里它给出的是使用Vim&#xff0c; 我改成的是VSCode: 第一种是让 Git 自己选择&#xff0c;名字是 master &#xff0c;但是未来也有可能会改为其他名字&#xff1b; 第二种是我们自行决定&a…

大文件上传时如何做到秒传?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址 大家好&#xff0c;我是大彬~ …

Selenium基础篇之Select下拉列表选择

文章目录前言一、页面准备二、场景三、设计1.引入库2.启动浏览器实例3.访问本地演示html文件4.定位到select标签5.选择橘子&#x1f34a;5.1 通过索引5.2 通过value值5.3 通过text值6.强制等待7.结束webdriver进程结果前言 大家好&#xff0c;我是空空star&#xff0c;本篇给大…

ChatGPT火出圈,80%的设计师无事可做

自从疫情过后&#xff0c;设计行业开始变得很凌乱。很多同行开始打价格战&#xff0c;设计岗位逐渐演变成了一种新型的流水线。在我国&#xff0c;不管什么行业&#xff0c;到最终都会演变成饱和状态。用金融理论来说&#xff1a;供不应求&#xff0c;就赚钱&#xff0c;供过于…

STM32学习(十二)

软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff09;功能。 不精准&#xff1a;函数调用压栈进栈需要耗费额外的时间&#xff1b;流水线使得程序执行时间不确定。CPU死等。 定时器定时原理 使用精准的时基&#xff0c;通过…

【大数据之Hadoop】二、Hadoop生产集群搭建之完全分布式集群

1 运行准备 (1)准备3台客户机&#xff08;关闭防火墙、设置静态IP和主机名称&#xff09; (2)安装JDK&#xff0c;配置环境变量 (3)安装Hadoop&#xff0c;配置环境变量 (4)配置集群 (5)单点启动 (6)配置ssh (7)群起并测试集群 2 编写集群分发脚本xsync 集群分发脚本 在/hom…

OpenGL | 渲染带透明通道的2D精灵

一、Alpha测试 Alpha 测试的基本原理为&#xff1a;当绘制一个片元时&#xff0c;首先检测其 Alpha 值&#xff0c;若 Alpha 值满足要求&#xff0c;就通过测试&#xff0c;绘制此片元&#xff1b;否则丢弃此片元&#xff0c;不进行绘制。 glEnable(GL_ALPHA_TEST)&#xff1b…

基于springboot实现私人健身与教练预约管理系统【源码+论文】

基于springboot实现私人健身与教练预约管理系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea M…

举一反三学python(2)—函数应用

Con_Info ["王伟(男),河南郑州, 137****8331","杨秀娟(女),陕西西安, 138****4117","刘子豪(男),河北廊坊, 136****2964","李发魁(男),河南洛阳, 139***3297","王小花(女),山西太原, 138****0042",] 要求对上述文本数据解析…

main主函数参数解析

默认的main函数参数 int main(int argc, char *argv[]) {// 主函数的代码逻辑return 0; }其中&#xff0c;int 是主函数的返回值类型&#xff0c;主函数执行完后会返回一个整数值给操作系统&#xff0c;通常返回值为 0 表示程序正常结束&#xff0c;非 0 的返回值表示程序运行…
最新文章