【大数据架构综述】文件系统篇之HDFS概述

HDFS

一、HDFS是什么

HDFS(Hadoop Distribute File System)是基于流数据访问模式(“一次写入,多次读取”)的分布式文件系统,支持海量数据的存储。

HDFS就是GFS思想的开源实现。GFS是Google公司在2003年发布的Google File System论文,是GFS思想的开源实现。HDFS的高容错性,高吞吐量,高扩展性等特点,可以很好地解决海量数据的存储问题。

HDFS的优点

  1. 处理超大文件
  2. 支持流式数据访问,一个数据集一旦生成,会被复制分发到不同的存储节点,然后相应各种数据分析任务请求;
  3. 低成本运行,能运行在低廉的商用硬件集群上。

HDFS的缺点

  1. 不适合处理低延迟的数据访问,它主要处理高数据吞吐量应用;
  2. 不适合处理大量小文件,文件系统的容量由NameNode(下方会介绍)内存大小决定,小文件太多会消耗NameNode内存;
  3. 不适合多用户写入以及任意修改文件,多个用户对同一文件的写操作,在文件任意位置进行修改。

若你是想将数据一次写入后多次读取,那么选择用HDFS存储数据是再合适不过了。


二、HDFS的组成与架构

HDFS是将大数据文件切分成若干小的数据块,再把这些数据块分别写入不同的节点中。

【大数据架构综述】文件系统篇之HDFS概述_第1张图片

下面是HDFS的组件:

  • DataNode(数据节点):负责保存文件数据的节点,保存数据块

    • 启动DataNode线程,向NameNode定义汇报数据块信息
    • 定期向NameNode发送心跳信息
    • 作为服务器接收来自客户端的访问,处理数据块的读写请求
  • NameNode(名称节点):负责保存文件属性信息的节点,它不存储数据

    • 管理和维护HDFS的命名空间(NameSpace):维护文件系统树和文件树中所有文件的元数据。
      • fsimage(镜像文件):包含文件系统中所有目录和文件的序列化信息。对于文件,它包含有修改信息、访问时间、块大小和组成一个文件的数据块信息等;对于目录,它包含有修改时间、访问控制权限等信息。HDFS架构图
      • editlog(操作日志):在NameNode已启动的情况下对HDFS进行各种操作的记录。
    • 管理DataNode上的数据块(Block):存储HDFS的元数据(MetaData)
    • 接收客户端的请求
  • SecondaryNameNode(第二名称节点):负责定期将NameNode的fsimage和edits下载到本地,并将它们加载到内存进行合并,最后将合并后的新的fsimage上传回NameNode,这过程称作检查点(CheckPoint)

【大数据架构综述】文件系统篇之HDFS概述_第2张图片

SecondaryNameNode的工作流程:

  1. 请求:SecondaryNameNode会定期与NameNode通信,请求其停止使用edits文件,暂时将新的更新操作写到一个新的文件edits.new上,这个操作瞬间完成。
  2. 下载:SecondaryNameNode通过HTTP GET方式从NameNode上获取fsimage和edits文件,并下载到本地相应目录上。
  3. 合并:SecondaryNameNode将下载下来的fsimage载入内存,然后一条一条执行edits文件中的各项更新操作,使得内存中的fsimage保持最新,这过程就是edits和fsimage文件合并。
  4. 发送:SecondaryNameNode执行完第三步后,通过HTTP POST方式将新的fsimage文件发送到NameNode。
  5. 替换:NameNode用从SecondaryNameNode接收到新的fsimage文件替换旧的fsimage文件,同时将edits.new文件更名为edits。

1、HDFS的工作机制

1.1 文件读取:

【大数据架构综述】文件系统篇之HDFS概述_第3张图片

  1. 客户端通过DistributedFileSystem对象向NameNode申请读取数据,获取数据所在的DataNode地址;
  2. 客户端通过DistributedFileSystem对象返回的含有数据块地址的FSDataInputStream对象向DataNode中发送读取数据的请求;
  3. DataNode接收到数据读取的请求后,将数据返回到客户端。

1.2 文件写入:

【大数据架构综述】文件系统篇之HDFS概述_第4张图片

  1. 客户端通过DistributedFileSystem对象向NameNode申请写入数据请求;
  2. NameNode接收请求后,查看文件是否存在以及用户是否有权限,若有就会创建文件元数据;
  3. 客户端通过调用FSDataOutputStream对象写数据,数据先被写入缓冲区,再被切分成一个个数据包;
  4. 每个数据包会发送到由NameNode分配的一组DataNode中的其中一个DataNode上,这组DataNode节点组成的管道上依次传输数据包;
  5. 传输完成后会返回确认信息给FSDataOutputStream上,最后返回到客户端;
  6. 客户端接收到会关闭文件输出流,通知NameNode文件写入成功。

1.3 副本冗余存储策略

