主要介绍大数据存储与管理相关技术的概念和原理。

  • Hadoop分布式文件系统(HDFS):提供了在廉价服务器集群中进行大规模分布式文件存储的能力。
  • 分布式数据库HBase:是一个高可靠、高性能、面向列、可伸缩的分布式数据库,主要存储非结构化和半结构化的松散数据。
  • NoSQL数据库:支持超大规模数据存储,灵活的数据模型可以很好地支持Web2.0应用,具有很强的横向扩展能力。
  • 云数据库:将用户从繁琐的数据库硬件定值中解放。

1. 分布式文件系统结构

分布式文件系统(Distributed FIle System)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。其设计一般采用“客户机/服务器”(Client/Server)模式。
HDFS默认的一个块是64MB,文件小于64MB,不占用整个数据块的存储空间。降低了单位数据的寻址开销。
分布式文件系统在物理结构上由计算机集群中的多个节点构成,这些节点分为两类,一类是主节点(名称节点)、另一类是从节点(数据节点)

  • 名称节点负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块的映射关系,客户端只有访问名称节点才能找到请求的文件块所在的位置,进而到相应位置读取所需文件块。
  • 数据节点负责数据的存储和读取

第三章 分布式文件系统HDFS - 图1

2. HDFS概述

应用局限性:

  • 不适合低延迟数据访问:HDFS是面向大规模数据批处理而设计的,采用流式数据读取,有较高的数据吞吐率,但同时意味着较高的延迟。对低延迟的应用程序,HBase较为合适。
  • 无法高效存储大量小文件:小文件指的小于一个块的文件
  • 不支持多用户写入及任意修改文件:只允许对文件执行追加操作,不能执行随机写操作(不能在任意位置添加内容,但可以完全替换追加)

    2.1 名称节点

    名称节点(NameNode):负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构。记录了文件中各个块所在的数据节点的位置信息。

    • FsImage:维护文件系统树及其元数据
    • Editlog:记录了针对所有文件的创建、删除、重命名等操作

NameNode记录了每个文件中各个块所在的数据节点的位置信息,但并不持久化保存,是存放在内存中,系统每次启动时扫描所有数据节点重构得到这些信息。

NameNode启动时,将FsImage的内容加载到内存中,然后执行EditLog文件中的各项操作,使内存中的元数据保持最新。操作完成后,会创建一个新的FsImage和EditLog。名称节点在启动过程中处于“安全模式”,只能对外提供读操作无法提供写操作。启动结束后,退出安全模式,进入正常运行。
HDFS的更新操作不会直接写入到FsImage中,而是先写入EditLog,因为FsImage一般都会比较大。

2.2 数据节点

数据节点负责数据的存储和读取,定期向名称节点发送自己所存储的块的列表每个数据节点的数据会被保存在各自节点的本地Linux的文件系统中

2.3 第二名称节点

第二名称节点(Secondary NameNode):名称节点运行期间,HDFS的更新操作会不断写入到EditLog中,虽然这通常不会显著影响系统性能,但当名称节点重启,需要将FsImage加载到内存中,需要逐条执行EditLog中的记录。如果EditLog很大,就会导致整个重启过程缓慢,使系统长期处于安全状态中,无法对外提供写操作。

  • 完成FsImage和EditLog的合并操作。减小EditLog文件大小,缩短名称节点重启时间
  • 作为名称节点的“检查点”,保存名称节点中的元数据信息,起到备份作用。

需要注意的是,第二名称节点只起到“检查点”的作用,并不能起到热备份作用,HDFS也不支持直接从名称节点切换到第二名称节点。所以当名称节点发生故障时,系统也可能会丢失部分元数据信息的
第三章 分布式文件系统HDFS - 图2

3. HDFS体系结构

第三章 分布式文件系统HDFS - 图3
HDFS集群中只有唯一一个名称节点,其一般采用性能较好的机器,用户数据永远不会经过名称节点,大大减轻了中心服务器的负担。

命名空间:
HDFS命名空间包含目录、文件和块。命名空间管理是指命名空间支持对HDFS中的目录、文件和块做类似文件系统的创建、修改、删除等基本操作。

通信协议:
所有的HDFS通信协议都是构建在TCP/IP协议基础上的。客户端提供一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互。名称节点和数据节点之间则使用数据节点协议进行交互。客户端与数据节点之间则使用RPC(Remote Procedure Call)实现。设计上,名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求。
注:Web管理页面也属于客户端,只要来源是集群外部的点。
第三章 分布式文件系统HDFS - 图4

