请选择 进入手机版 | 继续访问电脑版

NameNode的元数据管理详细流程

[复制链接]

这里使用的是Hadoop2.7源码包,以创建目次为例,mkdir的流程看NameNode的元数据管理。使用HDFS的JavaAPI创建目次时,会调用Hadoop的FileSystem的mkdir方法,进去之厥后到实现类DistributedFileSystem的mkdir方法,然后会举行一些权限查抄的操纵FsPermission,通过DFSClient毗连NameNode并获取到NameNodeRpcServer的一个署理对象namenode。通过这个namenode对象远程调用NameNodeRpcserver的mkdir代码。此时代码流程由客户端来到NameNode上
 NameNodeRpcServer通过FSSystem对象创建目次,在此之前会查抄NameNode是否处于安全模式checkNameNodeSafeMode,当不处于安全模式时获取到FSDirectory元数据目次树对象,同时剖析传入的路径看是否满足创建条件。剖析完后将传入的目次路径封装成INodesInPath,在FSDirectory中找到父目次的位置,同时判定是需要创建目次照旧创建文件,目次则封装成INodeDirectory,文件则封装成INodeFile,同时也会对峙是否满足创建目次的条件,最后将这个对象添加到父目次下,父目次也是个INodeDirectory对象。List 文件和目次都是添加进这样一个数据布局,此时activeNameNode的内存元数据已经更新完成。在之后会获取到FSEditLog对象调用logSync()将元数据日志刷写至磁盘,如图所示。
 logSync()HDFS为了提高效率,这里接纳的是双缓存机制刷写磁盘。首先是写磁盘操纵,通过EditLogFileOutputStream对象将日志写入到内存缓冲中bufCurrent,然后和bufReady内存缓冲互换内存所在,由bufReady将日志刷写至磁盘,此过程只是简单形貌,此中用了许多分段加锁机制,在多线程的情况下包管了日志刷写的顺序以及bufReady只要有日志就一直处于刷写磁盘的过程提高了效率。同时往journalNode中发送日志也是接纳的此机制,而且代码共用了,只是实现类不一样,往journalNode发日志使用的是QuorumOutputStream,也是双缓存,只不外在写磁盘改成了往journalNode集群发送日志数据,根据设置文件设置的journalNode集群信息,生成对应的AsyncLogger聚集,一个AsyncLogger对应一台journalNode,异步发送日志信息至每台journalNode呆板上,此过程也是用的PRC通信,所以按照之前的惯例先获取JournalNodeRpcServer署理对象,远程调用JournalNodeRpcServer上的journal方法将日志生存进磁盘,到此activeNameNode往磁盘和journalNode发送元数据日志完成。
 StandbyNameNode启动时会启动一个EditLogTailer线程用于定期从journalNode中获取元数据日志,每隔60s。首先会获取StandbynameNode自己当前的内存中的元数据的对象,获取到最后一条日志的ID,设置获取Journalnode获取日志的流,构建FSEditLogLoader对象,根据自己日志的最大ID去journalNode获取对应ID后续的日志,这里和journalNode通信使用的是HTTP,会根据journalNode的毗连信息创建HttpURLConnection,毗连journalNode上的journalNodeHttpServer,然后在standbynamenode处通过封装获取到DataInputStream输入流来获取日志,获取到日志对象后根据日志的操纵范例对自己的元数据目次树对象举行修改,这里我们是mkdir,所以和activeNameNode的操纵一样,将目次封装成INodeDirectory添加到父目次下。到此standbynamenode从journalNode获取editlog竣事。
 standByNamenode为了包管元数据安全和减轻activeNameNode归并元数据的压力,还会有个checkpoint的操纵。同样在启动时会开启一个StandbyCheckpointer线程用于定期执行元数据的checkpoint,该线程启动后每隔60秒查抄一次,根据这个参数设置dfs.namenode.checkpoint.check.period,不能高出1小时,高出一小时默认就是1小时checkpoint一次。当查抄到当前日志累积高出100万条没有checkpoint大概高出1小时没有执行checkpoint时就会执行checkpoint操纵。调用FSImage的saveNamespace方法将日志刷写生存至磁盘,同时开启一个线程TransferFsImage用于将standbyNameNode的归并后最新的fsimage替换activeNameNode上的最新的fsimage。这里和activeNameNode的毗连接纳的也是HTTP,比力适合大数据量的传输。同理毗连至active上的NameNodeHttpServer调用了ImageServlet将传输过来的数据重定名后替换active本地的fsimage。

来源:https://blog.csdn.net/qq_22042675/article/details/111868991
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )