分布式文件系统HDFS解析

  • 设计目标
  • Namenode 和 Datanode
    • HDFS HA
    • HDFS Federation
  • 读写流程
  • Replication
    • 元数据
    • 副本均衡
    • 元数据磁盘错误
    • 快照
    • 流水线复制
  • 参考链接

HDFS作为分布式文件系统,主要是为了方便海量上层计算节点存取而设计的。提供posix api,将元数据(存放在NameNode)和数据(存放在DataNodes)分开存放。所有Node之间通过tcp通信。

设计目标

  • 存储非常大的文件:这里非常大指的是几百M、G、或者TB级别。实际应用中已有很多集群存储的数据达到PB级别。根据Hadoop官网,Yahoo!的Hadoop集群约有10万颗CPU,运行在4万个机器节点上。更多世界上的Hadoop集群使用情况,参考Hadoop官网.
  • 采用流式的数据访问方式: HDFS基于这样的一个假设:最有效的数据处理模式是一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作
    分析工作经常读取其中的大部分数据,即使不是全部。 因此读取整个数据集所需时间比读取第一条记录的延时更重要。
  • 运行于商业硬件上: Hadoop不需要特别贵的、reliable的机器,可运行于普通商用机器(可以从多家供应商采购) 商用机器不代表低端机器在集群中(尤其是大的集群),节点失败率是比较高的HDFS的目标是确保集群在节点失败的时候不会让用户感觉到明显的中断。
  • 简单的一致性模型:HDFS应用需要一个“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。Map/Reduce应用或者网络爬虫应用都非常适合这个模型。目前还有计划在将来扩充这个模型,使之支持文件的附加写操作。

Namenode 和 Datanode

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode一定数目Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。应用程序可以设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。

集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。

NameNode管理着整个HDFS文件系统的元数据。从架构设计上看,元数据大致分成两个层次:

  1. Namespace管理层,负责管理文件系统中的树状目录结构以及文件与数据块的映射关系;
  2. 块管理层,负责管理文件系统中文件的物理块与实际存储位置的映射关系BlocksMap

Namespace管理的元数据除内存常驻外,也会周期Flush到持久化设备上FsImage文件;BlocksMap元数据只在内存中存在;当NameNode发生重启,首先从持久化设备中读取FsImage构建Namespace,之后根据DataNode的汇报信息重新构造BlocksMap。这两部分数据结构是占据了NameNode大部分JVM Heap空间。

除了对文件系统本身元数据的管理之外,NameNode还需要维护整个集群的机架及DataNode的信息、Lease管理以及集中式缓存引入的缓存管理等等。这几部分数据结构空间占用相对固定,且占用较小。

测试数据显示,Namespace目录和文件总量到2亿,数据块总量到3亿后,常驻内存使用量超过90GB。

HDFS HA

在Hadoop 1.x 中,Namenode是集群的单点故障,一旦Namenode出现故障,整个集群将不可用,重启或者开启一个新的Namenode才能够从中恢复。

Hadoop HA(High Available)通过同时配置两个处于Active/Passive模式的Namenode来解决上述问题,分别叫Active Namenode和Standby Namenode. Standby Namenode作为热备份,从而允许在机器发生故障时能够快速进行故障转移,同时在日常维护的时候使用优雅的方式进行Namenode切换。Namenode只能配置一主一备,不能多于两个Namenode。

实现方式主要有两种:

  1. 使用NFS共享存储edit log(存储在NAS/SAN)
  2. 使用QJM(Quorum Journal Manager)edit log,使用Quorum+Zookeeper

当主备切换时,Standby通过回放edit log同步数据。

HDFS Federation

我们知道NameNode的内存会制约文件数量,HDFS Federation提供了一种横向扩展NameNode的方式。在Federation模式中,每个NameNode管理命名空间的一部分,例如一个NameNode管理/user目录下的文件, 另一个NameNode管理/share目录下的文件。
每个NameNode管理一个namespace volumn,所有volumn构成文件系统的元数据。每个NameNode同时维护一个Block Pool,保存Block的节点映射等信息。各NameNode之间是独立的,一个节点的失败不会导致其他节点管理的文件不可用。
客户端使用mount table将文件路径映射到NameNode。mount table是在Namenode群组之上封装了一层,这一层也是一个Hadoop文件系统的实现,通过viewfs:协议访问。

读写流程

HDFS原生不支持追加写,在HADOOP-8230后才支持最佳写

Replication

HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件。它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者

HDFS的复制考虑了failure domain,使用称为rack-aware的副本分布策略。

Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。

由于数据一次写入多次读取,所以读取时HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。

元数据

Namenode上保存着HDFS的名字空间。对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来。例如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;同样地,修改文件的副本系数也将往Editlog插入一条记录。Namenode在本地操作系统的文件系统中存储这个Editlog。整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。

Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像。这个关键的元数据结构设计得很紧凑,因而一个有4G内存的Namenode足够支撑大量的文件和目录。当Namenode启动时,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint)。在当前实现中,检查点只发生在Namenode启动时,在不久的将来将实现支持周期性的检查点。

Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。Datanode并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。

副本均衡

HDFS的架构支持数据均衡策略。如果某个Datanode节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个Datanode移动到其他空闲的Datanode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。这些均衡策略目前还没有实现。

元数据磁盘错误

