三、Hadoop分布式文件系统
1. 产生背景
-
数据量越来越大,一台独立的计算机已经无法存储所有的数据---->将大规模的数据存储到成百上千的计算机中------为了解决数据管理以及维护极其繁琐与低效------>分布式文件系统
-
分布式文件系统是管理网络中跨多台计算机存储的文件系统
-
GFS:谷歌公司开发了第一个大规模商业化应用的分布式文件系统
2. 概述
2.1 分布式文件系统简介
-
普通文件系统:一般会把磁盘空间划分为每512字节一组,称为“磁盘块”,它是文件系统读写操作的最小单位,文件系统的块(Block)通常是磁盘块的整数倍,即每次读写的数据量必须是磁盘块大小的整数倍(以块为单位进行读写)
-
分布式文件系统:也采用了块的概念,文件被分成若干个块进行存储,块是数据读写的基本单元,只不过分布式文件系统的块要比普通文件系统中的块大很多,比如,HDFS默认的一个块的大小是64MB,而且与普通文件系统不同的是,在分布式文件系统中,如果一个文件小于一个数据块的大小,它不会占用整个数据块的储存空间。(依然是块为基本单元,但块更大,同时,不满一个块的文件也不会占用整块存储空间,其他文件依然可以进行填充)
-
块比较大的目的:最小化寻址开销(HDFS寻址开销包括:磁盘的寻道开销和数据块的定位开销)
-
也不能太大:会影响并行的速度
-
设计:客户机/服务器(Client/Server)(客户端以特定的通信协议通过网络与服务器建立连接,提出文件访问请求,客户端和服务器可以通过设置访问权,来限制请求方对底层数据存储块的访问)
-
物理结构:由计算机集群中的多个节点构成的(节点分为两类)
- 主节点(Master Node)/名称节点(Name Node):负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块的映射关系
- 从节点(Worker Node)/ 数据节点(DataNode):负责数据的存储和读取。
-
存储方式:多副本存储(文件被复制多次被放在不同的位置,从而能够保障数据的完整性)
-
2.2 HDFS简介
- **HDFS(Hadoop Distribute File System)**是大数据领域一种非常可靠的存储系统,它以分布式方式存储超大数据量文件,但它并不适合存储大量的小数据量文件。
- HDFS要实现的目标:
- **兼容廉价的硬件设备:**实现在硬件故障的情况下也能保障数据的完整性
- **流数据读写:**不支持随机读写的操作
- **大数据集:**数据量一般在GB、TB以上的级别
- **简单的文件模型:**一次写入、多次读取
- **强大的跨平台兼容性:**采用
Java
语言实现
- HDFS的局限性:
- 不适合低延迟数据访问:HDFS主要是面向大规模数据批量处理而设计的,采用流式数据读取,具有很高的数据吞吐率,但是,这也意味着较高的延迟,因此,HDFS不适合用在需要较低延迟(如数十毫秒)的应用场合。
- **无法高效存储大量小文件:**小文件是指文件大小小于一个块的文件,HDFS无法高效存储和处理大量的小文件,过多小文件会给系统扩展性和性能带来诸多问题:
- HDFS采用名称节点(NameNode)来管理文件系统的元数据,这些元数据被保存在内存中,使客户端可以快速获取文件实际存储位置。
- 用MapReduce处理大量小文件时,会产生过多的Map任务,线程管理开销会大大增加,因此处理大量小文件的速度远远低于处理同等大小的大文件的速度;
- 访问大量小文件的速度远远低于访问大文件的速度,因为访问大量小文件,需要不断从一个数据节点跳到另一个数据节点,严重影响性能。
- 不支持多用户写入及任意修改文件:HDFS只允许一个文件有一个写入者,不允许多个用户对同一个文件执行写操作,而且只允许对文件执行追加操作,不能执行随机写操作。
3. HDFS的体系结构
- 结构模型:主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点和若干数据节点
- 名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问
- 数据节点负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作
- 每个数据节点会周期性地向名称节点发送**“心跳"信息**,报告自己的状态,没有按时发送心跳信息的数据节点会被标记为“宕机”,不会再给它分配任何I/O请求。(用来判断数据节点是否正常工作的方式)
- 文件存储:一个文件被分为若干数据块----->若干数据块存储到若干数据节点上
- 访问:客户端-----文件名----->名称节点------根据文件名找到------>数据块 ------数据块存储信息------->数据节点的位置------节点位置信息------>客户端 —直接访问对应位置–>获得数据
4. HDFS的存储原理
4.1 数据的冗余存储
- 目的:保证系统的容错性和可用性
- 冗余存储的方式:多副本方式(即一个数据块的多个副本会被分布到不同的数据节点上)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEVeGbzh-1676720254593)(null)]
- 优点:
- 加快数据传输速度:当多个客户端需要同时访问同一个文件时,可以让各个客户端分别从不同的数据块副本中读取数据,这就大大加快了数据传输速度,实现了并行操作。
- 容易检查数据错误:HDFS的数据节点之间通过网络传输数据,采用多个副本可以很容易判断数据传输是否出错。
- 保证数据的可靠性:即使某个数据节点出现故障失效,也不会造成数据丢失。
4.2 数据存取策略
4.2.1 数据存放
-
采用了以机架(Rack)为基础的数据存放策略。一个HDFS集群通常包含多个机架,不同机架之间的数据通信需要经过交换机或路由器,同一机架的不同机器之间数据通信不需要交换机或路由器,因此同一机架中不同机器之间的通信要比不同机架之间机器的通信带宽大。
-
HDFS默认每个数据节点都是在不同机架上的
- 缺点:
- 写入数据的时候不能充分利用同一机架内部机器之间的带宽
- 优点
- 可以获得很高的数据可靠性,即使一个机架发生故障,位于其他机架上的数据副本仍然可用
- 在读数据的时候,可以在多个机架上并行读取数据,大大提高了数据读取速度。
- 可以更容易实现系统内部负载均衡和错误纠正。
- 缺点:
-
HDFS默认的冗余复制因子是 3,每一个文件会被同时保存到 3 个地方,其中两份副本放在同一个机架的不同机器上面,第三个副本放在不同机架的机器上面。
-
HDFS副本的存放策略是:
- 如果是在集群内发起写操作请求,则把第1个副本放置在发起写操作请求的数据节点上,实现就近写入数据。如果是来自集群外部的写操作,则从集群内部挑选一台磁盘空间较为充足、CPU不太忙的数据节点,作为第1个副本的存放地。
- 第2个副本会被放置在与第1个副本不同的机架的数据节点上。
- 第3个副本会被放置在与第1个副本相同的机架的其他节点上。
- 如果还有更多的副本,则继续从集群中随机选择数据节点进行存放
4.2.2 数据读取
- HDFS提供了一个API,用于确定一个数据节点所属的机架的ID,客户端可以调用该API获取自己所属机架的ID。
4.2.3 数据复制
- 流水线复制:当客户端要向HDFS中写入一个文件时,这个文件会首先被写入本地,并被切分成若干个块,每个块的大小是由HDFS的设定值来决定。每个块都向HDFS集群中的名称节点发起写请求,名称节点会根据系统中各个数据节点的使用情况,选择一个数据节点列表返回给客户端,然后客户端就把数据首先写入列表中的第1个数据节点,同时把列表传给第1个数据节点,当第1个数据节点接收到一个块的数据的时候,将其写入本地,并且向列表中的第2个数据节点发起连接请求,把自己已经接收到的数据和列表传给第2个数据节点,当第2个数据节点接收到数据的时候,将其写入本地,并且向列表中的第3个数据节点发起连接请求,依次类推,列表中的多个数据节点形成一条数据复制的流水线。最后,当文件写完的时候,数据复制也同时完成。
4.3 数据错误与恢复
4.3.1 名称节点出错
- 保证名称节点安全的方式:
- 把名称节点上的元数据信息同步存储到其他文件系统中
- 运行一个第二名称节点,当名称节点宕机以后,利用第二名称节点中的元数据信息进行系统恢复(仍然会丢失部分数据)
- 一般是两者结合使用,当名称节点宕机时,首先到远程挂载的网络文件系统中获取备份的元数据信息,放到第二名称节点上进行恢复,并把第二名称节点作为名称节点来使用。
4.3.2 数据节点出错
- 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态。当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自这些节点的“心跳”信息,这时,这些节点就会被标记为“宕机”,节点上面的数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求(与HDFS的体系结构下的内容一致)
4.3.3 数据出错
- 网络传输和磁盘错误等因素都会造成数据错误。客户端在读取到数据后,会采用
md5
和sha1
对数据块进行校验,以确保读取到正确的数据。在文件被创建时,客户端会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面。 - 当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验。如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。
5. HDFS的数据读取过程
- 参考此链接