大数据 HDFS 的历史、特性、适用场景 运行机制、数据布局、读写流程、容错机制等

作者:禅与计算机程序设计艺术

1.简介

大数据的快速增长、高并发、海量数据、多样化的数据源、动态变化的数据特征,给数据的分析、挖掘带来了巨大的挑战。而HDFS就是存储大数据的一个关键组件。HDFS是一个分布式文件系统,主要用来存储和处理超大规模的数据集。HDFS可以方便地将不同机器上的小文件聚合成大文件,通过高容错性保证大文件的完整性和一致性。HDFS支持流式访问模式,具有高吞吐量和低延迟,能够满足各种业务场景的需求。HDFS在Hadoop生态系统中扮演着至关重要的角色,随着互联网公司、金融机构等对大数据采取新型应用时代,HDFS也逐渐成为越来越热门的技术。
本文会首先从HDFS的背景介绍入手,介绍HDFS的历史、特性、适用场景等;然后会详细阐述HDFS的设计理念和设计目标;接着会介绍HDFS的运行机制、数据布局、读写流程、容错机制等,并通过实例讲解HDFS的相关技术知识点;最后会谈论HDFS未来的发展方向和一些挑战。

2.基本概念及术语

2.1 Hadoop简介

Hadoop(开源的可伸缩计算框架)是Apache基金会孵化的一款开源项目,是一个框架,可以帮助您进行大规模数据处理,它由Apache软件基金会开发,遵循Apache授权协议。其主要包括HDFS(Hadoop Distributed File System)、MapReduce、YARN(Yet Another Resource Negotiator)等模块,具备高度扩展性、高可用性、容错性、灾难恢复能力,而且提供强大的工具支持、框架支持和生态环境。

2.1.1 HDFS

1997年,当时的Google从基于磁盘的MapReduce框架转向基于网络的文件系统GFS。GFS根据Google的文件存储需求,设计出了一套新的文件系统HDFS,通过将数据切分成固定大小的分块(block),然后将这些分块存储在不同的机器上,实现数据的分块式存储。HDFS通过提供高容错性和弹性扩展的特点,满足大数据应用的需求。HDFS被广泛使用在大数据处理中,尤其是在云计算、大数据搜索引擎、日志采集、推荐系统、搜索等领域。
HDFS的组成

  • NameNode: 文件系统的主节点,管理文件系统的命名空间和集群的元数据信息。
  • DataNodes: 数据节点,保存文件数据,提供块服务。
  • SecondaryNameNode(SNN): 辅助节点,用于维护HDFS状态,并进行Fsck操作。
  • Datanode守护进程(DataNode Process): 每个工作节点都要启动此进程,负责数据块的块传输,以及运行客户端操作请求。
  • Client: 使用客户端(如hadoop命令)操作HDFS,比如创建目录、上传或下载文件等。
    HDFS的优点:
  • 支持超大文件:HDFS提供了超过100TB的容量,适应于海量数据分析。
  • 高容错性:HDFS采用的是主从架构,能够自动切换故障节点,保障数据安全。
  • 高吞吐量:HDFS具有良好的性能,能轻松读取数PB数据。
  • 可靠性:HDFS提供了自动检查点功能,确保数据安全。
    HDFS的缺点:
  • 不支持随机写入:HDFS采用追加模式写入文件,不支持随机写入,只能顺序写。
  • 没有事务支持:HDFS没有提供事务支持,不能保证数据的一致性。

2.2 MapReduce简介

Google MapReduce是Google的大数据处理技术,也是Google内部通用的大数据处理模型。它把复杂的大数据运算过程拆分为多个独立的任务,并行执行,最后汇总结果得到最终结果。
MapReduce的编程模型遵循"Map-Reduce",即先把输入的数据划分到各个逻辑独立的任务(map)上,然后再把这些任务组装起来(reduce),得到结果。下面简单介绍一下MapReduce的几个重要概念。

2.2.1 Job

用户编写的MapReduce作业称为Job。每个Job中都包含三个主要的元素:Mapper、Reducer和输入输出路径。

  • Mapper:负责读取输入数据,将每条记录转换成键值对形式,然后将它们传给Reducer进行处理。
  • Reducer:负责对Mapper的输出进行汇总,将相同键的记录合并成一个组。
  • 输入输出路径:指定作业的输入和输出路径。

