引言

本文出于一个疑问:hadoop
namenode -format到底在我的linux系统里面做了些什么?

步骤

第1个文件bin/hadoop

Hadoop脚本位于hadoop根目录下的bin目录下,

打开之后阅读源代码:

在这里$1即为参数namenode

将COMMAND赋值为$1,那么COMMAND=namenode

条件判断语句的执行流到达#hdfs下的一行:

因为这一行判断COMMAND是否等于namenode
secondarynamenode等之一;

接着往下读:

判断"${HADOOP_HDFS_HOME}"/bin/hdfs存在,且为一个文件,那么就会执行

${HADOOP_HDFS_HOME}/bin/hdfs
${COMMAND/dfsgroups/groups} $@

在这里${HADOOP_HDFS_HOME}/bin/hdfs
就是根目录下的bin目录下的hdfs脚本,${COMMAND/dfsgroups/groups}就是namenode,而$@则是-format;

第2个文件bin/hdfs

注意文件中间:

设置了2个变量CLASS
以及HADOOP_OTS

和文件末尾:

通过使用echo指令,可以查看这些参数:

/usr/jdk1.8.0_51/bin/java

namenode

-Xmx1000m

-Djava.library.path=/usr/local/hadoop-2.6.0/lib
-Djava.net.preferIPv4Stack=true
-Dhadoop.log.dir=/usr/local/hadoop-2.6.0/logs
-Dhadoop.log.file=hadoop.log
-Dhadoop.home.dir=/usr/local/hadoop-2.6.0 -Dhadoop.id.str=hadoop
-Dhadoop.root.logger=INFO,console
-Dhadoop.policy.file=hadoop-policy.xml
-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true
-Dhadoop.log.dir=/usr/local/hadoop-2.6.0/logs
-Dhadoop.log.file=hadoop.log
-Dhadoop.home.dir=/usr/local/hadoop-2.6.0 -Dhadoop.id.str=hadoop
-Dhadoop.root.logger=INFO,console
-Dhadoop.policy.file=hadoop-policy.xml
-Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS
-Dhdfs.audit.logger=INFO,NullAppender
-Dhadoop.security.logger=INFO,RFAS
-Dhdfs.audit.logger=INFO,NullAppender
-Dhadoop.security.logger=INFO,NullAppender

org.apache.hadoop.hdfs.server.namenode.NameNode

-format

这是一个完整的java指令,

其中-D<名称>=<值>
设置系统属性,Xmx1000m设置JVM最大可用内存为1GB;

这个不是重点,重点在后面:CLASS为

org.apache.hadoop.hdfs.server.namenode.NameNode

也就是说java要通过一系列的选项和参数运行

org.apache.hadoop.hdfs.server.namenode.NameNode.class

接下来就是查看这个CLASS的源代码了

第3个文件NameNode.java

这个文件位于

hadoop-2.6.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/

其中hadoop-2.6.0-src是hadoop2.6.0的源码,可以直接在apache
hadoop网站上下载,然后解压就可以了。

首先,找到main函数:

位于源码第1497行,

没错,就是这样一段短小精悍的代码!

做了什么呢?

第一部分,if条件语句暂时无视;

第二部分,try
-catch模块,

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

根据名字分析,这个是用来显示Message的.先无视.

重点在这一行代码:

调用函数createNameNode(a,b);

找这个函数,在1365行:

返回类型为NameNode的静态成员函数.

依次做了这样几件事情:

1.写LOG

2.创建一个HdfsConfiguration对象

3.创建一个StartupOption类的对象

4.设置StartupOption

5.switch-case

在这个条件语句模块里面找到FORMAT,

执行format函数,意思就是这个函数用来格式化namenode的了?

在903行,找到了:

跳到真正执行format指令的那一步

使用了2个对象fsn和fsImage,

留意在932行,

FSImage fsImage =
new FSImage(conf, nameDirsToFormat, editDirsToFormat) ;

现在就需要弄明白FSImage是怎样的一个类,以及format方法实现了怎样的功能.

说明:以下步骤均在bluefish工具的协助下进行

第138行:

对应运行hadoop
namenode -format时的log:

工作是由”storage.format(ns);”这行代码完成的

打开NNStorage.java,找到format(ns)方法;

打开Storage.java,找到clearDirectory()方法:

接下来就是FileUtil.fullyDelete(curDir)了.

在源码中没有找到fs.FileUtil,在hadoop
API中查找到了

public static void
fullyDelete(FileSystem fs,Path dir);

这样就删除了一个目录树了,运行时,dir显示为:

/tmp/hadoop-hadoop/dfs/name

经检查发现这个目录依然存在,并且目录下存在文件:

为什么会出现这种情况?

而且,在hadoop2.6.0的源代码中为什么找不到fs.FileUtil?

这些问题有待解决.

尽管如此,在format前后,对比文件占用容量大小:

Namenode Format前:

