Hadoop 0.21的bakupnode的工作过程分析

2019-03-28 14:13|来源: 网络

1、backupnode启动后,在初始化阶段完成握手和注册,其中在握手阶段handShake,检测storage的版本是否一致,同时建立到namenode的RPC句柄,保存在成员变量namenode当中,registerWith通过RPC调用Namenode的register,完成backupnode信息在namenode上的注册,同时完成在FSNamesystem和FSEditLog上的检查,如果已经存在了,应该不允许注册,但FSEditLog的checkBackupRegisteion的代码似乎有些问题

相关阅读: http://www.linuxidc.com/Linux/2012-01/50880.htm

2、启动CheckpointDaemon,进行Checkpoint的工作,checkuppoint的具体工作如下:

1)检测时间上是否到了可以启动的条件

2)检测是否是启动时,执行checkupoint,这个在初始化时设置启动时执行checkpoint

3)开始做真正的checkpoint的工作,具体在docheckpoint函数,具体过程如下:

a)rpc调用namenode的startCheckpoint函数,获取namenode的通知,如果namenode发现namespace版本不一致、或者backupnode有更新的image等,会返回ACT_SHUTDOWN的命令,如果一切正常,namenode端会调用FSImage的rollEditLog,而后namenode端调用logJSpoolStart,并将isImageObsolete和needToReturnImg作为CheckpointCommand的一部份返回;startCheckpoint的最后一个工作就是调用FSEdit的logSync函数,不理解这里调用这个函数有什么意义呢?

i)在FSImage的rollEditLog中会调用EditLog的rollEditLog,完成目录的切换,切换的过程包括关闭原来的stream并在新的目录中开启stream;其中FSImage的rollEditLog还会设置ckptState为ROLLED_EDIT,incrementCheckpointTime和产生新的CheckpointSignature;

ii)logJSpoolStart,则主要是将backupnode的stream加入到edit的streams当中,并且写入第一个EditLog:OP_JSPOOL_START到每一个stream当中

iii)CheckpointCommand被返回,其中isImageObsolete为true,如果namenode的edit和backupnode的edit不一致,否则为false;needToReturnImage表示如果namenode有放置edit的目录,则返回checkpoint的image,否则不用返回,因为namenode可以不记录edit,但如果不记录,有如何做checkpoint呢?有点矛盾呀?

b)backupnode将自身的FSImage设置为CheckpointState.UPLOAD_START,CheckuppointState有:START,ROLLED_EDIT,UPLOAD_START,UPLOAD_DONE这样几个状态,此时,namenode应该处于ROLLED_EDIT状态,backupnode处于UPLOAD_START状态

c)如果只有namenode有image等数据(也就是isImageobsolete is true),则将backupnode的内存和disk的数据都reset一下,通过调用resetNamespace函数,然后通过输入signature参数调用dowloadCheckpoint函数,来下载image数据,数据通过HTTP服务下载,如果isImageObsolete is false,则不需要做这些事情了。

d)backupnode的image对象开始loadCheckpoint,将checkpoint装载到内存后在save到disk上,完成了新的checkpoint的生成过程

e)如果需要上传image,则将新的checkpoint上传到namenode,通过调用uploadCheckpoint函数实现

f)rpc调用namenode的endCheckpoint,通知namenode checkpoint已经完成;namenode调用namespace的endCheckpoint,继续传递调用到FSImage的endCheckpoint,FSImage的endCheckpoint调用rollFSImage,在rollFSImage中,会通知FSEdit去purgeEditLog,也就是删除掉原来的editlog,并将edit.new rename为edit;将checkpoint进行重命名,调用FSImage的renameCheckpoint,将名字从fsimage.ckpt改为fsimage ;调用resetVersion,所做的主要工作包括,设置layoutVersion,不同版本的Hadoop保存的image的layoutVersion会不同,更新checkpointTime,最后在resetVersion,这个函数比较难理解的是删除old image和edit,其实是根据条件删除,因为一个目录可以同时保存image和edits,所以按照程序的语义如果目录类型不是image,那么就把其中的image文件删除,如果一个目录不是edit,就把其中的edit文件删掉,然后将每个目录中的version文件更新,最后把ckpState的状态指定为START,ckpState的命名容易让人误解,其实状态START就是一般情况,不是真正开始做checkpoint,比如系统刚开始启动时,ckpState的状态就是START,所以这相当与让状态又恢复到初始状态。

g)backupnode通过调用convergeJournalSpool将checkpoint阶段缓冲的editlog合并到内存的image当中

h)再次设置注册信息setRegistration,目的是为了保持registration的更新,因为在registration中包含了Image的信息,包括checkpointTime等,因此checkpoint完成后需要更新一下注册信息

i)如果当期backupnode的role是CHECKPOINT,那么可以让内存中的FSImage关闭掉了,否则如果是BACKUP的话,就保持这些信息在内存当中

3、通过checkpoint工作,backupnode内存中已经装载了namesystem的数据,当backupnode刚刚加载完namesystem数据时,jsState会设置成OFF接下来,namenode会通过rpc调用backupnode的journal函数,将实时的edit数据传输给backupnode。

下面讨论一下backupstorage中jsState的状态转化过程,通过这个过程的分析,可以更好理解edit spool的工作过程:

-----------------

backupstorage中jsState的状态转换过程

1、初始状态为OFF

