首先我们看一下NAMENODE:

我们已经知道了NAMENODE作为DATANODE的管理者,其重要性不言而喻,那么NAMENODE是怎么管理数据的呢?

首先,我们看一下上面这张图,每次客户端读写数据都要先经过NAMENODE,其实就是先查询NAMENODE中的元数据,那么问题来了,NAMENODE中的元数据究竟是存在内存中还是存在硬盘中呢?如果存在内存中,一旦断电就意味着数据的丢失;但是存在硬盘中,读写速度必然下降。下面将对其细节进行详尽的阐述。

通过看以上这幅图,我们可以看到NAMENODE中的元数据既存在在内存中,也存在在硬盘中。我们先看一下元数据的存储细节:

从左到右依次是存储路径,有哪些副本,每个副本在哪些主机上面存储。NAMENODE是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表,接受用户的操作请求。

文件包括:

1.fsimage:元数据镜像文件,存储某一时段NAMENODE内存元数据信息。

2.edits:操作日志文件。

3.fstime:保存最近一次checkpoint的时间。

现在我们回到上一幅图,

1.NAMENODE始终在内存中保存meta.data,用于处理“读请求”。

2.到有“写请求”到来时,NAMENODE会首先写edits到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。

3.Hadoop会维护一个fsimage文件,也就是namenode中meta.data的镜像,但是fsimage不会随时与NAMENODE内存中的meta.data保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary NAMENODE就是用来合并fsimage和edits文件来更新NAMENODE的meta.data的。

这里就用到了Secondary NAMENODE,我们再来看一张图:

在这张图中,我们可以看到SN的一些作用,当NN通知SN要进行checkpoint操作的时候,NN就停止向edits日志中写数据了,但是写操作又不能停止,这时候就会向一个edits.new日志文件中写数据,而SN会把fsimage和edits里面的内容下载到SN中,在SN中进行合并,说白了,就是将日志格式转化成要存储的文件格式,产生fsimage.chkpoint文件,并将它上传给NN,替换fsimage,并且重命名成fsimage,同时edits.new替换edits,并且重命名成edits。详细过程就是:

那么什么时候checkpoint呢?有两种判别方式:

1.fs.checkpoint.period:指定两次checkpoint的最大时间间隔,默认是3600秒。

2.fs.checkpoint.size:规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否达到最大时间间隔。默认大小是64M。

两种判定方式先达到哪个判定条件,则先采用哪个。

我们再来看一下DATANODE:

DataNode

提供真实文件数据的存储服务

文件块:最基本的存储单位,对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移,按照固定的大小,顺序对文件进行划分并编号。划分好的每一块称为一个Block,默认Block的大小是128M。开始不同于普通文件系统的是HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。datanode与namenode保存心跳机制,当长时间未向namenode报告,则视为该datanode死机,namenode会重新备份该datanode上的数据块。

读程图:

1、客户端发送请求,调用DistributedFileSystem API的open方法发送请求到Namenode,获得block的位置信息,因为真正的block是存在Datanode节点上的,而namenode里存放了block位置信息的元数据。

2、Namenode返回所有block的位置信息,并将这些信息返回给客户端。

3、客户端拿到block的位置信息后调用FSDataInputStream API的read方法并行的读取block信息,图中4和5流程是并发的,block默认有3个副本,所以每一个block只需要从一个副本读取就可以。

4、datanode返回给客户端。

写流程:

1、客户端发送请求,调用DistributedFileSystem API的create方法去请求namenode,并告诉namenode上传文件的文件名、文件大小、文件拥有者。

2、namenode根据以上信息算出文件需要切成多少块block,以及block要存放在哪个datanode上,并将这些信息返回给客户端。

3、客户端调用FSDataInputStream API的write方法首先将其中一个block写在datanode上,每一个block默认都有3个副本,并不是由客户端分别往3个datanode上写3份,而是由

已经上传了block的datanode产生新的线程,由这个namenode按照放置副本规则往其它datanode写副本,这样的优势就是快。

4、写完后返回给客户端一个信息,然后客户端在将信息反馈给namenode。

5、需要注意的是上传文件的拥有者就是客户端上传文件的用户名,举个例子用windows客户端上传文件,那么这个文件的拥有者就是administrator,和linux上的系统用户名不是一样的。

