首页 > 其他分享 >hadoop_hdfs详解

hadoop_hdfs详解

时间:2024-10-21 22:18:01浏览次数:3  
标签:DN hdfs HDFS NN 文件 hadoop edits 详解 数据

HDFS秒懂

HDFS定义

HDFS(Hadoop Distributed File System)是一个分布式的文件系统,用户存储文件,通过目录树来定位文件,适合一次写入,多次读出的场景,不支持文件的修改

HDFS优缺点

优点

  1. 高容错性:数据保存在多个副本,某一个副本数据丢失后,可以自动恢复
  2. 适合处理大数据:数据规模可达到GB、TB级,能够处理百万规模的文件数量
  3. 可构建在廉价的机器上:通过多副本机制,提高可靠性

缺点

  1. 不适合低延时数据访问:毫秒级的存储是做不到的
  2. 无法高效的对大量小文件进行存储:小文件的寻址时间会超过读取时间
  3. 不支持并发写入和文件随机修改:一个文件只能一个写,不允许多个线程同时写;仅支持数据追加,不支持文件修改

HDFS组成架构

NameNode

NN,Master,它是一个主管、管理者

  1. 保存HDFS上所有文件的元数据
  2. 维护副本数
  3. 管理数据块(block)的映射信息
  4. 处理客户端请求

DataNode

DN,就是Slave,数据节点

  1. 存储数据块
  2. 执行对数据块的操作

Secondary NameNode

2NN,不是NN的热备

  1. 辅助NameNode分担工作量, 定期进行checkpoint
  2. 紧急情况下,可辅助恢复NameNode

Client

客户端

  1. 通过命令管理和访问HDFS
  2. 文件切分与合并

NameNode工作机制

元数据的存储

  • 元数据存储在fsiamge文件和edits文件中
    在这里插入图片描述

  • 了解NameNode的文件
    在这里插入图片描述

1、fsimage:NameNode内存中元数据序列化后形成的文件,元数据的快照文件

fsimage文件的产生:
	1)第一次格式化NN时,此时会创建NN的工作目录,在目录中生成一个fsimage_000...000文件
	2)当NN在启动时,NN会将所有的edits文件和fsiamge文件加载到内存合并得到最新的元数据,将元数据持久化到磁盘生成新的fsimage文件
	3)如果启用了2NN,2NN也会辅助NN合并元数据,并将合并后的元数据发送给NN
查看faimage文件:
	语法:hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
	实例:hdfs oiv -p XML -i fsimage_0000000005067017090 -o /opt/fsimage.xml
2、fsimage_xxx.md5:是对应文件的md5值文件,用来保证fsimage的一致性
3、edits:记录客户端更新元数据信息的每一步操作

txid:
	每次更新元数据的写操作命令会被分解为若干步,每一步都会有一个id,这个id称为txid,也叫事务id
edits文件的产生:
	NN在启动之后,每次更新元数据的操作,都会将命令记录到edits_inprogress文件中,当达到指定条件之后,会进行滚动生成edits_txid文件,
	同时生成新的edits_inprogress文件来记录新的操作,等edits_inprogress文件再次满足条件后继续滚动,以此循环
edits_inprogress的滚动条件:
	1)操作次数:默认txid达到100万次,会自动滚动生成edits文件,参数可配置
	2)时间:默认每2分钟文件自动滚动生成edits文件,时间可配置
	3)重启:当NN被重启的时候,也会自动触发edits_inprogress的滚动
	4)手动执行滚动:通过命令hdfs dfsadmin -rollEdits强制滚动edits_inprogress
查看edits文件:
	语法:hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
	实例:hdfs oev -p XML -i edits_0000000005067128882-0000000005067142023 -o /opt/edits.xml
4、edits_inprogress:正在使用的编辑日志文件
5、seen_txid:文件保存的是一个数字,是edits记录里txid的最后一个数字

在这里插入图片描述

6、VERSION:记录的是NameNode的集群信息

在这里插入图片描述

namespaceID : 文件系统的唯一标识符,管理一组blockpoolID
clusterID:    集群ID
cTime:        NameNode存储系统的创建时间
storageType:  说明该存储目录包含的是NameNode的数据结构
blockpoolID:  针对每一个NamespaceID所对应的blockpool的ID
layoutVersion:HDFS永久性数据结构的版本信息

每次格式化NN,会产生一个VERSION文件,重新生成clusterID和blockpoolID,blockpoolID会被DN领取,生成一个同名的目录,每次DN启动时,
会将这个同名目录中的块上报给NN,DN在第一次启动时,如果没有VERSION信息,会向配置文件中配置的NN发起请求,生成VERSION,加入到集群

