0%

Hadoop分布式文件系统——HDFS

最近想要系统的学习大数据开发的知识,目前主要是跟着大数据入门指南进行学习,博客会在学习的基础上加入一些自己的思考。
资料来源:https://github.com/heibaiying/BigData-Notes

Hadoop分布式文件系统——HDFS

1 介绍

HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐 量等特性,可以部署在低成本的硬件上。

2 HDFS 设计原理
2.1 HDFS 架构

HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:
NameNode : 负责执行有关文件系统命名空间的操作,例如打开,关闭、重命名文件和目录等。 它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。
DataNode:负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作。

2.2 文件系统命名空间

HDFS 的 文件系统命名空间 的层次结构与大多数文件系统类似 (如 Linux), 支持目录和文件的创建、移 动、删除和重命名等操作,支持配置用户和访问权限,但不支持硬链接和软连接。NameNode 负责维护文件系统名称空间,记录对名称空间或其属性的任何更改。

但是这篇文章里说HDFS实现了软连接但是没有实现硬链接:
HDFS符号链接和硬链接:https://blog.csdn.net/Androidlushangderen/article/details/52808554

  • 与Linux文件系统中的软链接概念一样,HDFS符号链接也是相当于给目标文件新建一个自定义路径,这个自定义路径实质指向目标文件。所以在这里HDFS符号链接中做的最重要的事情就是路径的解析。而且这个解析还有可能是嵌套的,符号链接中指向的是另外一个符号链接。

一些概念:

文件存储

文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。而有一种方法可以快速的寻找到数据元,那就是软硬链接。

POSIX

POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准。POSIX标准意在期望获得源代码级别的软件可移植性。

硬链接和软连接

链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。利用链接可以快速找到数据元。

文件的 inode 值指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。

1
2
3
4
5
6
# Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
# echo > file 显示结果定向至文件
$ touch myfile && echo "This is a plain text file." > myfile
$ ln myfile hard
$ ls -li
$ ln -s myfile soft

硬链接的inode 值和源文件相同,都指向同一个区块,是完全一样的文件,修改hard也会修改myfile。删除源文件对硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。

软链接(也就是符号链接)的 inode与源文件不同,文件类型不同,软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,当文件被删除时,会显示无法找到该文件。

2.3 数据复制

由于 Hadoop 被设计运行在廉价的机器上,这意味着硬件是不可靠的,为了保证容错性,HDFS 提供了 数据复制机制。HDFS 将每一个文件存储为一系列块,每个块由多个副本来保证容错,块的大小和复制因子可以自行配置(默认情况下,块大小是 128M,默认复制因子是 3)。数据复制通过副本机制实现。

Rack 机架

HDFS的机架感知策略 http://blog.itpub.net/69917874/viewspace-2698442/
通常来说大型的Hadoop集群是以机架的形式来组织的他们分布在不同的机架上面,同一个机架节点往往通过同一个网络交换机连接,在网络宽带方面比跨机架通信有较大优势。

三副本机制

但是另一个推文里说hadoop 3.x

第一个副本放在client所在节点,另外两个副本放在不同机架上

超过3个副本多余的副本则会随机放

副本机制的作用

  • 极大程度上避免了宕机所造成的数据丢失
  • 可以在数据读取时进行数据校验
2.4 副本的选择

为了最大限度地减少带宽消耗和读取延迟,HDFS 在执行读取请求时,优先读取距离读取器最近的副本。如果在与读取器节点相同的机架上存在副本,则优先选择该副本。如果 HDFS 群集跨越多个数据中心,则优先选择本地数据中心上的副本。

2.5 架构的稳定性

2.5.1 心跳机制和重新复制

每个 DataNode 定期向 NameNode 发送心跳消息,如果超过指定时间没有收到心跳消息,则将 DataNode 标记为死亡。NameNode 不会将任何新的 IO 请求转发给标记为死亡的 DataNode,也不会 再使用这些 DataNode 上的数据。 由于数据不再可用,可能会导致某些块的复制因子小于其指定值, NameNode 会跟踪这些块,并在必要的时候进行重新复制。