补充:

我们在文件系统写内容,其实也是先在日志中写,然后同步到内存,接着返回写入成功,内存中的内容会在达到阈值后写入到磁盘中。

推荐这篇文章:

深刻理解HDFS工作机制

NameNode机制和DataNode机制相关推荐

  1. namenode和datanode工作机制_Hadoop的namenode的管理机制,工作机制和datanode的工作原理...

    HDFS前言: 1) 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: 2)在大数据系统中作用: 为各类分布式运算框架(如:mapr ...

  2. Secondary Namenode的Check point机制以及Namenode、Datanode工作机制说明

    目录 前言: 1.NameNode的工作机制 2.DataNode的工作机制 3.Secondary Namenode的Check point机制 目录 前言: 在说明checkpoint机制之前,先 ...

  3. Hadoop之NameNode和SecondaryNameNode工作机制详解

    Hadoop之NameNode和SecondaryNameNode工作机制详解 NN和2NN工作机制 NN和2NN工作机制详解 Fsimage和Edits解析 checkpoint时间设置 1. NN ...

  4. php artisan实现机制,laravel 原理机制及几个重要功能

    Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点,且也发布长期支持版(LTS). 一. 请求周期 Laravel 采用了单一入口模式,应用的所有请求入口都是 publ ...

  5. linux模块化机制,Linux模块化机制和module_init

    > 引子:模块化机制优点 模块化机制(module)是Linux系统的一大创新,是Linux驱动开发和运行的基础(当然,module并不仅仅是支撑驱动).其优点在于: 1.在系统运行动态加载模块 ...

  6. 【干货】APP产品处理加载机制和刷新机制的交互方法解析

    外行人对交互设计的第一印象是什么?画线框图的?做草稿的? 的确,大家所看到交互设计师的日常工作成果都是一些线框图,从表面上理解的确是这样. 其实,交互设计师做的远远不止这些.往深一步想,信息架构.界面 ...

  7. android log丢失(三)动态切换logd机制和kernel机制

    之前我们分析了如何修改版本使log机制变成kernel的log机制.这篇博客我们继续修改可以动态切换,这样方便平时log丢失时调试. 我们先来看liblog库的编译mk文件,这个文件中主要修改了对使用 ...

  8. session机制和cookie机制

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于才服务器端保持状态的方 ...

  9. php中Session的生成机制、回收机制和存储机制探究

    转载:http://www.jb51.net/article/53938.htm 这篇文章主要介绍了php中Session的生成机制.回收机制和存储机制探究,可以帮助大家对Session有一个全面的了 ...

最新文章

  1. 冒号表达式在计算帧率中的作用
  2. 线程间的通信 共享数据安全问题
  3. Oracle sys或者system的默认密码
  4. 为什么需要Survivor区?只有Eden不行吗?
  5. vscode python 自动补全_利用CodeBERT,这个VS Code扩展可以自动生成Python文档字符串...
  6. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)
  7. python中0、1、True、False、if条件
  8. DB2添加数据时主键、唯一键冲突的解决方法
  9. Sql Server2005创建数据库
  10. 计算机硬件主板各部分内部结构,电脑主板各个模块介绍与原理解读
  11. java时间数字转换成大写显示
  12. python中关于requests里的timeout()
  13. Drcom校园网自动登录
  14. python 0基础如何做出雷霆战机?【源码送上】
  15. AI制作粒子消散文字效果
  16. 国行Android手机使用google全套GMS服务小结
  17. 读《三井帝国在行动》笔记
  18. 免抠图PNG素材网站
  19. 几种Ajax框架的比较
  20. python中的strip()和split()函数

热门文章

  1. 15-垃圾回收相关算法
  2. Some Tips About Layout Resource
  3. Android中Application类用法
  4. 持续集成:部署发布篇
  5. RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ
  6. 攻防:如何防止动态hook绕过jni签名校验
  7. SDNU 1427.分解质因数(水题)
  8. RANSAC与 最小二乘(LS, Least Squares)拟合直线的效果比较
  9. Debian 忘记root密码的处理(passwd:command not found)
  10. 针对不同基础学Java编程的人,提出的小建议?