2.2.2 Partition

在实际的数据处理过程中,会出现数据倾斜的问题,也就是某个map或者reduce处理得慢的原因。这时候,可以通过增加reducer数量来解决数据倾斜问题。但是,在增加reducer数量之前,需要先对数据进行partition,把数据平均分配到多个区间,这样可以减少网络传输的时间,提升效率。Partition可以使得相同的数据在同一个map或者reduce上处理,减少网络传输和IO等待时间,达到加速作业执行的目的。

2.2.3 Combiner函数

当Reducer处理完一个分区后,可能产生一个中间结果。如果这个中间结果不是立即要用到的,那么可以直接丢弃掉。Combiner就是用于解决这个问题的。Combiner是一个在Map端进行局部处理,并且在shuffle的时候就可以看到它的效果了。Combiner在Reducer执行前,会收集所有Map端的输出,并把它们聚合成一个值传递给Reducer。这样可以避免在Reducer端进行过多的序列化和反序列化操作。Combiner对于性能的影响非常小,因为它只发生在Map端。

2.3 Yarn简介

Apache Hadoop YARN (Yet Another Resource Negotiator) 是另一种资源管理系统,它是一个开放源代码的集群管理器,可以运行Hadoop框架中的应用程序,同时提供资源调度和故障恢复功能。YARN使Hadoop更加能够适应不同的环境和规模,提供统一的、透明的接口,帮助用户简化 Hadoop 的使用。YARN 包括两个主要组件:ResourceManager 和 NodeManager 。 ResourceManager 是 YARN 的中心组件,负责整个集群的资源管理和分配。它接收客户端请求,动态地为应用程序申请资源,并协调各个 NodeManager 分配它们所需的资源。NodeManager 则是 YARN 中的 worker,负责运行任务,监控和报告集群的状态。两者相互配合,共同为用户提供分布式计算平台。

3.HDFS概述

3.1 背景介绍

3.1.1 HDFS简介

Hadoop Distributed File System (HDFS) 是 Hadoop 项目的一个子项目,主要解决了大数据存储问题。HDFS 是一个分布式文件系统,支持文件的存储、集群间的数据共享、容错机制、HDFS 经过高度优化,速度快,功能全面。HDFS 可以部署在廉价的商用服务器上,并通过网络访问,具有高容错性,可以实现海量数据的存储、处理和分析。HDFS 为 Hadoop 的海量数据处理提供了一种全新方案。

3.1.2 HDFS架构

HDFS 由三台或者更多的服务器组成,作为集群参与其中。HDFS 以 master/slave 模式工作,一个是名称节点 NameNode,其他为数据节点 DataNode。
NameNode 是 HDFS 的主节点,负责管理文件系统的命名空间和集群的元数据信息。它负责定时获取底层硬件的状态,向 DataNode 报告数据的位置信息,并处理客户端读写请求。它还维护整个集群中文件的元数据,如文件的名字、属性、块信息等。HDFS 允许通过 HTTP 或 NFS 来访问数据,HDFS 可以部署在廉价的商用服务器上,通过网络访问,具有高容错性。DataNode 是 HDFS 的工作节点,存储文件数据,提供块服务。它接收来自其它 DataNode 或客户端的读写请求,并将数据存放在本地磁盘上,然后返回给请求方。

3.2 设计目标

HDFS 是 Hadoop 中一个非常重要的模块,它充分考虑了数据存储和处理的要求,同时又不需要依赖底层的存储设备。HDFS 提供了高容错性和高吞吐量,并且支持超大文件。HDFS 的设计目标如下:

3.2.1 高容错性

HDFS 通过副本机制来实现数据冗余,可以自动故障切换,无缝地替换失败的节点。它通过心跳检测来发现失效的 DataNode,并将其上的块复制到其它节点上,实现数据的高可用。HDFS 对大文件也有很好的压缩能力,能够有效降低存储成本。

3.2.2 高吞吐量

HDFS 使用流式访问模式,能够实现低延迟的读写操作。HDFS 能够采用异步通信机制,使单个文件的读写操作能够快速完成。HDFS 支持高吞吐量的数据读写,能够支持数 TB 的数据存储和处理。