启动流程

  • 加载fsimage
    在这里插入图片描述
    fsimage文件记录了自最后一次检查点之前HDFS文件系统中所有目录和文件的序列化信息

  • 加载edits
    在这里插入图片描述
    edits文件记录了最后一次检查点之后所有针对HDFS文件系统的操作,加载了这两个文件后确保了数据的完整性和一致性

  • 记录checkpoint在这里插入图片描述
    在NN启动时,edits_inprogress文件会回滚,也会再生成一个新的fsimage文件,这样在本次启动之前的所有数据都被保存,记录本次检查点,以便更新新的操作

  • 安全模式
    在这里插入图片描述
    在加载完fsimage和edits文件后,NN开始监听DN请求,在这个过程期间,NN一直运行在安全模式,在安全模式下只能进行有限的读操作,不能对hdfs文件系统做任何修改,各个DN会向NN上报最新的块信息,在整个系统中99.9%的块满足至少有一个副本,NN会在30秒后退出安全模式

    # 基本语法
    hdfs dfsadmin -safenode get     (功能描述:查看安全模式状态)
    hdfs dfsadmin -safenode enter  	(功能描述:进入安全模式状态)
    hdfs dfsadmin -safemode leave	(功能描述:离开安全模式状态)
    hdfs dfsadmin -safemode wait	(功能描述:等待安全模式状态,hdfs接收的命令会等待,待离开安全模式后依次执行)
    

工作流程

在这里插入图片描述

Secondary NameNode工作机制

checkpoint

checkpoint是一种HDFS元数据的备份机制,元数据信息依据触发条件被定期写入持久化存储

  • checkpoint 默认触发条件
  1. 每隔1小时触发一次
  2. edits产生了100万次的操作记录

工作流程

在这里插入图片描述

DataNode工作机制

工作流程

  1. DataNode启动后向NameNode注册,通过后,每1小时向NameNode上报所有的块信息
  2. 每3秒一次心跳,心跳返回结果带有NameNode给该DataNode的命令
  3. 如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用

数据完整性

  1. 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
  2. 当DataNode读取Block的时候,它会计算CheckSum(校验和)
  3. 如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏
  4. Client会复制其他DataNode上的Block
  5. DataNode在其文件创建后周期验证CheckSum

文件块大小

  • HDFS中的文件存储在物理上是分块存储(block),Hadoop1.x默认大小是64M,Hadoop2.x默认大小是128M

块的大小设置基于最佳传输损耗理论!在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输!目前硬件的发展条件,普通磁盘写的速率大概为100M/S, 寻址时间一般为10ms!一次传输时间就是1s,所以块的最佳大小为100M,块的大小最好为2的n次方,所以最接近的就是128M,如果磁盘的传输速率很快,例如是300M/S,那么块大小就可以调整到 256M,可以通过dfs.blocksize参数进行设置。

块太小的缺点

  1. 同样大小的文件在存储时,块太小会占用更多的NN的元数据空间
  2. 在进行读写操作时,DFS存储了大量的小文件,会消耗额外的寻址时间

块太大的缺点

  1. 块太大,在读取块内某一部分数据场景时,需要将整个块下载后再读取内容,会带来更多额外的网络消耗,不够灵活
  2. 在上传文件时,一旦发生故障,需要将整个块文件重新上传,那么之前上传文件的资源开销就会浪费
  • 默认块大小为128M,128M指的是每个块最多存储128M的数据,如果当前块存储的数据不满128M,那么存了多少数据,就占用多少的磁盘空间!
  • 一个块只属于一个文件!

文件写入流程

在这里插入图片描述

  • 流程详细说明

流程5:客户端根据返回的DN节点,请求建立传输通道,客户端向最近的DN节点发起通道建立请求,由这个DN节点依次向通道中的距离当前节点距离最近的下一个节点发送建立通道请求,各个节点发送响应,通道建立成功

流程7:客户端每读取64K的数据会封装为一个packet(数据包),每个packet为64K,由若干个chunks组成,每个chunks是512B,还会包含一个checksum(校验和),封装成功的packet会放到一个叫做dataQuene的队列中,按顺序发送到通道里第一个DN节点,节点收到packet之后,再送到通道的下一个节点,发送过之后的packet会被放入到ackQuene队列里,当所有的DN节点返回了成功的ack确认消息,这个packet会在ackquene队列中删除。一旦发生错误,ackQuene队列里的小包会回滚到dataQuene,在原始通道里把坏的节点剔除掉,再重新建立一个新的通道继续传输。

