一.  前提和设计目标

1.  硬件错误是常态,因此需要冗余,这是深入到HDFS骨头里面去了

  HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。我们面对的现实是构成系统的组件数目是巨大的,而且任一组件都有可能失效,这意味着总是有一部分HDFS的组件是不工作的。因此错误检测和快速、自动的恢复是HDFS最核心的架构目标

2.  流式数据访问

即:数据批量读取而非随机读写(OLTP),Hadoop擅长的是数据分析而不是事物处理

3.  大规模数据集

  HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS被调节以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。

 

4.  简单的一致性模型

  为了降低系统复杂度,HDFS应用需要一个“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。 

5.  数据就近

  一个应用请求的计算,离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。将计算移动到数据附近,比之将数据移动到应用所在显然更好。HDFS为应用提供了将它们自己移动到数据附近的接口。

 

二.  HDFS体系架构

  HDFF 体系架构主要分为以下几个部分

NameNode

DataNode

SecondaryNameNode

事物日志

映像文件

如图: 

 

hdfs学习sql hdfs入门_数据结构与算法

1.  NameNode

名称节点(元数据节)点用来管理文件系统的命名空间,

  • 其将所有的文件和文件夹的元数据保存在一个文件系统树中,这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)

 记录每个文件数据块在个个DataNode上的位置和副本信息,协调客户端对文件的访问  协调客户端对文件的访问 ,

  • 这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的

 协调客户端对文件的访问 

 记录命名空间内的改动或者空间本身属性的改动

 NameNode使用事物日志记录HDFS元数据的变化,使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等

NameNode 的存储结构如下:

  

hdfs学习sql hdfs入门_java_02

VERSION文件是java properties文件,保存了HDFS的版本号。

 



root@VM_160_34_centos:~> cat /usr/local/hadoop-2.2.0/dfs/name/current/VERSION 
#Mon Sep 01 16:17:18 CST 2014
namespaceID=1671627874
clusterID=CID-d5e5b442-3fe0-49e0-b25e-f41f5f241153
cTime=0
storageType=NAME_NODE
blockpoolID=BP-903224288-10.207.160.34-1409559438288
layoutVersion=-47



 

layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。

namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。

cTime此处为0

storageType表示此文件夹中保存的是元数据节点的数据结构。

   

 

2.  DataNode

负责所在物理节点的存储管理

一次写入,多次读取(不修改)

文件由数据块组成(典型的块大小为64M)

数据块尽量散布到各个节点

周期性的向元数据节点回报其存储的数据块信息.

 

secondaryNameNode

辅助名称节点(又称 从元数据节点)并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。

其主要功能就是

周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会相信叙述。

合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。

 

 

 读取数据流程

客户端要访问HDFS中的一个文件,

首先冲NameNode获取组成这个文件的数据块的位置列表,

根据列表知道存储数据块的DataNode

访问DataNode 获取数据

NameNode 并不参与数据实际传输.

如下图

hdfs学习sql hdfs入门_java_03