01 HDFS介绍:

  1. Hadoop2介绍

Hadoop是Apache软件基金会旗下的一个分布式系统基础架构,它为海量的数据提供了存储和计算。Hadoop2的框架最核心的设计就是HDFS、MapReduce和YARN。

  • HDFS:Hadoop Distributed File Syste,分布式文件系统,主要用于海量数据存储。
  • MapReduce:主要用于分布式计算。
  • YARN:Hadoop2中的资源管理系统
  1. 对比Hadoop1和2
  2. 结构对比

图 1 Hadoop1和2结构对比

  1. Hadoop2主要改进
  • YARN—Yet Another Resource Negotiator

通过YARN实现资源的调度与管理,支持更多种类的计算框架,如Spark等。

  • NameNode HA—NameNode High Availability

在Hadoop1中,如果NameNode坏掉,则数据不可访问。而Hadoop2实现了NameNode HA方案,同时有active和standby两个NameNode,一旦active NameNode坏掉,standby NameNode会立即转入active状态提供服务,以保证整个集群的高可用性。

  • HDFS federation—
    由于元数据存放在NameNode的内存当中,故内存限制了整个集群的规模。Hadoop2实现了多个NameNode组成一个fedration共同管理DataNode,扩大了集群规模。
  • Hadoop RPC序列化扩展性—
    Hadoop2将数据类型模块从RPC中独立出来,成为独立的可插拔模块。
  1. HDFS概述

HDFS是一个分布式文件系统,具有高容错的特点。它可以部署在廉价的通用硬件上,提供高吞吐率的数据访问,适合那些需要处理海量数据集的应用程序。

  1. HDFS主要特性
  • 支持超大文件—

一般是几百MB、GB甚至TB级别的文件。

  • 检测和快速应对硬件故障—

HDFS的检测和冗余机制很好的克服了大量通用硬件平台上硬件故障的问题。

  • 流式数据访问—

HDFS处理的数据规模都很大,应用一次需要访问大量数据,且这些应用一般是批量处理,而不是用户交互式处理。HDFS使用户能够以流的形式访问数据集,注重的是数据的吞吐。

  • 简化一致性模型—

大部分HDFS程序操作文件时,需要一次写入,多次读取。在HDFS中,一个文件一旦经过创建写入,关闭后一般不需要修改,这样简单的一致性模型有利于提高吞吐量。

  1. HDFS不适合的场景
  • 低延迟数据访问
  • 大量的小文件
  • 多用户写入文件,修改文件
  1. HDFS体系结构

图 2 HDFS结构

  1. HDFS构成
  • Namenode

保存着HDFS的名字空间,任何对文件系统元数据产生修改都会作用 Namenode上。

  • Datanode

将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。

  1.  
  2. 数据块
    HDFS也有块的概念,Hadoop2中HDFS块默认大小为128MB(此大小可以根据各自的业务情况进行配置,Hadoop1中HDFS块默认大小为64MB),以Linux上普通文件的形式保存在数据节点的文件系统中。
    数据块是HDFS的文件存储处理的单元。
  3. 数据块的好处
  • HDFS可以保存比存储节点单一磁盘大的文件
  • 简化了存储子系统以及存储管理,并消除了分布式管理文件元数据的复杂性
  • 方便容错,有利于数据复制
  1. HDFS读写流程
  2. 读流程

图 3HDFS读流程

Client使用open函数打开文件è

DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息è

对于每一个数据块,元数据节点返回保存数据块的数据节点的地址è

DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据è

客户端调用FSDataInputStream的read函数开始读取数据è

FSDataInputStream连接保存此文件第一个数据块的最近的数据节点è

Data从数据节点读到客户端è

当此数据块读取完毕时,FSDataInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点è

当客户端读取数据完毕时,调用FSDataInputStream的close函数è

在读取数据的过程中,如果与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点,失败的数据节点将被记录,以后不再连接。

  1. 写流程


图 4 HDFS写流程

客户端client调用create函数创建文件è

DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件è

元数据节点首先确定文件是否存在,并且客户端是否有创建文件的权限,然后创建新文件è

DistributedFileSystem返回FSDataOutputStream给客户端用于写数据è

客户端开始写入数据,FSDataOutputStream将数据分成块,写入data queueè

Data queue由DataStreamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块),分配的数据节点放在一个pipeline里è

DataStreamer将数据块写入pipeline中的第一个数据节点,第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点è

FSDataOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功è

如果数据节点在写入的过程中失败,则进行以下几个操作:一是关闭pipeline并将ack queue中的数据块放入data queue的开始;二是当前数据块在已写入的数据节点中被元数据节点赋予新的标示,错误节点重启后察觉其数据块过时而被删除;三是失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点;四是元数据节点被通知此数据块的复制块数不足,从而再创建第三份备份è

当客户端结束写入数据,则调用close函数将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功,最后通知元数据节点写入完毕。

  1. 创建子路径流程


图 5 HDFS创建子路径流程

在NameNode添加新的记录,此过程中,NameNode和DataNode无须交互。

  1. 删除数据流程


图 6 HDFS删除数据流程

客户端通过RPC告知Namenode那些数据需要删除,并在NameNode上做标记,等到DataNode进行心跳时,NameNode会删除指定的数据。