Hadoop学习笔记之六:HDFS功能逻辑(2)
Lease(租约)
HDFS(及大多数分布式文件系统)不支持文件并发写,Lease是HDFS用于保证唯一写的手段。
Lease可以看做是一把带时间限制的写锁,仅持有写锁的客户端可以写文件。
租约的有效期
HDFS的Lease设定了两个时间限制:softLimit(默认1m),hardLimit(默认1h);
- Lease持有者在softLimit时限内可以写文件,且不用担心被其它写者抢走Lease;
- 在超过softLimit仅未及hardLimit时限可以续约,否则Lease可能被其它写者申请走;
- 在超过hardLimit后,Lease会被释放,写者需要重新申请Lease;对hardLimit的超时检查是由Namenode的lmthread线程执行;
租约的释放
对应于有效期的设计,Lease会在三种情况下被释放:
- 客户端显式地请求NameNode对某个文件进行 recoverLease操作;
- Lease超过softLimit,此时另一客户端申请该文件Lease;
- Lease超过harLimit,由Namenode的lmthread线程发现并执行释放;
租约的释放会引发DataNode对block的recovery过程,当DataNode完成recover block过程后,文件会被关闭。详见Recover Block
租约的结构
Lease由<holder, lastUpdate, paths>组成;
- holder是客户端的名字,支持以holder为粒度对holder对应的所有Lease进行续约;
- lastUpdate是该holder上次续约时间,用于进行超时检查;
- paths是指该holder对哪些路径持有租约;
NameNodeResourceMonitor
NameNodeResourceMonitor默认每5秒执行一次检查,查看保存image/edits的目录所在的磁盘卷空间。
磁盘卷空间信息获取是通过调用linux的shell命令实现。
如果剩余可用空间小于默认的100M,则认为该卷磁盘空间不足。当所有磁盘卷空间都不足时,则NameNode会进入safeMode。
Recover Block
客户端发起的recover block
HDFS客户端在写流水线(pipeline)的时候,如果遇到异常,会对写文件的最后一个block进行差错恢复(error recovery);这个过程被称为recover block,或block recovery;
注:
- targets:D1、D3、D4、D5;
- syncList:D1、D3、D4;
- successList:D3、D4;
对该过程的简单描述如下,配合上图:
- 客户端C在写
D1->D2->D3->D4->D5流水线时,D2异常,C发起对文件最后一个block的recover
block过程,根据一定的规则,选定D3为首DN(primaryDatanode),对targets中所有DN进行recover block; - D3向其它的DataNode收集该block的信息,这个过程中可能再遇到DataNode异常或不适合recover block,如D5,将其排除后,组织成syncList队列,并选定其中最短的长度作为;
- D3向NameNode(N)发送消息请求更高的Block版本号;
- D3向syncList中所有DN发送消息,要求其对该block进行更新(包括内存对象及磁盘文件的版本号、长度,可能引发磁盘文件被切短);在这个过程中,可能再遇到DataNode异常,如D1,将其排除后,组织成successList队列;
- D3向N发送消息,提交recover block的结果:删除旧的block对象,增加新的block对象;
- 将successList返回给客户端,客户端根据该列表,重新构建流水线,继续写文件;
NameNode发起的recover block
除客户端外,在某些特殊情况下,会由NameNode发起recover block过程;其通常是由recover lease过程引起的(详见Lease(租约)的“租约释放”部分);
与客户端发起的recover block过程相比,不同之处在于:
- recover block过程的启动过程不是由客户端请求,而是通过NameNode在响应DataNode的心跳时返回命令;
- 客户端recover block通常不会关闭文件,以期完成恢复后继续写文件;而NameNode完成恢复后会关闭文件,以便客户端可以重新打开;
结合这两点,整个recover block过程的逻辑流程如下:
Replication(复制)
HDFS通过Replication过程保证数据块始终拥有足够多副本;
当系统发现了Block副本损坏、副本删除等操作时,会在blocksMap中对Block的副本数进行检查,将副本数不足的Block添加到FSNamesystem的neededReplications数据结构中;当进行了关闭文件、添加副本等操作后,也会检查以修正该数据结构。
Namenode节点上运行一个ReplicationMonitor线程,每dfs.replication.interval(默认为3)秒进行一次computeDatanodeWork()操作,主要是为Datanode分配Replication任务(另外还会分配删除任务);
- ReplicationMonitor从neededReplications中取出一定数量的Block;
- 为每个Block挑选Replication的源节点,将该Block添加到源节点DatanodeDescriptor的replicateBlocks数据结构中;
- 同时该将该Block添加到FSNamesystem的pendingReplications数据结构中;
- 如果复制后副本数足够,将该Block从neededReplications数据结构中移除;
之后, ReplicationMonitor线程会检查pendingReplications数据结构,找出已经超时的Replication操作,重新加入到neededReplications数据结构中。
在pendingReplications数据结构内部,使用一个数据结构保存当前pending的Replication操作,另一个数据结构保存已经超时的Replication操作,并使用一个线程(timerThread)定期(默认5m)检查,以5m超时;
整体示意图如下:
SafeMode(安全模式)
SafeMode是HDFS集群的一种特殊状态,在该状态下,很多对命名空间的修改都被禁止。被禁止的操作有:
- 修改文件属性;
- 修改文件属主;
- 修改文件时间属性;
- 修改文件复本数;
- 创建/追加文件;
- 为文件增加文件块;
- 舍弃一个文件块;
- 关闭文件;
- 重命名文件;
- 删除文件;
- 创建目录;
- 设置配额;
- 对文件进行同步;fsync
- 对文件块进行同步;commitBlockSynchronization
- 获取下一个GenerationStamp;
- 恢复租约;
- 更新租约;
- 获取、更新、销毁安全令牌;
- 滚动元数据存储文件(fsimge及edits)
NameNode进入safeMode后,对内存及磁盘上的元数据文件的“小规模修改”都无法进行,但“大规模替换”,如加载(loadFSImage、loadFSEdit)、写出(saveNamespace)则可以进行。
safeMode的进入条件
在0.20.2-cdh3u2版本中,是否应当进入safeMode由以下参数决定:
参数名 | 默认值 | 作用 |
dfs.safemode.threshold.pct | 95% | 如果已经汇到的block数少于总block数的该比例,则需要进入safeMode; |
dfs.safemode.min.datanodes | 0 | 当前存活的datanode个数少于该数字则需要进入safeMode; |
此外,当namenode节点资源不足时也会进入safeMode,见:NameNodeResourceMonitor
safeMode在以下过程中会触发条件检查:
- 设定block总数(命名空间初始化时执行);
- 增加安全block的个数;
- 减少安全block的个数;
- 注册一个datanode;(注:在hadoop-0.2x版本中,该过程并不触发条件检查)
- 删除一个datanode;(注:同上)
safeMode监测
NameNode进入safeMode的同时,会启动一个线程进行safeMode状态监测,其每秒钟检查一次是否可以离开safeMode;离开safeMode后,线程结束。
Hadoop学习笔记之六:HDFS功能逻辑(2)的更多相关文章
- Hadoop学习笔记: HDFS
注:该文内容部分来源于ChinaHadoop.cn上的hadoop视频教程. 一. HDFS概述 HDFS即Hadoop Distributed File System, 源于Google发表于200 ...
- Hadoop学习笔记(2)-HDFS的基本操作(Shell命令)
在这里我给大家继续分享一些关于HDFS分布式文件的经验哈,其中包括一些hdfs的基本的shell命令的操作,再加上hdfs java程序设计.在前面我已经写了关于如何去搭建hadoop这样一个大数据平 ...
- hadoop学习笔记贰 --HDFS及YARN的启动
1.初始化HDFS :hadoop namenode -format 看到如下字样,说明初始化成功. 启动HDFS,start-dfs.sh 终于启动成功了,原来是core-site.xml 中配置 ...
- Hadoop学习笔记(三) ——HDFS
参考书籍:<Hadoop实战>第二版 第9章:HDFS详解 1. HDFS基本操作 @ 出现的bug信息 @-@ WARN util.NativeCodeLoader: Unable to ...
- hadoop学习笔记(四):HDFS文件权限,安全模式,以及整体注意点总结
本文原创,转载注明作者和原文链接! 一:总结注意点: 到现在为止学习到的角色:三个NameNode.SecondaryNameNode.DataNode 1.存储的是每一个文件分割存储之后的元数据信息 ...
- Hadoop学习笔记(2)
Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...
- Hadoop学习笔记(5) ——编写HelloWorld(2)
Hadoop学习笔记(5) ——编写HelloWorld(2) 前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我 ...
- Hadoop学习笔记(2) ——解读Hello World
Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...
- Hadoop学习笔记(9) ——源码初窥
Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续 ...
随机推荐
- what' the python之递归函数、二分算法与汉诺塔游戏
what's the 递归? 递归函数的定义:在函数里可以再调用函数,如果这个调用的函数是函数本身,那么就形成了一个递归函数. 递归的最大深度为997,这个是程序强制定义的,997完全可以满足一般情况 ...
- Python3学习之路~6.7 经典类和新式类的继承顺序
在Python中,经典类(class Person:)和新式类(class Person(object):)的主要区别就是体现在多继承的顺序上. Python 2.x中默认都是经典类,只有显式继承了o ...
- 007-js中的Array常用方法
原文:http://www.runoob.com/jsref/jsref-obj-array.html 摘要常用方法 const array=new Array(); // 1 增加元素 // 1.1 ...
- Laravel中路由怎么写(一)
1.路由基本使用示例 1.1 默认示例 Laravel中所有路由定义在/app/Http/routes.php文件中,该文件默认定义了应用的首页路由: Route::get('/', function ...
- Windows Server 2008服务器上测试几个站点,改完host居然没有生效
Windows Server 2008服务器上测试几个站点,改完host居然没有生效看了下资料,估计是因为Dnscache这个服务引起的(DNS Client)于是从服务了把他禁用掉,果然host生效 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限及操作指引
系列目录 1.权限包括菜单权限,按钮权限,数据权限 2.角色组和用户之间是多对多的关系,即多个用户可以拥有多个角色组,权限是拥有角色组的并集 1.菜单界面,菜单都是动态数据由模块管理进行设置 2.权限 ...
- Request.UrlReferrer注意点
定义: public sealed class HttpRequest { // // 摘要: // 获取有关客户端上次请求的 URL 的信息,该请求链接到当前的 URL. // // 返回结果: / ...
- ef entity转json引起的Self referencing loop
问题简介:前段时间做项目时,将取到的entity往Redis cache里存放时报多重引用的错误. Self referencing loop detected for property 'Check ...
- tfs分支操作
1.在代码管理器中找到代码项 右击——分支与合并——分支——默认所有选项——确定. 2.可能刚打出的分支为红色,签入,修改代码,待测试后代码合并到主干中(下拉选出他的上级,一般为主干),删除分支. 3 ...
- ubuntu安装rvm
sudo apt-get install curl git-core bash -s stable < <(curl -s https://raw.github.com/wayneeseg ...