一个MapReuce作业的从开始到结束--第1章 NameNode节点的格式化

原创
2017/01/17 09:21
阅读数 8

Hadoop配置好之后,第一个要执行的命令是“./bin/hadoopnamenode -format”。这个命令在NameNode节点上执行,格式化NameNode节点。



名字节点格式化的本质,就是从配置文件里读取NameNode的两个目录NamespaceDirsNamespaceEditsDirs,然后将目录清空--也就是删除这两个目录,再新建这两个目录。



./bin/hadoop”是一个bash脚本。它将输入的命令转成Java命令执行。



对”namenode-format”来说,hadoop脚本将命令传到:

org.apache.hadoop.hdfs.server.namenode.NameNode”执行。



NameNode类的源代码在

hdfs/org/apache/hadoop/hdfs/server/namenode/NameNode.java”文件。



NameNode类是可执行的,从main函数开始执行。在这个main函数,先执行这个

StringUtils.startupShutdownMessage(NameNode.class,argv, LOG)”

再执行”NameNode namenode =createNameNode(argv, null)”



StringUitls类的源代码在

core/org/apache/hadoop/util/StringUtils.java”

StringUtils里的函数全部是静态函数,实际上它的作用是容器,将各种辅助字符串处理函数封装在一起。



StringUitls类的函数startupShutdownMessage,它的作用是打印启动和退出信息。它先在Log里打印启动信息,形如:

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG: host =brian-i3/127.0.1.1

STARTUP_MSG: args =[-format]

STARTUP_MSG: version =1.1.3-SNAPSHOT

STARTUP_MSG: build = -r ;compiled by 'brian' on Sat Oct 19 11:24:41 CST 2013

************************************************************/



然后,再设置一个打印退出信息的Hook一个线程,那么,将来进程退出的时候,会打印退出信息,形如:

/************************************************************

SHUTDOWN_MSG: Shutting downNameNode at brian-i3/127.0.1.1

************************************************************/



NameNodemain函数,执行“NameNodenamenode = createNameNode(argv, null)”,在createNameNode(argv,null)函数里,执行完了之后,直接System.exit()退出返回。



NameNode类的createNameNode函数,首先要执行“Configurationconf = New Configuration()”,读取配置文件。



如果将conf内容转成字符串,其结果是

Configuration:core-default.xml, core-site.xml, hdfs-default.xml, hdfs-site.xml”

也就说,现在Hadoop的运行配置由这4xml文件设定。



createNameNode函数里,进行”namenode-format“,执行fomat,就是执行3个参数的format函数。



NameNode类的函数format有多个。3个参数的format函数,定义如下:

private static booleanformat(Configuration conf,

booleanisConfirmationNeeded, boolean isInteractive)

,先获取两个目录,一个是名字空间目录,一个是名字空间编辑目录

Collection<File>dirsToFormat = FSNamesystem.getNamespaceDirs(conf);

Collection<File>editDirsToFormat =

FSNamesystem.getNamespaceEditsDirs(conf);



函数getNamespaceDirsgetNamespaceEditsDirs是静态函数,它们从conf里获取相应的目录字符串,然后转成File的集合输出。在笔者的机器上,Hadoop是伪分布式方式运行,这两个目录是相同的,都是/tmp/hadoop-brian/dfs/name目录。



对这两个目录,检查是否存在,如果不存在,继续执行格式化。如果存在,但不是在交互模式,不进行格式化,如果在交互模式,提示否则要进行格式化,如果回答是Y就继续执行格式化,否则不格式化。



然后,在format函数里,会运行到这里

FSNamesystem nsys = newFSNamesystem(new FSImage(dirsToFormat,

editDirsToFormat),conf);

nsys.dir.fsImage.format();



fsImagefomat的时候,实际上是调用FSImage类做format



FSImage类的源代码在这里:hdfs/org/apache/hadoop/hdfs/server/namenode/FSImage.java



FSImage类的format函数,在这里对目录处理成:org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;

最终到这里:

StorageDirectory sd;

sd.clearDirectory()

sd的当前目录全删除,然后再重新创建。



clearDirectory()函数,最终执行的是FileUtil.fullyDelete(curDir),在这里递归执行fullyDeleteContents,删除目录。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部