【大数据架构综述】文件系统篇之HDFS概述_第5张图片

HDFS上文件对应的数据库保存有多个副本,且提供容错机制,副本丢失或宕机时自动恢复。

HDFS默认保存3份副本:

  1. **第一个副本:**放置在上传文件的数据节点;
  2. 第二个副本:放置在与第一个副本不同的机架的节点上;
  3. 第三个副本:放置在与第二个副本相同机架的其它节点上。

如果还有更多副本,这些副本会随机选择节点存放

1.4 机架感知

在大型Hadoop集群会分布在很多机架上,这时候不同节点之间的通信希望尽量在同一个机架之内进行,但为了提高容错能力,NameNode会尽可能把数据块的副本放在多个机架上,因此Hadoop设计了机架感知。

在默认情况下,HDFS无法自动判断集群中各个DataNode的网络拓扑情况,这时集群默认都会处在同一个机架名为“/default-rack”的机架下。这种情况的任何一台DataNode机器,无论在物理上是否为同一个机架,都会认为在同一个机架上。通常是通过在外脚本实现机架感知。

1.5 数据容错

HDFS在能够出错的情况下保证数据存储的可靠性。常见的出错情况有:数据节点DataNode出错、名称节点NameNode出错和数据Data本身出错

  1. 数据节点DataNode出错

    • 每个DataNode周期性地向NameNode发送心跳信号,当NameNode通过心跳信号的缺失检查到了网络割裂,就将近期不再发送心跳信号的DataNode标志为宕机。宕机的DataNode可能会引起某些数据块的副本数低于指定值,NameNode检测到这些需复制的数据块后就会启动复制操作。
    • 某个DataNode节点失效,某个副本遭到损坏,DataNode上硬盘错误,或文件副本系数增大,数据块都需重新复制。
  2. 名称节点NameNode出错

    若NameNode中两个重要文件fsimage和edits发生损坏,整个HDFS将失效。因此Hadoop采用两种机制来保证NameNode的安全。

    (1)将NameNode的元数据同步存储到其它文件系统中;

    (2)运行一个SecondaryNameNode。

    通常情况下都会将这两种方法结合使用。

  3. 数据Data出错

    从某个DataNode获取数据块可能是损坏的,损坏可能是由DataNode存储设备错误、网络错误或者软件bug造成。因此HDFS使用校验和来判断数据块是否损坏。


2、HDFS的高级功能

2.1 安全模式

它是HDFS所处的一种特殊状态。在这种状态下,HDFS只接受读数据请求,不能对文件进行写、删除等操作

在NameNode启动时,HDFS会进入安全模式,DataNode会向NameNode上传它们的数据块列表,让NameNode得到数据块的位置信息,并对每个文件对应数据块副本进行统计。数据块都达到最小副本数,HDFS自动离开安全模式

2.2 回收站

HDFS为每个用户创建了类似操作系统的回收站(Trash)。当用户删除文件时,文件不是马上被永久性删除,会被保留在回收站一段时间,保留时间是可以设置的。当用户在保留时间内需要恢复文件,就可到回收站去恢复数据。

2.3 快照

快照可以针对某个目录,或整个文件系统,即快照可以使某个损坏的目录或整个损坏的HDFS恢复到过去的一个数据正确的时间点。快照常见场景是数据备份,以防一些用户错误或灾难。

2.4 高可用

HDFS HA是指HDFS High Available,即HDFS高可用性。

HDFS通过在同一集群中运行两个冗余NameNode来防止唯一的NameNode故障而导致集群无法使用的情况,这就是HDFS的高可用性功能。这样,在一个NameNode不能对外提供服务情况下,可快速将服务转移到另一备用的NameNode。

【大数据架构综述】文件系统篇之HDFS概述_第6张图片

2.5 联邦

HDFS的Federation,即HDFS联邦,指的是HDFS由多个NameNode或NameSpace(NS),它们是联合的,相互独立且不需要互相协调,各自分工,管理自己的区域。

每个NameNode或NameSpace有自己的数据块池(Block Pool),池与池之间是独立的。一个NameNode挂掉,不会影响其它NameNode,但所有数据块池共享一个HDFS的存储空间。当一个NameNode或NameSpace被删除,对应的DataNode中的数据块池也会被删除。

联邦的优点:

  1. 负载均衡:NameSpace具有可扩展性。NameNode可以水平扩展,减轻单个NameNode的内存和服务压力。

只有一个NameNode的情况:

【大数据架构综述】文件系统篇之HDFS概述_第7张图片

联邦负载均衡的作用:【大数据架构综述】文件系统篇之HDFS概述_第8张图片

  1. 性能提升:多个NameNode可提高读写时的数据吞吐量。
  2. 隔离性:可隔离不同类型的程序,一定程度上可控制资源的分配。

参考文献

《Hadoop大数据技术与应用》——杨治明、许桂秋著

你可能感兴趣的:(大数据)