3.2.3 数据访问透明

HDFS 提供了两种访问方式:NFS 和 HTTP。NFS 是 Network File System,通过网络访问 HDFS 数据,NFS 有较好的性能表现,但受限于网络带宽。HTTP 是 Hypertext Transfer Protocol,通过浏览器访问 HDFS 数据,能够在线查看文件,但不支持数据修改。HDFS 将数据访问的控制权完全交给客户端,并通过 NameNode 进行访问权限的控制。

4.HDFS运行机制

4.1 数据块

HDFS 以数据块(Block)为基本单位来组织文件。一个文件可以看成由很多数据块组合而成,一个数据块默认大小为 64MB。数据的存储、读取都是以数据块为单位的。数据块的大小决定了 HDFS 的高效率,也限制了单个文件的最大值。数据块的选择也会影响 HDFS 的吞吐量。

4.2 NameNode&SecondaryNameNode(SNN)

HDFS 的 NameNode 和 SecondaryNameNode(SNN) 是一个主从架构。NameNode 是主节点,负责管理文件系统的命名空间和集群的元数据信息,包括文件到数据块的映射关系、权限控制、配额设置等;SNN 是辅助节点,用于维护 HDFS 状态,并进行 Fsck 操作。

4.2.1 名称空间

文件系统中的所有文件和文件夹都在名称空间中唯一标识。文件系统的根目录为 “/” ,所有的文件都在此目录下。用户也可以创建子目录,每个子目录可以包含属于自己的文件和子目录。HDFS 的文件系统树结构简化了客户端的操作。

4.2.2 元数据

元数据包括文件的名字、数据所在的数据块、权限、最后一次修改时间等。元数据也是 HDFS 最核心的内容之一,元数据的存储可以支撑着 HDFS 的高可用性。

4.2.3 检查点

检查点是一个数据一致性的重要手段。HDFS 会定期做检查点,把当前的 Namespace 和 Block 信息存储在内存中。在发生意外崩溃时,可以利用检查点进行数据恢复。

4.3 DataNode(DataNode Process)

HDFS 的 DataNode 就是存储文件数据的地方。它位于 HDFS 集群中,存储数据并响应客户端的读写请求。它既可以作为一般的计算节点参与集群,也可以作为 NameNode 的 slave 节点,参与块的复制和读写。DataNode 会周期性向 NameNode 上报心跳,汇报当前已使用存储空间、总存储空间等信息。如果 DataNode 一段时间内未上报心跳,就会认为其宕机,并将该节点上的所有数据块复制到其它 DataNode。

4.3.1 数据备份

HDFS 的数据块默认有 3 个副本,且这些副本存放在不同的数据节点中。如果某个数据块的三个副本分别在 A、B、C 三个数据节点,那说明它在不同数据节点上存在备份。

4.3.2 写入处理

HDFS 的数据写入通常是按照数据块的方式进行的。HDFS 会根据负载均衡的策略,将数据流平均分配到多个节点上。每个数据块的副本都是永久存储在不同的数据节点中,写操作不会造成阻塞。

4.3.3 读取处理

HDFS 的读取请求会首先发送到哪些数据节点,然后再从这些节点上读取。HDFS 根据负载均衡的策略,将读操作路由到距离最近的节点上,可以避免单个节点的负载过重。HDFS 支持流式访问模式,能够在一定程度上避免网络传输带来的延迟。

5.HDFS的读写流程

5.1 写操作

HDFS 的写操作由两步完成:首先,客户端请求 NameNode 创建一个文件,NameNode 检查文件是否已经存在,若不存在,则创建一个新的文件并返回给客户端。其次,客户端向指定的 DataNode 节点写入数据,DataNode 将数据追加到对应的数据块末尾。在写入数据块之前,会检查副本数是否满足最小数目。如果满足,就将数据块同步到两个数据节点上;否则,就创建第三个副本。

5.2 读操作

HDFS 的读操作由两步完成:首先,客户端向 NameNode 查询要读取的文件所在的数据节点,并将请求发送到相应的数据节点。其次,DataNode 从磁盘读取数据并返回给客户端。

6.HDFS的容错机制

6.1 副本机制