2、在startJournalSpool时,无论原来什么状态都会转为INPROGRESS

3、在convergeJournalSpool中,首先装载已经spool的数据,再将jsState设置为WAIT,这样会暂停新的数据写入,从而保证全部加载完全部的数据,再将状态转为OFF

4、在接收到edit数据时,也就是处理jouranl函数时,如果jsState是WAIT或者OFF时,都会更新内存中的FSImage,区别是WAIT要等待spool装载完成信号后再更新;如果jsState是INPROGRESS状态时,不更新内存的fsImage;无论jsState状态如何,jouranl数据都会写入eidtLog

通过上面的分析,我们可以看出整个spool的工作过程,具体如下:

1、在backupnode刚启动时,jsState处在INPROGRESS状态,此时fsImage还没有加载到backupnode的内存中,因此接收到的jouranl数据直接保存在spool里

2、backupnode通过docheckpoint工作,将namenode的FSImage做了checkpoint,同时将Image数据加载到自己的内存中,

3、在doCheckpoint的最后阶段,通过convergeJournalSpool将前期缓存在spool中的journal数据加载到内存里,期间通过将jsState设置成WAIT,可以缩短namenode在调用journal是被阻塞的时间,当spool的数据被加载完毕后,jsState被设置成OFF,spool的功能也被关闭,以后再收到的journal数据将实时的被更新到内存的Image中,同时写在本地的edit文件中

4、遗留一个问题,如果bakupnode定期的做checkpoint时,是否还要启动spool机制呢?我觉得是不需要的,

相关问答

更多
  • 现在hadoop1.0都出了 简单说一下吧 你的java jdk的环境变量没有设置吧? 最好按以下步骤再做一遍: 1 用root用户安装jdk1.6以上 2 用root用户 创建hadoop用户 3 在hadoop用户下安装hadoop(你上面说的1到4) 4 修改/home/hadoop/.bash_profile将JDK和hadoop的环境变量设置好 5 安装ssh(伪集群也需要ssh)
  • hadoop hdfs目录[2022-03-28]

    移动目录的命令很简单啊,跟Linux shell的命令差不多: hdfs dfs -mv 被移动的目录A 目标目录B 直接移动就行,不知道能否解决你的问题。
  • 如何删除hadoop?[2024-03-03]

    命令:hadoop fs -rmr /home/mm/lily2(要求是你把hadoop的bin加到PATH中,并开启hadoop) rm -rf /home/mm/lily2(这是删除linux文件系统的文件夹)
  • 只要工作者在同一节点上,我们就具有Locality的优势。 您也可以与hadoop一起启动服务。 As long as the worker is on the same node, we have the advantage of Locality. You can launch your service alongside hadoop as well.
  • 您需要为openCV安装所需的包。 这篇文章介绍如何安装openCV: http : //www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/ 您需要的是以下命令: sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python- ...
  • Hadoop有asm 3.2而我使用的是ASM 5.在ASM5中,ClassVisitor是一个超类,而在3.2中它是一个接口。 出于某种原因,错误是Throwable(信任Shevek),catch块只捕获异常。 任何hadoop日志都没有捕获throwable错误。 因此,调试非常困难。 使用jar jar链接修复asm版本问题,现在一切正常。 如果你正在使用Hadoop并且某些东西不起作用并且没有日志显示任何错误,那么请尝试抓住Throwable。 阿伦 Hadoop had asm 3.2 and ...
  • 您应该添加/usr/lib/hadoop-0.xx/lib找到的所有jar以避免这种类路径问题。 为了给你一个想法,你可以输入hadoop classpath ,它将打印出获取Hadoop jar和所需库所需的类路径。 在你的情况下,你错过了hadoop-common-0.xx.jar ,所以你应该把它添加到classpath中,你应该很好。 You should add all the jars found in /usr/lib/hadoop-0.xx/lib to avoid this kind of ...
  • TaggedWritable类没有空构造函数,因此在应该读取序列化数据的reduce阶段,app会因为无法通过反射创建TaggedWritable键入键而TaggedWritable 。 您应该添加一个空构造函数。 您的地图阶段已成功完成,因为在地图阶段,您的映射器会TaggedWritable创建TaggedWritable类型的键。 This code solves the problem and gives the expected result. It is from here, public st ...
  • 你是部分正确的。 为了避免Jobtracker做出调度和监控的负担,YARN被引入了画面。 因此,对于YARN,您没有任何作业跟踪器或任务跟踪器。 Job跟踪器完成的工作现在由资源管理器完成,资源管理器有两个主要组件Scheduler(为应用程序分配资源)和ApplicationsManager(接受作业提交并在发生任何故障时重新启动ApplicationMaster)。 现在每个应用程序都有一个ApplicationMaster,它从调度程序协调容器(将运行作业的位置)以运行应用程序。 Nodemanag ...
  • 如果你正在使用cloudera发行版,那么它很可能在/usr/lib/hadoop ,否则它可能在任何地方(由你的系统管理员决定)。 您可以使用一些技巧来尝试找到它: locate hadoop-env.sh (假设已经安装了locate并且最近已经运行了updatedb) 如果你运行它的机器正在运行hadoop服务(例如数据节点,作业跟踪器,任务跟踪器,名称节点),那么你可以执行一个进程列表和grep for hadoop命令: ps axww | grep hadoop ps axww | grep h ...