局限性:

  • 命名空间受内存空间大小的限制
  • 性能的瓶颈:受限于当个名称节点的吞吐量
  • 隔离问题:整个集群中只有一个名称节点,只有一个命名空间,无法对不同应用程序进行隔离。
  • 集群可用性:一旦唯一的名称节点宕机,整个集群不可用

    4. HDFS存储原理

    4.1 数据冗余存储

    数据块多副本存储

  • 提高读取效率:当多个客户端需要同时访问一个文件时,可以让各个客户端分别从不同的数据块副本中读取数据。

  • 便于校验数据一致性:因为一个文件的数据块存储在多个数据节点中,可以校验数据传输的正确性。
  • 保证数据可靠性:即使一个数据节点出现故障,也不会造成数据丢失。假设冗余复制因子为3,当一个副本所在节点宕机后,因为宕机后不能定期向名称节点发送心跳检测,系统会自动检测,再复制一份副本,使总副本数恢复3.

第三章 分布式文件系统HDFS - 图5

4.2 数据存取策略

4.2.1 数据存放

HDFS采用了以机架(Rack)为基础的数据存放策略。一个HDFS集群通常包含多个机架,不同机架之间的数据通信需要经过交换机或者路由器,同一个机架中不同节点之间的通信不需要经过交换机和路由器。这意味同一个机器中不同机器的通信要比不同机架间机器的通信带宽大。
HDFS默认每个数据节点都是在不同的机架上,虽然这样做不能有效利用同一机架内部节点之间的较大带宽,但这种做法带来更多有点:

  • 高可用
  • 并行读取,提高读取效率
  • 容易实现系统内部负载均衡和错误处理

HDFS默认冗余复制因子是3,意味着一个文件块要被复制到3个节点中,其中有两份副本放在同一个机架的不同机器上,第三个副本放在不同机架的节点上。

  • 第一个数据副本存放策略:
    • 若发起请求是来自集群内部的节点,则将第一个副本放在该发起请求的数据节点上,就近原则
    • 若来自集群外的节点,则选择一台磁盘空间不太满,CPU不太忙的数据节点进行存储。
  • 第二个数据副本存放策略:存在与第一个数据副本不同的机架的节点
  • 第三个数据副本:存在与第一个副本相同机架的节点上
  • 第4,5,….,n:随机挑选节点进行存储。

第三章 分布式文件系统HDFS - 图6

4.2.2 数据读取

HDFS提供API可以查询数据节点和客户端所属的机架ID。当客户端读取数据时,向名称节点发起请求,名称节点返回数据块不同副本存放数据节点的列表。客户端通过API查询数据节点所在的机架,优先从自己所在机架相同的数据节点读取。若没有,则随机读取。

4.2.3 数据复制

流水线复制
当客户端向HDFS写入一个文件时,先将文件写入本地文件系统,并被切分为若干块,块的大小是由HDFS设定的。每个块都向名称节点发起请求,名称节点返回一个数据节点列表给客户端,客户端首先将数据写入第一个数据节点,同时将列表传入第一个数据节点,当第一个数据节点接受到4KB数据时,写入本地,同时向第二个数据节点发起连接请求,并将自己接收到的4KB数据和数据节点列表传给第二个数据节点,依次类推。

4.3 数据的错误和恢复

HDFS集群采用廉价的硬件,因此节点出错是一种常态而不是错误。

4.3.1 名称节点出错

名称节点两大核心数据结构FsImage和EditLog,通常会将下述两种方式结合使用

  • 将名称节点元数据同步到其他文件系统(例如远程挂载的网络文件系统NFS)
  • 使用第二名称节点

4.3.2 数据节点出错

每个数据节点会定期向名称节点发送“心跳”信息,报告自己状态。当名称节点无法收到数据节点的信息时,就将其标记为“宕机”,当名称节点发现一些数据块的副本数量小于冗余因子,则会启动数据冗余复制。
HDFS与其他分布式文件系统最大区别就在于可以调整冗余数据的位置(当节点负载严重不均衡时也可以进行数据块的迁移)

4.3.1 数据出错

客户端在接收到数据后,会采用MD5sha1对数据块进行校验。在文件被创建时,客户端就会对每一个文件块进行信息摘录,并将这些信息写入同一个路径的隐藏文件里。当客户端读取文件时,会先读取该信息文件,然后结合读取到的数据进行校验。若出错,则客户端会从其他节点读取,并向名称节点报告错误,名称节点会定期检查并重新复制这个快。
注意:名称节点不一定理解检查,出错原因也可能是传输过程出错,数据节点存储无误,优先级可以调整。