3.4 HDFS存储原理

3.4 HDFS存储原理,第1张

一、涉及的问题

1. 冗余数据保存

2. 数据保存策略

3. 数据恢复

二、冗余数据保存问题

1. 冗余因子

出于成本考虑(也是HDFS优势),HDFS常架构在廉价机器上——经常出故障。所以必须有冗余机制。一般每个块都保存3份,即冗余因子默认是3

注意:伪分布式配置,即名称节点和数据节点都放在同一个机器上,则冗余因子显然只能是1,因为只有一个机器

2. 冗余机制的好处

(1) 加快数据传输速度——当多个客户端同时想访问相同数据块时,可以同时并行而不需要排队

(2) 很容易检查数据错误——互相对照发现错误

(3) 保证数据可靠性——HDFS有这样的机制:一旦探测到一个副本故障,会自动复制正确副本,使冗余因子恢复默认值

三、数据保存与读取

1. 第一副本存放策略:

(1) 如果保存请求来自集群内部,第一个副本放在发起者(应用)所在节点。比如一个在DataNode1上的应用发起存数据请求,那就把它第一份副本也存在DataNode1

(2) 如果保存请求来自集群外部,HDFS会随机挑选一台磁盘不太忙且CPU不太忙的节点来放置第一个副本

2. 第二个副本存放策略:

放在和第一副本不同的机架的节点上 。如下图中DataNode4,它和DataNode1在不同机架上

3. 第三副本放置策略:

放在和第一副本相同的机架的其他节点。如图中的DataNode2或DataNode3

4. 更多副本存放策略:

全部随机放置(依靠随机算法)

5、数据读取

原则:就近读取

——HDFS提供一个API可以告诉数据节点的机架ID,客户端也可以用API诊断自己所在机架ID。ID相同说明在同一机架。而相同机架数据间通信很快,它们就是“相近”的数据。

——而前面也说了,每个数据块都有多个不同的副本,如果找到某个副本和客户端在同一个机架上,就优先选此副本。如果没有就随机找一个副本读取

四、数据的错误与恢复

1. 名称节点出错

只有一个名称节点,而且它保存了核心数据结构FsImage和EditLog。恢复方法:

(1) 在HDFS1.0里只能暂停服务,从第二名称节点(冷备份)恢复

(2) 在HDFS2.0里可以直接用热备份恢复而不用暂停服务

2. 数据节点出错

(1) 如何发现数据节点出问题:

在整个运行期间,DataNode都会定期通过远程调用向NameNode发送心跳信息。一旦隔了一个周期收不到心跳信息,则NameNode就知道这个DataNode发生了故障

(2) 如何恢复数据节点:

NameNode会在状态列表里把出错的DataNode标记为不可用(宕机),然后把它里面的数据块对应的备份(在其他DataNode上)复制到另一个DataNode上去

——HDFS和其他分布式文件系统最大的区别就是 可以调整冗余数据位置 。这种调整不仅发生在故障时,也可以在在机器负载不均衡时把一个DataNode的数据迁移到另一个上面以平衡负载

3. 数据出错

(1) 如何发现数据出错:

“校验码机制”——客户端每写入一个数据块,都会为其生成一个校验码并保存在同一文件目录下。读取数据块同时会核对其校验码,如果不对说明数据出问题了。

(2) 如何恢复数据:

从备份复制过来

Reference:

https://www.icourse163.org/learn/XMU-1002335004#/learn/content?type=detail&id=1214310117&cid=1217922275&replay=true

        大数据技术主要是要解决大规模数据的计算处理问题,但是我们要想对数据进行计算,首先要解决的其实是大规模数据的存储问题。

         如果一个文件的大小超过了一张磁盘的大小,你该如何存储? 单机时代,主要的解决方案是 RAID ;分布式时代,主要解决方案是 分布式文件系统 。

           其实不论是在 RAID 还是 分布式文件系统 ,大规模数据存储都需要解决几个核心问题,这些问题都是什么呢?总结一下,主要有以下三个方面。       

        1. 数据存储容量的问题。 既然大数据要解决的是数以 PB 计的数据计算问题,而一般的服务器磁盘容量通常 1~2TB,那么如何存储这么大规模的数据呢?

        2. 数据读写速度的问题。 一般磁盘的连续读写速度为几十 MB,以这样的速度,几十 PB 的数据恐怕要读写到天荒地老。

        3. 数据可靠性的问题。 磁盘大约是计算机设备中最易损坏的硬件了,通常情况一块磁盘使用寿命大概是一年,如果磁盘损坏了,数据怎么办?

        RAID(独立磁盘冗余阵列)技术是将多块普通磁盘组成一个阵列,共同对外提供服务。主要是为了改善磁盘的存储容量、读写速度,增强磁盘的可用性和容错能力。目前服务器级别的计算机都支持插入多块磁盘,通过使用 RAID 技术,实现数据在多块磁盘上的并发读写和数据备份。

        常用 RAID 技术有图中下面这几种,RAID0,RAID1,RAID10,RAID5, RAID6。

           首先,我们先假设服务器有 N 块磁盘。

            RAID 0  是数据在从内存缓冲区写入磁盘时,根据磁盘数量将数据分成 N 份,这些数据同时并发写入 N 块磁盘,使得数据整体写入速度是一块磁盘的 N 倍;读取的时候也一样,因此 RAID 0 具有极快的数据读写速度。但是 RAID 0 不做数据备份,N 块磁盘中只要有一块损坏,数据完整性就被破坏,其他磁盘的数据也都无法使用了。

            RAID 1 是数据在写入磁盘时,将一份数据同时写入两块磁盘,这样任何一块磁盘损坏都不会导致数据丢失,插入一块新磁盘就可以通过复制数据的方式自动修复,具有极高的可靠性。

           结合 RAID 0 和 RAID 1 两种方案构成了 RAID 10 ,它是将所有磁盘 N 平均分成两份,数据同时在两份磁盘写入,相当于 RAID 1;但是平分成两份,在每一份磁盘(也就是 N/2 块磁盘)里面,利用 RAID 0 技术并发读写,这样既提高可靠性又改善性能。不过 RAID 10 的磁盘利用率较低,有一半的磁盘用来写备份数据。

           一般情况下,一台服务器上很少出现同时损坏两块磁盘的情况,在只损坏一块磁盘的情况下,如果能利用其他磁盘的数据恢复损坏磁盘的数据,这样在保证可靠性和性能的同时,磁盘利用率也得到大幅提升。

           顺着这个思路, RAID 3  可以在数据写入磁盘的时候,将数据分成 N-1 份,并发写入 N-1 块磁盘,并在第 N 块磁盘记录校验数据,这样任何一块磁盘损坏(包括校验数据磁盘),都可以利用其他 N-1 块磁盘的数据修复。但是在数据修改较多的场景中,任何磁盘数据的修改,都会导致第 N 块磁盘重写校验数据。频繁写入的后果是第 N 块磁盘比其他磁盘更容易损坏,需要频繁更换,所以 RAID 3 很少在实践中使用,因此在上面图中也就没有单独列出。

           相比 RAID 3, RAID 5 是使用更多的方案。RAID 5 和 RAID 3 很相似,但是校验数据不是写入第 N 块磁盘,而是螺旋式地写入所有磁盘中。这样校验数据的修改也被平均到所有磁盘上,避免 RAID 3 频繁写坏一块磁盘的情况。

            如果数据需要很高的可靠性,在出现同时损坏两块磁盘的情况下,仍然需要修复数据,这时候可以使用 RAID 6。

             RAID 6 和 RAID 5 类似 , 但是数据只写入 N-2 块磁盘,并螺旋式地在两块磁盘中写入校验信息(使用不同算法生成)。

            从下面表格中你可以看到在相同磁盘数目(N)的情况下,各种 RAID 技术的比较。

        现在我来总结一下,看看 RAID 是如何解决我一开始提出的,关于存储的三个关键问题。

         1. 数据存储容量的问题。 RAID 使用了 N 块磁盘构成一个存储阵列,如果使用 RAID 5,数据就可以存储在 N-1 块磁盘上,这样将存储空间扩大了 N-1 倍。

         2. 数据读写速度的问题。 RAID 根据可以使用的磁盘数量,将待写入的数据分成多片,并发同时向多块磁盘进行写入,显然写入的速度可以得到明显提高;同理,读取速度也可以得到明显提高。不过,需要注意的是,由于传统机械磁盘的访问延迟主要来自于寻址时间,数据真正进行读写的时间可能只占据整个数据访问时间的一小部分,所以数据分片后对 N 块磁盘进行并发读写 *** 作并不能将访问速度提高 N 倍。

         3. 数据可靠性的问题。 使用 RAID 10、RAID 5 或者 RAID 6 方案的时候,由于数据有冗余存储,或者存储校验信息,所以当某块磁盘损坏的时候,可以通过其他磁盘上的数据和校验数据将丢失磁盘上的数据还原。

        RAID 可以看作是一种垂直伸缩,一台计算机集成更多的磁盘实现数据更大规模、更安全可靠的存储以及更快的访问速度。而 HDFS 则是水平伸缩,通过添加更多的服务器实现数据更大、更快、更安全存储与访问。

        RAID 技术只是在单台服务器的多块磁盘上组成阵列,大数据需要更大规模的存储空间和更快的访问速度。将 RAID 思想原理应用到分布式服务器集群上,就形成了 Hadoop 分布式文件系统 HDFS 的架构思想。

存储类型表示数据节点支持的多种物理存储介质的类型,有如下几类: 

* RAM_DISK(transient) 

* SSD 

* DISK(default) 

* ARCHIVE

前三个分别对应内存存储,固态硬盘存储,机械磁盘存储,第4个我认为是压缩格式的机械存储

按照RAM_DISK->SSD->DISK->ARCHIVE的顺序,存取速度由快到慢,单bit存储成本由高到低。

通过datanode角色的配置项dfs.datanode.data.dir可以配置存储介质的位置和类型,比如:

在上表中,前两列分别是策略编号和策略名第三列表示在有n个副本的情况下,各个副本都会被存放在什么类型的存储上第四列表示在创建文件(写入第一个副本)时第三列指定的存储无法满足要求时备选的存储类型第五列表示在生成副本时第三列指定的存储无法满足要求时备选的存储类型。以One_SSD策略为例,正常情况一个副本放在有SSD标签的存储上,其他副本放在DISK标签的存储上,在正常情况无法得到满足的情况下,副本可能会被“强制”放在SSD或者DISK上。

按照All_SSD->One_SSD->Hot->Warm->Cold的顺序,面向的数据“越来越冷”,可以根据数据的冷热程度选择合理的策略。Lazy_Persist比较特殊,如果一个文件的存储策略被指定为Lazy_Persist,在写入时会先写入内存,再异步地写入磁盘,官方文档中提到“Applications can choose to use Lazy Persist Writes to trade off some durability guarantees in favor of reduced latency.”,即主要用来降低小数据量的写入延迟,代价是在某些情况下会有数据丢失。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9626542.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存