ACK (Acknowledge Character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误。在 pipeline 管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全

流程8:第一个块传输完成后,DN向NN上报块的消息,只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭,开始下一个块的传输,重复3-8的流程

副本数如果暂时不满足条件,之后NN会自动检查,维护副本数

机架感知

机架感知是一种能够识别集群中各个节点所属机架,并在任务调度和数据块副本放置时利用这些信息来优化数据传输和任务执行效率

作用

  1. 提高数据传输效率
  2. 增强容错能力
  3. 优化任务调度

策略

  1. 第一个副本放在本地机架的一个DN节点
  2. 第二个副本放在本地机架的另一个DN节点(本地机架的网络拓扑距离最多为2,速度快)
  3. 第三个副本放在其他机架的一个DN节点(考虑安全性)
  4. 更多的副本,放置在相对空闲的其他DN节点上

文件读取流程

在这里插入图片描述

流程3:NN将文件所对应block的存储地址放入一个队列,客户端从队列中依次按每一个block对应地址来取出数据,也是按照packet进行读取,读取的时候可以多个DN一起读取

流程4:读取完一个block之后,会对这个block进行一次checksum验证,验证这个block的数据总量是否正确。如果不一致,说明这个block已损坏,客户端会通知NN,再从其他节点上读取该block,NN收到消息会重新备份一次,并发指令给这个DN将这个坏的block删掉

HDFS的shell操作

bin/hadoop fs command
OR
bin/hdfs dfs command

# hadoop fs :  既可以对本地文件系统进行操作还可以操作分布式文件系统
# hdfs dfs :   只能操作分布式文件系统
  • 常用命令实例
# 查看文件目录
hadoop fs -ls

在这里插入图片描述

# 创建目录
hadoop fs -mkdir

在这里插入图片描述

# 删除文件或目录
hadoop fs -rm

在这里插入图片描述

# 移动或更名文件
hadoop fs -mv

在这里插入图片描述

标签:DN,hdfs,HDFS,NN,文件,hadoop,edits,详解,数据
From: https://blog.csdn.net/qq_41074187/article/details/142863890

相关文章

  • 六、栈————相关概念详解
    栈————相关概念详解前言一、栈(stack)1.1栈是什么?1.2栈的类比二、栈的常用操作2.1初始化栈2.2元素入栈2.3访问栈顶元素2.4元素出栈2.5获取栈的长度2.6判断是否为空三、栈的实现3.1基于数组实现栈3.1.1代码演示3.1.2上述代码不足3.2基于链表实现栈3.2......
  • 类加载过程详解
    类的生命周期类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Link......
  • 【机器学习】朴素贝叶斯详解
    朴素贝叶斯朴素贝叶斯介绍复习常见概率的计算知道贝叶斯公式了解朴素贝叶斯是什么了解拉普拉斯平滑系数的作用【知道】常见的概率公式条件概率:表示事件A在另外一个事件B已经发生条件下的发生概率,P(A|B)在女神喜欢的条件下,职业是程序员的概率?女神喜欢条件下......
  • Swagge详解,SpringBoot项目集成Swagger
    介绍        相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这个接......
  • 反射-Class类详解
    概述        在Java中,除了int等基本类型外,Java的其他类型全部都是class(包括interface)。例如:StringObjectRunnableException...        Java反射机制是Java语言的一个重要特性。在学习Java反射机制前,大家应该先了解两个概念:编译期和运行期。     ......
  • Java消息队列入门详解
    什么是消息队列?消息队列的产生主要是为了解决系统间的异步解耦与确保最终一致性。在实际应用场景中,往往存在一些主流程操作和辅助流程操作,其中主流程需要快速响应用户请求,而辅助流程可能涉及复杂的处理逻辑或者依赖于外部服务。通过将这些辅助流程的消息放入消息队列,使得它们可......
  • Mongodb(4)索引,查看执行计划,聚合操作aggregate,表关联查询,批量插入测试数据,执行计
    创建索引,支持:单键索引、复合索引,唯一索引创建索引后台执行db.books.createIndex({open:1,close:1},{background:true})对内嵌文档字段创建索引:db.books.createIndex({"author.name":1})创建唯一索引db.books.createIndex({title:1},{unique:true})在包含嵌套对象的......
  • Nuxt.js 应用中的 build:before 事件钩子详解
    1.概述build:before 钩子提供了一种方法,让开发者能够在构建即将开始时修改配置或执行特定的前置逻辑。这对配置和文件准备工作尤其有用。2.build:before钩子的详细说明2.1钩子的定义与作用定义: build:before 是Nuxt.js生命周期的一部分,允许开发者在打包......
  • 【Linux从入门到精通三】Linux目录结构与基础命令详解
    个人名片......
  • 【Linux从入门到精通四】基础命令详解:cd、pwd、mkdir、文件操作与管道符
    个人名片......