目录
[(1)Block - 数据块](#(1)Block - 数据块)
[(2)MetaData - 元数据](#(2)MetaData - 元数据)
[(3)NameNode - 主结点](#(3)NameNode - 主结点)
[(4)DataNode - 从结点](#(4)DataNode - 从结点)
HDFS源于2003年10月发表的论文The Google File System ,该论文描述了Google开发的一个产品框架,该框架称为GFS(Google File System,Google文件系统)。Nutch开发人员借鉴GFS进行开源版本的实现,最终设计一款类似于GFS的分布式文件系统HDFS。
一、HDFS架构
HDFS主要采用主从(master-slave)架构 ,即一个HDFS通常是由一个Master和多个Slave组成,其中Master在HDFS中扮演NameNode角色,主要用于管理HDFS ;Slave在HDFS中扮演DataNode角色,主要用于存储文件。除此之外,还有SecoundNameNode用于辅助NameNode。
(1)Block - 数据块
Block是HDFS文件按系统中最小的存储单元 ,通常称为数据块。在HDFS文件系统中存储的文件会被拆分为多个Block,每个Block作为独立的单元进行存储,同一个文件的多个Block通常存放在不同的DataNode中。
(在hadoop1.x中,Block默认大小为64M,但是在hadoop2.x和hadoop3.x中,Block默认大小为128M。)
举例:HDFS存储300M文件,如果把文件拆分为3个Block,那么三个Block的大小分别为128M,128M,44M。
(2)MetaData - 元数据
MetaData(元数据)主要由Fsimage和Edits两个文件组成。
-
Fsimage
- 定义:文件系统元数据的一个完整的永久性检查点
- 包含:文件系统中所有目录和文件的信息,如文件名、文件大小、文件路径、文件副本数目、文件与Block的映射关系,以及Block与DataNode的映射关系等信息
- 作用:提供文件系统在某一时刻的静态视图,可用于快速恢复文件系统状态
- 例如:在NameNode启动时,可以利用Fsimage快速加载文件系统的基本结构,减少启动时间
- 生成:Fsimage通常是在特定的时间点由NameNode生成
- 例如:在系统定期检查点或者NameNode启动时进行合并操作后生成新的Fsimage
- 更新:在文件系统运行过程中,Fsimage不会频繁更新,以避免对性能产生过大影响
-
Edits
- 定义:记录了文件系统的所有变更操作,例如文件的创建、删除、修改等。它是一个日志文件,记录了自上一次Fsimage生成以来的所有文件系统操作
- 作用:保证文件系统的动态变化能够被记录下来,以便在需要时进行恢复或同步。每当有文件系统操作发生时,这些操作都会被立即写入Edits文件中,确保数据的完整性和一致性
- 生成:随着文件系统的操作不断进行,Edits文件会持续增长
- 更新:为了避免Edits文件过大影响系统性能,NameNode会定期将Edits文件和Fsimage进行合并,生成新的Fsimage,并清空Edits文件,重新记录新的变更操作
-
Hadoop 中 fsimage 和 edits 文件的具体实例
一、Fsimage
假设一个简单的 Hadoop 文件系统中有两个文件:
file1.txt
和file2.txt
。Fsimage 中可能包含如下信息:
- 文件 1:
- 文件名:file1.txt
- 文件大小:1024 字节
- 副本数量:3
- 存储的块信息:块 1 的 ID、块 2 的 ID 等。
- 文件 2:
- 文件名:file2.txt
- 文件大小:2048 字节
- 副本数量:2
- 存储的块信息:块 3 的 ID、块 4 的 ID 等。
二、Edits
如果在系统运行过程中,有一个新文件
file3.txt
被创建,并且file1.txt
被修改。edits 文件中可能记录如下操作:
- 创建文件
file3.txt
,包括文件名、初始大小、副本数量等信息。- 修改
file1.txt
的操作,例如文件大小的变化或者块的重新分配等。例如:
- [TIMESTAMP1] CREATE file3.txt, size=512, replicas=2
- [TIMESTAMP2] MODIFY file1.txt, newSize=1500
- Hadoop 中 fsimage 和 edits 文件的存储格式
一、Fsimage 文件存储格式
- 整体结构
- Fsimage 是一个二进制文件,它包含了文件系统的完整快照。
- 主要分为文件 和目录的元数据信息两部分。
- 元数据内容
- 对于每个文件,存储的信息包括文件名、文件大小、副本数量、块列表等。例如,文件名以特定编码方式存储,文件大小以字节为单位记录,副本数量通常是一个整数表示。
- 对于目录,存储目录名称、子目录和文件列表等信息。目录结构以层次化的方式存储,便于快速检索和遍历文件系统。
- 序列化格式
- Hadoop 使用一种高效的序列化格式 来存储 Fsimage,以便在读取和写入时能够快速处理大量的元数据。这种格式通常是紧凑的,以减少存储空间的占用,并提高读取和写入的性能。
二、Edits 文件存储格式
- 日志结构
- Edits 文件是一个日志文件,记录了文件系统的所有变更操作。
- 每个操作以特定的格式记录在文件中,按照时间顺序排列。
- 操作格式
- 常见的操作包括文件创建、删除、修改 ,以及块的分配和删除等。每个操作都包含操作类型、相关文件或块的信息以及操作的时间戳等。
- 例如,文件创建操作可能包括文件名、文件大小、副本数量等信息;块的分配操作可能包括块 ID、存储位置等信息。
- 追加写入
- Edits 文件采用追加写入 的方式,新的操作不断添加到文件的末尾。这样可以保证操作的顺序性,便于在恢复和合并时按照正确的顺序应用操作。
(3)NameNode - 主结点
NameNode是HDFS集群的名称结点,通常称为主结点。主要负责管理文件系统的命名空间以及控制客户端对文件的访问。如果NameNode由于故障原因而无法访问,那么用户就无法访问HDFS。(后面学zookeeper时,可以解决单点故障问题,以实现高可用||当然NameNode联邦也可以实现高可用)
- NameNode主要功能
- 管理文件系统的命名空间(NameSpace)
- 维护文件和目录的层次结构,记录文件名、文件按大小、文件副本数量等元数据信息
- 当客户端请求创建、删除或重命名文件/目录时,NameNode负责更新命名空间并记录相应的操作
- 管理数据块的存储
- 跟踪文件的数据块在DataNode集群中的存储位置。每个文件被分割成多个数据块,NameNode知道每个数据块存储在那些DataNode上
- 负责数据块的复制和重新平衡,以确保数据的高可用性和可靠性
- 处理客户端请求
- 接收客户端的文件读写请求,并将请求转发到合适的DataNode上
- 管理文件系统的权限控制,确保只有授权的用户才能访问文件和目录
- 维护和管理DataNode,并协调DataNode为客户端发起的读写请求提供服务
- 管理文件系统的命名空间(NameSpace)
- NameNode工作原理
- 启动过程
- 在启动时,NameNode从磁盘上读取Fsimage文件,该文件包含文件系统的命名空间元数据的完整快照。
- NameNode读取Edits文件,该文件记录了自上一次Fsimage生成以来的所有文件系统操作。通过Edits文件中的操作,NameNode将文件系统的状态更新至最新
- 运行过程中的元数据管理
- 当有文件系统操作发生时,NameNode会将操作记录到Edits文件中,同时更新内存中的元数据
- 为了防止Edits过大,NameNode会定期触发检查点操作,将Edits和Fsimage文件合并,生成新的Fsimage文件,并清空Edits文件内容。
- 数据块管理
- NameNode会根据数据块的副本策略和集群的状态,决定将数据块复制到哪些DataNode上
- 定期与DataNode进行通信,接收DataNode的心跳信息和数据块报告,以了解数据块的存储情况和DataNode的健康状态
- 启动过程
(4)DataNode - 从结点
DataNode是HDFS集群中的数据结点,通常称为从节点。主要负责存储实际的数据块,并为客户端提供数据读写服务。
-
DataNode主要功能
- 存储数据块(Block)
- DataNode将文件系统中的数据分割成固定大小的数据块,并将这些数据块存储在本地磁盘上
- 每个数据块会被复制到多个DataNode上,以提高数据的可靠性和可用性
- 提供数据读写服务
- 当客户端请求读取文件时,NameNode会根据文件的元数据信息确定数据块的存储位置,并将这些位置信息返回给客户端。客户端将直接与存储相应数据块的DataNode进行通信,读取数据块
- 当客户端请求写入文件时,客户端首先将数据写入本地缓存,然后将数据分成数据块,并将这些数据块发送到多个DataNode上进行存储(存储之前,客户端也是需要与NameNode通信的)
- 与NameNode通信
- DataNode会定期向NameNode发送心跳信息,以表名自己的存活状态。心跳信息还包含DataNode上存储的数据块列表等信息
- 当NameNode需要进行数据块复制或重新平衡时,会向DataNode发送指令,DataNode会按照指令执行相应的操作
- 存储数据块(Block)
-
DataNode工作原理
- 启动过程
- DataNode在启动时,会读取本地配置文件,确定自己在集群中的角色和配置信息
- DataNode会扫描本地磁盘,确定自己存储的数据块列表,并将这些信息报告给NameNode
- 运行过程中的数据管理
- DataNode会持续监控本地磁盘上的数据块状态,确保数据块的完整性和可用性
- 如果发现数据块损坏或丢失,DataNode会向NameNode报告,并尝试从其他DataNode上复制数据块进行恢复
- 数据读写过程
- 当客户端请求读取数据块时,DataNode会从本地磁盘读取数据块,并将数据返回给客户端
- 当客户端请求写入数据块时,DataNode会将接收到的数据块写入本地磁盘,并向客户端返回确认信息。同时,DataNode会将数据块写入操作报告给NameNode
- 启动过程
(5)SecondaryNameNode
SecondaryNameNode是HDFS中的一个辅助组件,主要负责协助NameNode进行元数据的管理和维护。切记!SecondaryNameNode是NameNode的冷备,不是热备,它不能代替NameNode。
-
SecondaryNameNode主要功能
- 合并Fsimage和Edits文件
- SecondaryNameNode定期从NameNode中下载Fsimage和Edits文件
- 将Edits文件中的操作应用到Fsimage上,生成一个新的Fsimage文件
- 将新的Fsimage文件上传回NameNode,并清空NameNode上的edits文件。这个过程称为检查点(checkpoint)操作,可以防止edits文件过大,提高NameNode的启动速度
- 辅助NameNode进行元数据备份
- 在某些情况下,SecondaryNameNode可以为NameNode的"备份",提供一定程度的元数据冗余
- SecondaryNameNode并不是真正的高可用解决方案,因为它不能在NameNode故障时立即接管其工作
- 合并Fsimage和Edits文件
-
SecondaryNameNode工作原理
- 启动和触发检查点
- SecondaryNameNode通常在Hadoop集群启动时自动启动
- 定期检查NameNode上的Edits文件大小或时间间隔,当满足一定条件时,触发检查点操作
- 下载和合并文件
- 在触发检查点后,SecondaryNameNode从NameNode下载Fsimage和Edits文件
- 将Edits文件中的操作应用到Fsimage上,这个操作可以使用内存中的数据结构进行高效的合并操作
- 生成新的Fsimage文件后,SecondaryNameNode将其上传回NameNode,并通知NameNode可以使用新的Fsimage文件并清空Edits文件
- 与NameNode的交互
- SecondaryNameNode与NameNode之间通过网络进行通信
- NameNode会将Fsimage和Edits文件的位置信息告知SecondaryNameNode,以便它进行下载和合并操作
- SecondaryNameNode在完成检查点操作后,会向NameNode发送通知,告知其新的Fsimage文件以及准备完成
- 启动和触发检查点
二、HDFS的特点
(1)存储大文件(GB、TB)
HDFS支持GB级别甚至TB级别的文件存储,每个文件都会被切分为多个block存储在集群的不同DataNode上,使得对大型文件进行读取操作时可以采用并行的方式提高吞吐量。
(2)高容错性
HDFS的副本机制会为DataNode中的每个Block创建多个副本(默认3个),这样即使某个DataNode宕机,也不会造成数据丢失,这是因为HDFS可以从其它DataNode中读取已保存的相同的Block副本数据。
(3)简单的一致性模型
HDFS采用的是一次写入、多次读取 的文件访问模型。在HDFS中,一个文件经过创建、写入和关闭后,只能追加,不能修改,并且不支持并发多用户的写操作,这样可以保证有效数据的一致性。
(4)移动计算比移动数据更经济
计算向数据靠拢,可以最大限度地减少网络阻塞,同时还可以增加系统的整体吞吐量。HDFS为应用提供了接口,以便自己更靠近数据所在位置
(5)可移植性
HDFS可以轻松地从一个平台移植到另一个平台,这有助于广泛应用HDFS作为大量应用程序的首选平台。
三、HDFS的文件读写流程
(1)HDFS写文件流程
下面以300MB大小的Test.txt文件为例,针对上图所示的HDFS写文件流程进行介绍:
① 客户端(Client)上传 Test.txt 文件到指定目录的请求,与NameNode建立通信;
② NameNode检查客户端是否有上传文件的权限 ,以及文件是否存在 (如果不存在则可进行下一步,如果存在则拒绝客户端的上传请求,并返回一个错误信息,告知客户端该文件已存在,不能重复上传)。若通过检查,则通知客户端上传文件,并向其发送分块策略;
③ 客户端 根据分块策略(以默认128MB为例)对文件 Test.txt 进行切分,形成3个Block,分别是blk1、blk2和blk3;
④ 客户端向NameNode请求上传第一个Block,即blk1;
⑤ NameNode根据副本机制 和机架感知 向客户端返回可上传blk1的DataNode列表,这里指定是Hadoop1、Hadoop2、Hadoop3;
⑥ 客户端从NameNode接收到blk1上传的DataNode列表后,首先根据就近原则 从DataNode列表中选择一台DataNode(如Hadoop1)并与之建立管道(Pipeline),用于传输数据,然后Hadoop1会与第二台DataNode(如Hadoop2)建立管道,最后Hadoop2会与第三台DataNode(Hadoop3)建立管道;
⑦ 首先,Hadoop3向Hadoop2汇报管道建立成功,然后,Hadoop2向Hadoop1汇报管道建立成功,最后,Hadoop1向客户端汇报管道建立成功,此时客户端与所有DataNode列表中的所有DataNode都建立了管道;
⑧ 客户端开始传输 blk1,传输过程以流式写入的方式实现,具体过程如下
- 将blk1写入内存进行缓存;
- 将blk1按照packet(默认64KB)为单位进行划分;
- 将第一个packet(数据包)通过管道发送给Hadoop1;
- Hadoop1接收到第一个packet后,客户端会将第二个packet发送给Hadoop1,同时Hadoop1通过Pipeline将第一个packet发送给Hadoop2(传递并保存packet);
- Hadoop2接收到第一个packet之后,Hadoop1会将第二个packet发送给Hadoop2,同时Hadoop2通过Pipeline将第一个packet发送给Hadoop3(传递并保存packet);
- 以此类推,直至blk1上传完成。
⑨ 首先,Hadoop3向Hadoop2发送blk1写入完成的信息,然后,Hadoop2向Hadoop1发送blk1写入完成的信息,最后,Hadoop1向客户端发送blk1写入完成的信息;
⑩ 客户端成功上传blk1后,重复第④~⑨的流程,依次上传blk2和blk3,最终完成Test.txt文件的上传;
(2)HDFS读文件流程
下面以300MB大小的Test.txt文件为例,针对上图所示的HDFS读文件流程进行介绍
① 客户端发起读取Test.txt文件的请求,与NameNode建立通信;
② NameNode检查客户端是否有读取文件的权限 ,以及文件是否存在 。若通过检查,则通知客户端读取文件,并向其Test.txt文件的Block列表(结构化数据) ,该列表中记录了每个Block编号 及其副本所在DataNode的地址,例如Hadoop1、Hadoop2、Hadoop3的主机地址;
③ 客户端按照就近 或负载较轻 从NameNode返回的Block列表选择Datanode进行读取Block 。首先客户端从Block列表中选择一个距离自己最近或负载较轻的DataNode(如Hadoop1)读取Block,如果该DataNode可以读取文件的所有Block,则结束读取 ;如果该DataNode没有读取文件的所有Block,则客户端从Block列表中继续选择距离自身最近或负载较轻的DataNode读取剩余的Block ,直至获取文件按的所有Block才结束读取;读取block的过程中,会进行数据校验 ,确保数据的完整性,如果发现数据损坏 ,可以从其它副本 所在的数据节点继续读取该block;
④ 客户端将读取的所有Block按照顺序进行合并 ,最终形成Test.txt文件。需要注意的是,如果文件过大,导致NameNode无法一次性读取 所有Block,则会分批次将Block列表返回客户端。
四、HDFS的健壮性
HDFS的目标是出现故障的情况下可靠地存储数据,其运用了心跳机制 ,副本机制 ,数据完整性校验 ,安全模式 和快照5种策略保证存储数据的可靠性。
(1)心跳机制
HDFS的心跳机制主要用于NameNode和DataNode之间保持通信以及监控集群的健康状态。master启动的时候,会运行 ipc server(Inter-Process Communication 进程间的通信)
- 心跳机制的作用
- 保持活性 :DataNode定期向NameNode发送心跳信号,以表明自己处于活跃状态且正在运行。如果NameNode在一段时间后(10min)没有收到某个DataNode的心跳,就会认为该DataNode出现故障
- 汇报状态 :DataNode通过心跳(10h)将自己的存储状态信息(如已使用空间、剩余空间、数据块副本情况等)汇报给NameNode。NameNode依据这些信息进行数据块的分配、重新复制等管理操作
- 心跳机制的工作流程
- 时间间隔 :DataNode按照一定的时间间隔(3s )向NameNode发送心跳信号(heartbeat)。这个时间间隔可以通过HDFS的配置参数进行调整
- 心跳处理 :NameNode接收 到DataNode的心跳后,会更新 该DataNode的状态信息,并根据需要发送指令给DataNode。例如:如果发现某个数据块的副本数量不足,NameNode可能会指示一些DataNode去复制该数据块。
- 故障检测 :如果NameNode长时间(10min )未收到某个DataNode的心跳,就会将其标记为故障状态 ,并启动相应的恢复机制。这可能包括重新分配该DataNode上存储的数据块副本到其它正常的DataNode上,以保证数据的可用性和冗余性。
(2)副本机制
HDFS副本机制是其保证数据可靠性和高可用性的重要手段。
- 副本数量设定
- HDFS允许管理员配置文件的副本数量,默认为3个副本(包括自身)
- 副本放置策略
- 第一个副本:通常放置在上传文件的客户端所在的DataNode 上。如果客户端不在集群内,则随机挑选一个DataNode,减少数据上传网络开销;
- 第二个副本:放置在与第一个副本不同的机架上 的一个随机DataNode上。这样可以保证一个机架出现故障时,数据任然可用;
- 第三个副本:放置在与第二个副本相同机架 的不同DataNode上。这样可以进一步提高数据的可用性,并且在读取数据时可以减少跨机架的网络流量。
- 副本管理
- 数据写入时 :客户端将数据分成多个数据块,并将每个数据块及其副本写入不同的DataNode。在写入过程中,DataNode之间会相互通信以确保副本的一致性 。只有当所有副本都成功写入后,客户端才会认为写入操作成功
- 定期检查 :NameNode会定期检查 每个数据块的副本数量 和位置。如果发现副本数量不足或某些DataNode出现故障,NameNode会启动副本复制过程,将数据块复制到其它正常的DataNode上,以保证副本数量符合设定要求
- 数据读取时 :客户端从多个副本中选择一个进行读取。通常会选择距离最近或负载较轻 的DataNode,以提高读取效率。如果读取过程中出现错误 ,客户端可以尝试从其他副本读取。
- 作用和优势
- 提高数据可靠性 :即使某些DataNode出现故障,仍然可以从其他副本中读取数据,保证数据不会丢失
- 增加数据可用性 :多个副本分布在不同DataNode上,可以提高数据的访问速度和并发访问能力
- 负载均衡 :副本的分布可以使数据的读取 和写入 负载更加均衡地分配在整个集群中,提高系统的性能和稳定性
(3)数据完备性校验
HDFS中,数据完备性校验是确保数据在存储和运输过程中不被损坏或篡改的重要机制。
- 校验方式
- 校验和(Checksum) :HDFS为每个数据块计算一个校验和。在数据写入 时,客户端计算数据块的校验和 并将其与数据块一起存储 在DataNode上。在数据读取 时,客户端会再次计算读取到的数据块的校验和,并与存储的校验和进行比较。如果两者不匹配,则说明数据块在存储或传输过程中出现了损坏
- 数据块副本比较 :当客户端从多个DataNode读取数据块副本时,可以比较不同副本的校验和。如果副本之间的校验和不一致,说明可能存在数据损坏或副本不一致的情况。在这种情况下,客户端可以尝试从其他副本读取数据,或者通知NameNode启动副本复制过程以修复损坏的副本
- 校验时机
- 数据写入 :客户端在将数据块写入DataNode之前 ,会计算数据块的校验和。DataNode在接收到数据块后,也会再次计算与客户端提供的校验和进行比较,以确保数据在传输过程中没有被损坏
- 数据读取 :客户端在读取数据块时,会计算读取到的数据块的校验和,并与存储的校验和进行比较。如果校验和不匹配,客户端会尝试从其他副本读取数据,或者通知NameNode启动副本复制过程
- 定期检查 :NameNode可以定期启动数据块的完整性检查过程。它会指示DataNode读取数据的数据块并计算校验和,然后将计算得到的校验和与存储的校验和进行比较。如果发现数据块损坏,NameNode会启动副本复制过程以修复损坏的副本
- 作用和优势
- 保证数据可靠性 :通过校验 和副本比较 等机制,可以即使发现数据损坏 ,并采取相应的措施 进行修复,保证数据的可靠性
- 提高数据可用性 :在数据损坏的情况 下,客户端可以从其他副本读取数据 ,或者启动副本复制过程,提高数据的可用性
- 增强系统稳定性 :数据完整性检验可以减少因数据损坏而导致的系统故障和错误,增强HDFS的稳定性和可靠性。
(4)安全模式
HDFS的安全模式是一种特殊的运行状态,主要用于在系统启动或出现故障后确保数据的一致性和完整性。
-
进入安全模式的情况
- 集群启动时 :当HDFS集群启动时,NameNode会首先进入安全模式。在这个阶段,NameNode回家再文件系统的元数据,并从各个DataNode接收心跳和块报告信息
- 故障恢复时 :如果集群出现故障 ,例如部分DataNode宕机或网络分区,NameNode也可以进入安全模式 以进行数据恢复 和一致性检验
-
安全模式的特点
- 只读状态 :在安全模式下,HDFS处于只读状态,客户端只能读取文件系统中的数据,但不能进行写操作,包括创建、删除或修改文件等
- 数据块检查 :NameNode会利用从DataNode接收到的块报告信息,检查数据块的副本数量是否满足设定的副本系数要求 。如果发现数据块副本数量不足 ,NameNode会在安全模式下启动副本复制过程,将数据块复制到其他DataNode上,以保证数据的冗余性
- 等待状态 :NameNode会等待足够数量 的DataNode向其发送心跳和块报告信息,以确保整个文件系统的状态是稳定的。这个等待的时间可以通过配置参数进行调整
-
退出安全模式的条件
- 副本数量达标 :当NameNode确定数据块的副本数量满足设定的副本系数要求 ,并且有足够比例的DataNode向其报告了块信息时,它会认为文件系统处于稳定状态,可以退出安全模式
- 手动退出:管理员也可以通过命令强制NameNode退出安全模式,如下案例
补充:Safe mode is ON
出现原因之一:运行hadoop的时候,出现假死的状况,我直接重启了服务器,造成块数据丢失,于是安全模式启动了,检查安全模式是否启动
hdfs dfsadmin -safemode get
解决方法:
-
查看缺失文件
hdfs fsck /
-
删除缺失文件
hdfs fsck -delete
再次启动:
-
metastore(9083 端口)
nohup hive --service metastore &
-
hiveserver2(10000 端口)
nohup hive --service hiveserver2 &
-
安全模式的作用和意义
- 数据一致性保障 :安全模式确保了在系统启动 或故障恢复后 ,文件系统的元数据和数据块的状态是一致的 。通过检查数据块副本数量 和等待DataNode的报告,NameNode可以确定文件系统是否处于稳定状态,从而避免在不稳定的情况下进行写操作,防止数据丢失或不一致性
- 故障恢复辅助 :在安全模式下,NameNode可以启动副本复制过程,以恢复因故障而丢失或损坏的数据块副本。有助于提高系统的可靠性和容错性
- 系统稳定性维护 :安全模式限制了客户端的写操作,避免了在系统不稳定的情况下进行可能导致数据不一致的操作。有助于维护整个HDFS集群的稳定性和可靠性
(5)快照
HDFS中快照(Snapshot)是一种用于保存文件系统在特定时间点的状态的功能。
-
快照的作用
- 数据备份和恢复:快照提供了一种快速、方便的数据备份方式。可以在某个时间点创建快照,以便在数据损坏、误操作或其他问题发生时进行恢复
- 实验和测试 :可以使用快照创建文件系统的副本,进行实验、测试新的应用程序或进行数据挖掘等操作,而不会影响原始数据
- 数据保护:防止意外删除或修改重要数据。即使在误操作后,也可以通过快照恢复到之前的状态。
-
创建快照
-
管理员可以使用HDFS命令行工具或API来创建快照
hdfs dfsadmin -createSnapshot 目录
-
创建快照时,不会立即复制所有数据 。而是,HDFS会记录文件系统的元数据状态,以便在需要时可以恢复到该状态。
-
可以为单个目录 或整个文件系统创建快照
-
-
读取快照
-
客户端通过指定快照的名称来访问特定时间点的文件系统状态。
列出特定快照中的文件和目录
hdfs dfs -lsr /path/.snapshot/
-
读取快照时,实际上是在查看创建快照时的文件系统状态,而不是当前的实时状态。这对于检查历史数据或恢复特定版本的文件非常有用
-
-
删除快照
-
可以使用HDFS命令或API删除不重要的快照
删除指定快照
hdfs dfsadmin -deleteSnpashot 快照地址
-
删除快照只会删除记录的元数据状态,不会删除实际的数据。只有当删除所有引用特定数据块的快照后,这些数据块才可能被垃圾回收
-
-
限制和注意事项
-
快照会占用一定的存储空间,因为它们记录了文件系统的元数据状态。在创建大量快照时,需要考虑成本
-
快照不是实时备份,而是特定时间点的状态记录。因此,在创建快照后发生的数据更改将不会反映在快照中
-
快照的创建和删除可能会对文件系统的性能产生一定的影响,特别是在处理大量数据时。因此,使用快照时,需要权衡数据保护和性能之间的关系
-