hdfs心跳机制:https://blog.csdn.net/album_gyd/article/details/76686206

IPC(Inter-Process Communication)进程间通信,提供了各种进程间通信的方法。

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

进程间的通信方式

面试必备-进程间的五种通信方式:https://network.51cto.com/art/201911/606827.htm?mobile
什么是消息队列:https://www.zhihu.com/question/54152397?sort=created
跨进程通信之Socket-理论1:https://zhuanlan.zhihu.com/p/62522151

1.无名管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2.高级管道(popen): 将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。

3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

5.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

6.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

7.共享内存( shared memory ) : 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

8.套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

2.5.2 数据的完整性

​ 由于存储设备故障等原因,存储在 DataNode 上的数据块也会发生损坏。为了避免读取到已经损坏的数据而导致错误,HDFS 提供了数据完整性校验机制来保证数据的完整性,具体操作如下:

​ 当客户端创建 HDFS 文件时,它会计算文件的每个块的 校验和 ,并将 校验和 存储在同一 HDFS 命名空间下的单独的隐藏文件中。当客户端检索文件内容时,它会验证从每个 DataNode 接收的数据是否与存储在关联校验和文件中的 校验和 匹配。如果匹配失败,则证明数据已经损坏,此时客户端会选择从其他 DataNode 获取该块的其他可用副本。

2.5.3 元数据的磁盘故障

FsImage 和 EditLog 是 HDFS 的核心数据,这些数据的意外丢失可能会导致整个 HDFS 服务不可 用。为了避免这个问题,可以配置 NameNode 使其支持 FsImage 和 EditLog 多副本同步,这样
FsImage 或 EditLog 的任何改变都会引起每个副本 FsImage 和 EditLog 的同步更新。

2.5.4 支持快照

快照支持在特定时刻存储数据副本,在数据意外损坏时,可以通过回滚操作恢复到健康的数据状态。

3 HDFS 设计原理

高容错: 由于 HDFS 采用数据的多副本方案,所以部分硬件的损坏不会导致全部数据的丢失。
高吞吐量: HDFS 设计的重点是支持高吞吐量的数据访问,而不是低延迟的数据访问。
大文件支持: HDFS 适合于大文件的存储,文档的大小应该是是 GB 到 TB 级别的。
简单一致性模型: HDFS 更适合于一次写入多次读取 (write-once-read-many) 的访问模型。支持将内容追加到文件末尾, 但不支持数据的随机访问,不能从文件任意位置新增数据。
跨平台移植性: HDFS 具有良好的跨平台移植性,这使得其他大数据计算框架都将其作为数据持久化存储的首选方案。

故障检测机制

故障的类型主要有以下三种,针对这三种故障类型,HDFS提供了不同的故障检测机制:

  • 针对DataNode失效问题,HDFS使用了心跳机制,DataNode定期向NameNode发送心跳信息,NameNode根据心跳信息判断DataNode是否存活;
  • 针对网络故障而导致无法收发数据的问题,HDFS提供了ACK的机制,在发送端发送数据后,如果没有收到ACK并且经过多次重试后仍然如此,则认为网络故障;
  • 针对数据损坏问题,所有DataNode会定期向NameNode发送自身存储的块清单,在传输数据的同时会发送总和校验码,NameNode依次来判断数据是否丢失或损坏。

HDFS 容错机制

2.x版本中:

读容错

由于在读HDFS的过程中会从NameNode获取到数据块位置列表,如果某个DataNode失效,换个DataNode读即可。

写容错

写HDFS的过程中会对多个DataNode建立管道进行写入,如果数据发送者没有收到其中某个DataNode的ACK,则认为该DataNode失效,会跳过该DataNode并将数据写入剩余DataNode。NameNode收集DataNode信息时发现文件的副本数与设置值不一致,会重新寻找一个DataNode保存副本。

DataNode失效