FsImage和Editlog是HDFS的核心数据结构。如果这些文件损坏了,整个HDFS实例都将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的副本。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。这种多副本的同步操作可能会降低Namenode每秒处理的名字空间事务数量。然而这个代价是可以接受的,因为即使HDFS的应用是数据密集的,它们也非元数据密集的。当Namenode重启的时候,它会选取最近的完整的FsImage和Editlog来使用。

Namenode是HDFS集群中的单点故障(single point of failure)所在。

快照

HDFS 快照是从 Hadoop 2.1.0-beta 版本开始引入的新功能,详见 HDFS-2802。

流水线复制

当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中。假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个Datanode节点。第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三个Datanode接收数据并存储在本地。因此,Datanode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。

参考链接

  1. Hadoop分布式文件系统:架构和设计
  2. 深入理解HDFS:Hadoop分布式文件系统
  3. HDFS NameNode内存全景
  4. HDFS 快照编程指南
  5. Hadoop HDFS高可用(HA)
  6. HDFS文件内容追加(Append)

分布式文件系统HDFS解析相关推荐

  1. hdfs数据节点分发什么协议_分布式文件系统HDFS解析

    Hadoop 主要由HDFS和MapReduce 引擎两部分组成.最底部是HDFS,它存储Hadoop 集群中所有存储节点上的文件.HDFS 的上一层是MapReduce 引擎,该引擎由JobTrac ...

  2. JAVA大数据(二) Hadoop 分布式文件系统HDFS 架构,MapReduce介绍,Yarn资源调度

    文章目录 1.分布式文件系统HDFS 1.HDFS的来源 2.HDFS的架构图之基础架构 2.1 master/slave 架构 2.2 名字空间(NameSpace) 2.3 文件操作 2.4副本机 ...

  3. 【hadoop期末复习】第三章 分布式文件系统HDFS 超详细讲解(更新完毕)

    ** 本专栏的Hadoop复习计划文章内容主要包含以下几个部分: [简单]学习通习题 [进阶]课本课后练习 [操作]相关章节实验回顾 ** 使用教材:大数据技术原理与应用(第3版)林子雨 编著 ** ...

  4. 大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门到熟练操作)

    系列博客 1.大数据技术之Hadoop完全分布式集群搭建+Centos7配置连通外网和主机 2.大数据技术之Hadoop编译源码 3.大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门 ...

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

    第三章-分布式文件系统HDFS 文章目录 第三章-分布式文件系统HDFS HDFS简介 HDFS相关概念 HDFS块与组件 名称节点 第二名称节点 数据节点 HDFS体系结构 HDFS存储原理 冗余数 ...

  6. Hadoop分布式文件系统--HDFS结构分析

    前言 在Hadoop内部,详细实现了很多类的文件系统,当然最最被我们用到的就是他的分布式文件系统HDFS了. 可是本篇文章不会讲HDFS的主从架构等东西,由于这些东西网上和资料书中都讲得非常多了. 所 ...

  7. 大数据学习(3)- 分布式文件系统HDFS

    文章目录 目录 1.分布式文件系统 1.1 计算机集群概念 1.2 分布式文件系统结构 2.HDFS简介 2.1 HDFS设计的目标 2.2HDFS的局限性 2.3 块的概念 2.4 HDFS主要组件 ...

  8. Hadoop分布式文件系统HDFS的工作原理详述

    Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数据访问,非常适合大规模数据集上的应 ...

  9. 大数据(3)---分布式文件系统HDFS 介绍

    分布式文件系统HDFS 介绍 来自https://www.cnblogs.com/liango/p/7136448.html  1.三个部分: 客户端.nameserver(可理解为主控和文件索引,类 ...

最新文章

  1. 深入浅出统计学(十一)总体和样本的估计
  2. 你的 mixin 兼容 ECMAScript 5 吗?
  3. 70%的付费率 手游还在愁什么?
  4. 【软件工程】填空题题库
  5. 【LeetCode160】相交链表
  6. 【Python】小练习
  7. C++ vector
  8. 用shell把所有文件名修改为小写
  9. android获取悬浮窗权限,Android 悬浮窗权限校验
  10. Java的jdk安装与环境变量配置
  11. Ubuntu安装ssh服务详细过程
  12. FPGA编程中常用的经典方法及技巧(图像处理-映射技术)
  13. kappa与quadratic weighted kappa
  14. 学习英语01——听力——剑雅12 T6S2
  15. 【codechef】Children Trips
  16. 2019年丰巢科技Java面试题
  17. 设计模式--享元模式
  18. BT种子破案,FBI可以,你也行
  19. 【SQL实战经验一】:SQL语句中存在英文的单引号、双引号问题
  20. 每周分享第 60 期

热门文章

  1. 服务器发送消息技术,知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)...
  2. 数据结构实验二:迷宫的求解
  3. cocos2d-x游戏实例(19)-纵版射击游戏(6)
  4. linux问题排查常用命令详解
  5. 当我们在谈论cpu指令乱序的时候,究竟在谈论什么?
  6. 为什么编程语言初创公司那么少?
  7. iptables redirect 劫持跳转引起 Go 服务故障
  8. 【公开课预告】:超低延迟下的实时合唱体验升级
  9. 【线上分享】下一代互联网通讯协议:QUIC
  10. LiveVideoStackCon 2019北京你来吗?