HDFS 使用副本机制来实现数据冗余,可以自动故障切换,无缝地替换失败的节点。它通过心跳检测来发现失效的 DataNode,并将其上的块复制到其它节点上,实现数据的高可用。
HDFS 将数据块存放在不同的节点上,形成一个独立的存储体系,即数据块副本。副本的数量一般设置为 3 个。数据块的三个副本分别存放在不同的节点上,有利于 HDFS 的容错机制。当某些节点损坏时,HDFS 会自动检测到,并将对应的副本从损坏的节点上复制到正常的节点上,实现数据的自动恢复。
如果副本数不足,则需要再生成新的副本,这样才能实现数据冗余。HDFS 在写入数据块之前,会检查副本数是否满足最小数目。如果满足,就将数据块同步到两个数据节点上;否则,就创建第三个副本。如果副本数不足,则需要再生成新的副本,这样才能实现数据冗余。HDFS 会周期性扫描底层硬件的健康状况,并根据情况决定是否创建新的副本。

6.2 块扫描和数据校验

HDFS 通过心跳检测机制来发现失效的 DataNode。当一个 DataNode 失效时,HDFS 会自动触发数据块扫描,对失效节点上的数据块进行检查。扫描的过程会验证每个数据块的校验和,如果发现错误,就会将错误数据块重新复制到其他 DataNode。

7.HDFS读写流程详解

7.1 写操作

7.1.1 创建文件

创建文件包括两个阶段:首先,客户端请求 NameNode 创建一个文件,NameNode 检查文件是否已经存在,若不存在,则创建一个新的文件并返回给客户端。其次,客户端向指定的 DataNode 节点写入数据,DataNode 将数据追加到对应的数据块末尾。
下图展示了一个典型的写操作:

创建文件
  1. 客户端请求创建文件 /user/test/file1。
  2. NameNode 收到请求,为文件生成一个全局唯一的标识。
  3. NameNode 返回文件标识给客户端。
定位写入位置
  1. 客户端选择一个 DataNode,将文件写入到该节点的对应目录下。
  2. 文件切分成多个数据块。
  3. 数据块编号递增。
  4. 客户端将每个数据块的第一个字节打上标记。
  5. 记录数据块编号到元数据中。
  6. 将数据块写入到磁盘。
通知副本节点
  1. 客户端将元数据信息通知 NameNode。
  2. NameNode 将元数据信息传播给其它数据节点。
  3. 除非手动关闭,否则默认情况下,NameNode 维持一个副本。

7.1.2 写数据

写数据包括两个阶段:首先,客户端向指定的 DataNode 节点写入数据,DataNode 将数据追加到对应的数据块末尾;其次,NameNode 发现数据写入成功后,将元数据信息通知其他数据节点,完成数据块的同步。
下图展示了写数据操作:

定位写入位置
  1. 客户端请求定位写入位置,通过缓存中的元数据信息判断数据块位置。
  2. 请求相应的数据节点写入数据。
  3. 数据块在磁盘上追加数据。
  4. 数据块在内存中加锁,防止重复写入。
通知副本节点
  1. 数据写入成功后,通知 NameNode。
  2. NameNode 更新元数据信息。
  3. 数据同步到其他数据节点。

7.1.3 关闭文件

关闭文件包括两步:首先,NameNode 获取文件的所有数据块的列表;然后,NameNode 将元数据信息通知数据节点,关闭文件。
下图展示了关闭文件操作:

获取文件数据块列表
  1. NameNode 获取文件的所有数据块列表。
  2. 将数据块列表保存到内存中,便于后续的操作。
通知副本节点
  1. 关闭文件并通知其他数据节点。
  2. 删除失效的副本。

7.2 读操作

7.2.1 查找目标文件

查找目标文件包括两个阶段:首先,客户端请求 NameNode 查找目标文件,NameNode 根据文件名找到元数据信息;然后,客户端向找到的任意一个数据节点发起读请求。
下图展示了查找目标文件操作:

查找元数据信息
1. 客户端请求 NameNode 查找目标文件,NameNode 返回文件标识。
  1. 客户端根据文件标识找到 Meta 文件,并解析出文件的位置信息。
  2. 客户端从本地缓存中查询元数据信息。
  3. 如果缓存中没有,则请求对应的 DataNode 节点。

