大数据之一 hadoop HDFS分布式文件系统

什么是大数据

在短时间内快速产生海量各种各样有价值的数据

大数据的核心技术

分布式存储+分布式计算

hadoop

Hadoop是目前大数据常用的,一个能够对大量数据进行分布式处理的软件框架。
Hadoop框架最核心的设计是 HDFS 和 MapReduce。
HDFS为海量的数据提供了存储,而 MapReduce 则为海量的数据提供了计算

HDFS

HDFS,全称分布式文件系统(Hadoop Distributed File System),其存储思想简单粗暴来讲就是一台服务器存不下,那么我就用N台来存。

当然事实上不可能这么简单,现在假设我们用100台服务器存了10PB的资源,那么我们现在需要拿到资源A,一台一台的去找显然是愚笨不堪的,于是聪明的你,在存储数据时就默默的记下了一张表,表上记录着哪一台服务器上存储了哪些数据,这时我们就可以通过查这表来找到资源A所在的位置,这当然比上面一台一台找方便的多,但这张表其实也是不小的(假设可能有100页)。正所谓懒人推动科技,我们希望能直接知道资源A的存储位置而只提供A的相关描述,而恰巧我们是程序员,于是我们可以编写一个搜索程序,对外留出搜索接口,将查表的任务交给这个程序去做。我们将这个程序部署在一台新的服务器上,那么这就形成了HDFS集群的基本框架。那张表中的记录叫做元数据(描述数据的数据),搜索程序所在的服务器叫做NameNode(NameNode只是个别名,本质就是台服务器,角色在集群中的映射是通过进程来表现 因为该服务器启动时会产生一个名为NameNode的进程,所以我们称该服务器节点为NameNode节点),同理存储源数据(真实数据)的100台服务器就叫做DataNode。

作文一个文件存储系统,最为重要的就是文件的读和写,在说到文件读写前我们先来了解一下同样重要的HDFS的文件备份机制

文件备份

现在假设数据已经存储下来,但我们难保什么时候数据会损坏丢失或者某个DataNode节点会挂掉,所以实际中我们必须对数据进行备份
HDFS默认备份数为2,即一个数据存3份,当然你可以再多备几份,这里遵循备份数+1<=DataNode节点数

HDFS备份机制

第一份存储在一台负载不高的节点上(由NameNode进行选择,如果数据是集群内提交,则直接存储在提交数据的节点)
第二份存储在与第一份不同机架的随机节点上
第三份存储在与第二份同机架的不同节点上

文件写

  1. 现在客户端要上传一个大文件,首先他需要计算出该文件的block数(HDFS中文件是以block块的形式存储的,一个Block块=128M)
  2. 然后客户端向NameNode发送请求,告知其文件的信息,属主,权限,上传时间和Block数。NameNode会记录这些数据,并准备好相应的blockID
  3. 客户端拿出一个block,向NameNode发送请求
  4. NameNode返回给客户端一个blockId和存储位置
  5. 客户端给block贴上blockId然后根据地址将其存入DataNode中
    这里首先三个地址(备份机制)的DateNode节点形成pipeline管道
    然后客户端将block切割成一个个packet(64K)输入管道(这样做是为了并行存储,提高效率)
  6. 存储完毕后,DataNode向NameNode汇报情况
  7. 重复步骤3直到所有block存储完毕

文件读

  1. 文件读就简单了,客户端向NameNode发送请求,说我需要资源A
  2. 于是NameNode便去找资源A的位置然后发给客户端
  3. 客户端根据地址去DataNode读取文件就可以了

我们这里再想一下,我们去读数据的时候若是这个DataNode节点挂掉了,那么我们就无法读取数据,而NameNode却不知道这边情况,只是给我们提供无效的地址,这种情况显然是不允许的,于是HDFS中规定DataNode需要向NameNode发送心跳,也就是定时汇报工作,告诉NameNode我还活着,一切OK。如果一定时间内NameNode没有接收到某个DataNode的心跳,那么就会认为其已经挂掉然后进行处理(备份该DataNode上存储的资源)

SecondaryNameNode

我们这里再想一下,DataNode会挂掉,那么NameNode也挂掉该怎么办呢?
第一反应可能是给NameNode也备份一下,想法是没错的。这里提一下,NameNode管理的元数据是在内存中的,那么我们要怎样备份呢?这里HDFS的做法很巧妙,通过引入一台新的服务器节点SecondaryNameNode用来将NameNode的元数据持久化到磁盘中,这里我们看图
持久化的详细过程
图中使用edits文件存储对元数据所做的操作,fsimage文件存储元数据的状态信息,
在3600秒或edits文件大小超过64M时,SecondaryNameNode就会拷贝NameNode中edits和fsimage文件然后进行重演,重演后将fsiamge重命名为fsiamge.ckpt推回到NameNode中,在这个期间NameNode对元数据所做的操作将存储在edits.new文件中,在得到SecondaryNameNode推回的fsimage.ckpt时将fsimage.ckpt重命名为fsimage,edies.new重命名为edit。这样就在SecondaryNamenode中完成了对Namenode的持久化。当NameNode挂掉时,SecondaryNamenode就将重演合并后的fsimage.ckpt推给NameNode,NameNode借此快速重启
顺便一提,block的位置信息是不会持久化的,它依靠于NameNode重启时DataNode的汇报获得

安全模式

安全模式是指集群启动之初的状态
此时NameNode首先加载fsimage到内存中
如果edits文件不为空,NameNode就将 edits 和 fsimage 进行合并(这是NameNode唯一一次进行合并)
DataNode向NameNode汇报block块的状态,NameNode根据情况判断是否需要做备份处理(如果某数据的副本数不足,则NN对其进行备份)
安全状态下不允许客户端进行任何修改文件的操作,只接受读数据请求,可以浏览目录结构、查看文件内容

思维导图

HDFS原理导图

阅读更多

没有更多推荐了,返回首页