在NameNode中会持有数据块表和DataNode两张表。数据块表存储着某个数据块(包括副本)所在的DataNode,DataNode表存储着每个DataNode中保存的数据块列表。由于DataNode会周期性地给NameNode发送自己所持有的数据块信息,因此NameNode会持续更新数据块表和DataNode表。如果发现某个DataNode上的数据块错误,NameNode会从数据块表删除该数据块;如果发现某个DataNode失效,NameNode会对两张表进行更新。NameNode还会周期性地扫描数据块表,如果发现数据块表中某个数据库的备份数量低于所设置的备份数,则会协调从其它DataNode复制数据到另一个DataNode上完成备份。

NameNode失效

SecondaryNameNode的机制:

SecondaryNameNode周期性的从NameNode 结点上下载磁盘镜像和日志文件(FsImage 和 EditLog),在本地将日志合并到镜像中,产生新的镜像,上传到NameNode,当NameNode结点重启时就会加载此最新的镜像文件,这个过程叫做CheckPoint,那么SecondaryNameNode会周期性的做CheckPoint,但是这种机制对于单点问题来说不是很理想,因为你做CheckPoint只能保存上次的元数据,那么CheckPoint之后的元数据在NameNode 失效后是会丢失的。

Avatar机制:

设置了一个叫做 Standby NameNode 的结点,原来的NameNode 叫做 PrimaryNameNode, 另外还有一个结点 NFS 用来存储 Primary NameNode 的日志和镜像文件。这里跟前面的解决机制不同的是 Standby NameNode 这个结点是 热备结点, 它不仅具有前面的CheckPoint的功能,还会周期性的读取 NFS结点上的 PrimaryNameNode 的日志来保持命名空间的同步,此外 DataNode 会同时向 Standby NameNode 和 PrimaryNameNode 发送心跳信息和数据块信息,这样,这两个结点的元数据信息是一致的,因此这也是为什么是热备结点的原因了。

该机制主要是提供了一个 Standby NameNode 结点作为 热备 ,这两个NameNode 结点的元数据会保持一致,在PrimaryNameNode 宕机时,Standby NameNode 切换为 PrimaryNameNode 的时间很短。

注: 镜像文件存储的是NameNode 的命名空间即目录树,就是将内存中的命名空间持久化到镜像文件中。

热备和冷备的区别

冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。
热备份是在数据库运行的情况下,采用archivelog mode方式备份数据库的方法。
热备份一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外一台实时的从前者中获取数据以保持数据一致.如果当前的机器熄火,备份的机器立马取代当前的机器继续提供服务

NFS应用场景

1、NFS(Network File system)是一种基于TCP/IP传输的网络文件系统协议
2、通过使用NFS协议,NFS客户机可以像访问本地目录一样访问远程NFS服务器中的共享资源。
3、在企业群集架构的工作场景中,特别是中小型网站公司,NFS网络文件系统一般被用来存储共享视频、图片等静态资源文件。列如将网站用户上传的文件放到NFS共享里面,通过网络共享,让网络上的其他服务器能够挂载访问共享目录内的数据

3.x版本的不同:
2.x中通过复制(浪费空间)来处理容错,3.x可以通过Erasure编码处理容错

Hadoop 3.x版本增添特性–纠删码介绍 https://blog.csdn.net/czz1141979570/article/details/96997989

  1. 纠删码可以将HDFS的存储开销降低约50%,同时与三分本策略一样,还可以保证数据的可用性。更准确的说是纠删码是一种比副本存储更节省存储空间的数据持久化存储方法
  2. 由于纠删码额外开销主要用于重建远程读写,它通常用来存储不经常使用的数据(冷数据)。
  3. 一旦数据需要恢复,它会造成2大资源的消耗:
    • 网络带宽的消耗,因为数据恢复需要去读其他的数据块和校验块
    • 进行编码,解码计算需要消耗CPU资源
  4. 最好的选择是用于冷数据集群
    • 冷数据集群往往有大量的长期没有被访问的数据,体量确实很大,采用EC技术,可以大大减少副本数
    • 冷数据集群基本稳定,耗资源量少,所以一旦进行数据恢复,将不会对集群造成大的影响