7.2.2 定位数据位置

定位数据位置包括两个阶段:首先,客户端向找到的任意一个数据节点发起读请求,DataNode 根据数据块的位置信息将数据块读取到内存缓冲区;然后,客户端从内存缓冲区中解析出需要的数据。
下图展示了定位数据位置操作:

读取数据块
 1. 客户端向 DataNode 发起请求,读取数据块。
2. 数据块在磁盘上加载到内存缓冲区。
3. 从内存缓冲区解析出所需数据。

7.2.3 数据校验

数据校验包括两个阶段:首先,客户端从内存缓冲区解析出需要的数据;然后,客户端对数据进行校验,确保数据正确无误。

8.HDFS的未来发展方向与挑战

8.1 数据局部性

HDFS 通过 Block 机制实现数据的局部性。由于 Block 之间有冗余的拷贝,因此多个客户端可以并发地访问数据。Block 大小默认为 64MB,因此 HDFS 更容易适应数据局部性。HDFS 目前不支持跨 Block 的数据访问,不过它正在开发对跨 Block 范围数据的访问。

8.2 数据压缩

HDFS 支持数据压缩。压缩可以节省磁盘空间和网络传输时间,并改善数据处理性能。目前 HDFS 默认使用 Gzip 压缩格式,可以使用配置参数更改压缩格式。

8.3 块迁移

数据块迁移指的是把数据从当前的位置移动到其他的存储节点上,以保证数据块的高可用性。HDFS 支持块的迁移,并通过心跳消息、块扫描和副本更新等方式保证数据的安全。HDFS 当前的块迁移算法为依据规则进行选择,并没有刻意考虑数据局部性。HDFS 正在研究新的块迁移策略,以提升数据局部性。

8.4 数据保护

HDFS 提供数据保护机制。HDFS 可以指定用户对文件的访问权限,并实施数据密级分类。数据密级分类可以区分不同级别的数据,实现不同级别的访问控制。

9.附录

9.1 一些问题

Q: HDFS 支持创建多少个文件?
A: HDFS 中的文件和目录都在 HDFS 的文件系统树中唯一标识。HDFS 不支持无限数量的文件,每个目录最多允许创建 1000 个子目录和文件,所以理论上可以支持 10^10 个文件。
Q: 如何确定一个数据块是否有必要存在多个副本?
A: 由于数据块的副本分布在不同的结点上,因此需要保证数据块的副本数大于等于数据节点数目才能保证数据块的高可用性。HDFS 建议副本数不要小于数据节点数目,这样才能够保持数据块的高可用性。HDFS 还建议副本数不要小于等于 3 个。
Q: HDFS 写操作之后,是否需要通知 NameNode?
A: HDFS 的写操作由两步完成:首先,客户端请求 NameNode 创建一个文件,NameNode 检查文件是否已经存在,若不存在,则创建一个新的文件并返回给客户端。其次,客户端向指定的 DataNode 节点写入数据,DataNode 将数据追加到对应的数据块末尾。在写入数据块之前,会检查副本数是否满足最小数目。如果满足,就将数据块同步到两个数据节点上;否则,就创建第三个副本。只有 NameNode 将元数据信息通知数据节点,关闭文件后,才表示写操作结束。
Q: 是否支持数据流式访问?
A: HDFS 支持数据流式访问,可以在一定程度上避免网络传输带来的延迟。
Q: HDFS 块的大小建议设为多少?
A: 块的大小建议设置为 64MB。块的大小可以调整,但是太大可能会导致性能下降,太小可能会导致频繁的垃圾回收和磁盘扫描。
Q: HDFS 是否支持加密?
A: 支持数据加密,数据会在传输和存储过程中进行加密。
Q: HDFS 是否支持 Kerberos 认证?
A: 支持 Kerberos 认证。
Q: 对于 SSD,是否建议使用固态硬盘?
A: 对于 SSD,建议使用固态硬盘。HDFS 可以支持具有很高 IOPS 的 SSD。
Q: 是否支持 kerberos 加密认证?
A: 支持 kerberos 加密认证,数据传输在传输过程中会进行加密。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/132126736
今日推荐