3.1 HDFS简介

分布式文件系统HDFS,全称为“Hadoop平台上的分布式文件系统”,需要实现以下目标:

  • 兼容廉价的硬件设备
  • 流数据读写
  • 大数据集
  • 简单的文件模型
  • 强大的跨平台兼容性

3.1.1块

HDFS默认一个块64MB,一个文件被分成多个块,以块作为存储单位。

块的大小远远大于普通文件系统,可以最小化寻址开销。

DFS采用抽象的块概念可以带来以下几个明显的好处:

  • 支持大规模文件存储:文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量。
  • 简化系统设计:首先,大大简化了存储管理,因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块;其次方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他 系统负责管理元数据
  • 适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性

3.1.2NameNode

NameNode(nn):存储文件的元数据,如文件名、文件目录结构、文件属性索引

保存了两个核心的数据结构:

FsImage:维护文件系统树以及文件树中所有的文件和文件夹的元数据(文件等级、修改时间、权限),不记录哪些块存储在哪个数据节点中

EditLog:记录操作(删除、重命名等)

启动namenode

将FsImage内容加载到内存中,执行EditLog内的各项操作,使得内存中的元数据和实际的数据同步。一旦内存中成功建立文件系统元数据的映射,创建一个新的FsImage和空的EditLog

3.1.3DataNode

DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和,数据

3.1.4 Scondary NameNode

Secondary NameNode(2nn):辅助程序,解决EditLog不断变大的问题

​ a、会定期和namenode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new中,这个操作是瞬间完成的,上层写日志的函数完全感觉不到差别

​ b、通过HTTPGET方式从namenode上获取到FsImage和EditLog文件,并下载到本地的相应目录下

​ c、将下载下来的FsImage载入到内存中,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的fsImage保持最新,这过程就是editlog和fsimage文件合并

​ d、执行完c操作后,会通过post方式将新的fsimage文件发送到namenode节点上

​ e、namenode将secondarynamenode接受到的新的fsimage替换旧的fsimage文件,通过将edit.new替换editlog文件,通过这个过程editlog就变小了

3.2 HDFS体系结构

3.2.1HDFS体系结构概述

HDFS采用了主从结构模型,一个HDFS集群包括一个Namenode和若干个datanode。namenode作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问。

集群中的datanode一般上一个节点运行一个datanode进程,负责处理文件系统客户端的读写操作,在namenode的调度下进行数据块的创建、删除和复制等操作。

3.2.2 HDFS命名空间管理

HDFS命名空间包括目录、文件、块

传统的分级文件体系:用户可以像使用普通文件系统一样创建、删除目录和文件,在目录间转移文件、重命名文件等。

3.2.3 客户端

客户端是用户操作HDFS最常用的方式,HDFS在部署时都提供了客户端

HDFS客户端是一个库,暴露了HDFS文件系统接口,这些接口隐藏了HDFS实现中的大部分复杂性

严格来说,客户端并不算是HDFS的一部分

客户端可以支持打开、读取、写入等常见的操作,并且提供了类似Shell的命令行方式来访问HDFS中的数据

HDFS也提供了 Java API,作为应用程序访问文件系统的客户端编程接口

3.3 HDFS数据存取原理

3.3.1 数据存放策略

数据存放

第一个副本:放置在上传文件的数据节点,如果是集群外提交,则随机挑选一台磁盘不太满,cpu不太忙的节点;

第二个副本:放置在与第一个腐败不同机架的节点上

第三个副本:与第一个副本相同机架的其他节点上

更多的副本:随机节点

(三)HDFS基本概念介绍

数据读取

HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID

客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架D和客户端 对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就 随机选择一个副本读取数据。

3.3.2 数据错误与恢复

名称节点出错

名称节点保存了所有的元数据信息。其中,最核心的两大数据
结构是 Fslmage和 Editlog,如果这两个文件发生损坏,那么整个
HDFS实例将失效。因此,HDFS设置了备份机制,把这些核心文件
同步复制到备份服务器 Secondary Node上。当名称节点出错时,,就可以根据备份服务器 Secondaryname Node中的 Fsimage和 Editlog数据进行恢复。

数据节点出错

  • 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态。
  • 当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自些数据节点的心跳信息。这时这些数据节点就会被标记为“宕机”, 节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求。
  • 这时有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子
  • 名称节点会定期检査这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本
  • HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置

数据出错

  • 网络传输和磁盘错误等因素都会造成数据错误
  • 客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
  • 在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面
  • 当客户端读取文件的时候,会先读取该信息文件,然后利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。

相关文章: