对hadoop namenode -format执行过程的探究
引言
本文出于一个疑问: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执行过程的探究的更多相关文章
- hdfs格式化hadoop namenode -format错误
在对HDFS格式化,执行hadoop namenode -format命令时,出现未知的主机名的问题,异常信息如下所示: [shirdrn@localhost bin]$ hadoop namenod ...
- hadoop namenode -format Couldn'tload main class "-Djava.library.path=.home.hadoop.hadoop-2.5.2.lib"
<pre name="code" class="sql">[hadoop@MasterHadoop50 ~]$ hadoop namenode -f ...
- hadoop map-red的执行过程
hadoop的 map-red就是一个并行计算平台,我们在使用这个平台的时候,要做的事情就是提交自己定制的任务(job,主要定制map类,reduce类,combine类等类),然后设置job的各种参 ...
- "hadoop namenode -format"命令的作用和影响的文件
在hadoop部署好了之后是不能马上应用的,而是对配置的文件系统进行格式化.这里的文件系统,在物理上还未存在,或者用网络磁盘来描述更加合适:还有格式化,并不是传统意义上的磁盘清理,而是一些清除与准备工 ...
- Hadoop 新建集群namenode format
在hadoop部署好了之后是不能马上应用的,还要对配置的文件系统进行格式化. 使用命令: hadoop namenode -format 注释:namenode和secondary namenode均 ...
- Hadoop namenode无法启动
最近遇到了一个问题,执行start-all.sh的时候发现JPS一下namenode没有启动 每次开机都得重新格式化一下namenode才可以 其实问题就出在tmp文件,默 ...
- Hadoop单机安装配置过程:
1. 首先安装JDK,必须是sun公司的jdk,最好1.6版本以上. 最后java –version 查看成功与否. 注意配置/etc/profile文件,在其后面加上下面几句: export JAV ...
- Hadoop NameNode is not formatted.
2014-08-26 20:27:22,712 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered except ...
- hadoop namenode多次格式化后,导致datanode启动不了
jps hadoop namenode -format dfs directory : /home/hadoop/dfs --data --current/VERSION #Wed Jul :: CS ...
随机推荐
- ProxySQL Cluster的搭建
环境: proxysql-1.4.10-1-centos7.x86_64 db210 192.168.99.210 老节点,已经做成mysql配置和读写分离设置db211 192.168.99.211 ...
- 使用Oracle DBLink进行数据库之间对象的访问操作
Oracle中自带了DBLink功能,它的作用是将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象,例如我们新建了一个数据database1,我们需要操作 ...
- VS 代码片段集
片段1:用于线程执行代码,耗时操作时加载Loging; <?xml version="1.0" encoding="utf-8"?> <Cod ...
- java 性能测试框架工具-junitperf
性能测试工具 对于 Java 开发者来说,要去学习性能测试工具未免很麻烦. 但有时候会有性能测试的需求. junitperf junitperf 就是一款为 Java 开发者设计的性能测试框架,如果你 ...
- web.xml的加载过程配置详解
一:web.xml加载过程 简单说一下,web.xml的加载过程.当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有 ...
- Web缓存机制
Web 缓存的出现主要是为了弥补cookie带来的一些局限,当数据严格控制在客户端时,可以不用通过HTTP来持续得将数据发给服务器. 主要使用比较多的就是sessionStorage和localSto ...
- WinForm c#操作Excel
1)Excel 的 Range 对象 在可以对 Microsoft Office Excel 2003 中的任何范围执行操作前,必须将其表示为 Range 对象并使用此 Range 的方法和属性.Ra ...
- 03 字符串常用操作方法及For 循环
字符串常用操作 s = 'alexWUsir' s1 = s.capitalize() #首字母大写 print(s1) #Alexwusir s2 = s.upper() #全部大写 print(s ...
- GIL计算python 2 和 python 3 计算密集型
首先我画了一张图来表示GIL运行的方式: Python 3执行如下计算代码:#-*-conding:utf-8-*-import threading import timedef add(): n = ...
- 一个free异常引发的异常
有同事反馈说自己的线程不工作,查看堆栈发现其打印如下: # # # # # # # # , info= # <signal handler called> # # # # # # # , ...