NameNode Format后:

可以看出,在执行了hadoop
namenode -format之后,name目录占用的空间从1.1M
降低至24K

总结

本文的初衷是摸索出一条命令执行的流程,从而加深对hadoop系统的认识。

不过,这些步骤只是做了一点皮毛的功夫,并没能触及hadoop最核心的部分,不管是作为一个分布式系统也好,还是一个java开源项目也好。

尽管如此,我们可以以此为切入点,如同滚雪球一样一点一点加深对这个生态系统的把握。

对hadoop namenode -format执行过程的探究的更多相关文章

  1. hdfs格式化hadoop namenode -format错误

    在对HDFS格式化,执行hadoop namenode -format命令时,出现未知的主机名的问题,异常信息如下所示: [shirdrn@localhost bin]$ hadoop namenod ...

  2. hadoop namenode -format Couldn&#39;tload main class &quot;-Djava.library.path=.home.hadoop.hadoop-2.5.2.lib&quot;

    <pre name="code" class="sql">[hadoop@MasterHadoop50 ~]$ hadoop namenode -f ...

  3. hadoop map-red的执行过程

    hadoop的 map-red就是一个并行计算平台,我们在使用这个平台的时候,要做的事情就是提交自己定制的任务(job,主要定制map类,reduce类,combine类等类),然后设置job的各种参 ...

  4. "hadoop namenode -format"命令的作用和影响的文件

    在hadoop部署好了之后是不能马上应用的,而是对配置的文件系统进行格式化.这里的文件系统,在物理上还未存在,或者用网络磁盘来描述更加合适:还有格式化,并不是传统意义上的磁盘清理,而是一些清除与准备工 ...

  5. Hadoop 新建集群namenode format

    在hadoop部署好了之后是不能马上应用的,还要对配置的文件系统进行格式化. 使用命令: hadoop namenode -format 注释:namenode和secondary namenode均 ...

  6. Hadoop namenode无法启动

    最近遇到了一个问题,执行start-all.sh的时候发现JPS一下namenode没有启动        每次开机都得重新格式化一下namenode才可以        其实问题就出在tmp文件,默 ...

  7. Hadoop单机安装配置过程:

    1. 首先安装JDK,必须是sun公司的jdk,最好1.6版本以上. 最后java –version 查看成功与否. 注意配置/etc/profile文件,在其后面加上下面几句: export JAV ...

  8. Hadoop NameNode is not formatted.

    2014-08-26 20:27:22,712 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered except ...

  9. hadoop namenode多次格式化后,导致datanode启动不了

    jps hadoop namenode -format dfs directory : /home/hadoop/dfs --data --current/VERSION #Wed Jul :: CS ...

随机推荐

  1. MVC Ajax.BeginForm 提交上传图片

    吃水不忘挖井人,如果对你有帮助,请说声谢谢.如果你要转载,请注明出处.谢谢! 异步提交时,出现图片不能上传. 起初我定格在  System.Web.Mvc  中.查询源码时,也是没有问题的.那问题出现 ...

  2. 用a标签实现submit提交按钮的效果

    今天做了一个小项目练手,要求点击a标签后实现post提交的效果,看到这个的时候心理还是有一丝丝懵逼的,不过在朕的十秒钟思考之后有了头绪... 首先表单 <form action="te ...

  3. [转]SQL server2008 导入超大SQL脚本文件(超过10M)

    同事给我一个sqlserver的学习库,sql脚本导出有300m,gui执行有内存溢出的错误报出来,所以问了一下度娘,学而时习之:) 1. SQL server2008 导入超大SQL脚本文件(超过1 ...

  4. vs2010安装的一些问题

    VS安装出现的问题一般如果出现了  基本就不会安装成功.问题出现的原因有:w7系统的版本,有些可能会安装失败,其次就是你卸载的时候不要把相应 的库及.net的库卸载  后面再安装就容易出错.这个是安装 ...

  5. 2018-2019-2 20175227张雪莹 《Java程序设计》 实验一 Java开发环境的熟悉

    2018-2019-2 20175227张雪莹<Java程序设计> 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号:2017 ...

  6. matplotlib绘图总结《转》

    本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. from p ...

  7. sql使用实例

    将另一表中的合计值保存到指定字段,并将空值赋0 update ShopInfo set JLRunningWater =(select COALESCE(sum(v.TotalMoney),0) as ...

  8. sqlserver数据库镜像运行模式

    运行模式: 从大层面来说,SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作.可以从图1-1中查看运行模式. 在高性能模式下,主体服务器不需要等待镜 ...

  9. hadoop2.6.4集群笔记

    ---恢复内容开始--- 一,linux下的准备工作 1,修改主机名: vi /etc/sysconfig/network 2,修改ip vi /etc/sysconfig/network-scrip ...

  10. JAVA多线程17个问题

    1.Thread 类中的start() 和 run() 方法有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run( ...