文档章节

Hadoop学习笔记14:./bin/hadoop namenode -format之源码解析

强子大叔的码田
 强子大叔的码田
发布于 2014/08/20 10:02
字数 922
阅读 591
收藏 24

上一节讲解了shell脚本运行的本质

这下让我们真正来一探类

org.apache.hadoop.dfs.NameNode

PS:这年头不会源码不好混啊,生活所迫!

准备工作:

需要把相应的.xml文件放在正确的目录下

还有源码也要放在跟对应的class文件同一层次下,这样才可以找到源码!

===========================

与c语言对应的gdb对应,java有jdb

启动方法如下:

 

这样就可以开始调试了!

具体的命令请网上搜索!

======================

下面根据我的jdb命令流程来解析./bin/hadoop name -format的执行流程。

首先执行
59        public static final Logger LOG = LogFormatter.getLogger("org.apache.hadoop.dfs.NameNode");
这个不用去关注,毕竟不是核心知识点,获取一个Logger类罢了!

 下面执行

Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.main(), line=378 bci=7
378            Configuration conf = new Configuration();

这个比较简单,核心在于

> 
Step completed: "thread=main", org.apache.hadoop.conf.Configuration.<init>(), line=63 bci=36
63        defaultResources.add("hadoop-default.xml");

main[1] next
> 
Step completed: "thread=main", org.apache.hadoop.conf.Configuration.<init>(), line=64 bci=46
64        finalResources.add("hadoop-site.xml");

所以,务必保证上面这2个文件存在且配置好了,注意,这2个文件可以放在classes目录下即可!

注意,这两个文件加载有先后顺序,先加载hadoop-default.xml

再加载hadoop-site.xml,这样hadoop-site.xml的配置项会覆盖hadoop-default.xml里的配置项

也就是说,hadoop-site.xml里的配置项具有优先级!

---------

 

Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.main(), line=380 bci=8
380            if (argv.length == 1 && argv[0].equals("-format")) {


这个简单了,就是验证参数,因为 NameNode可以带参数执行也可以不带参数执行。

往下执行

Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.main(), line=381 bci=25
381              File dir = getDir(conf);

可以看到这里就是获取文件目录,应该是根据配置文件来获取。

往下跟就知道了!

 Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.getDir(), line=95 bci=0
95          return new File(conf.get("dfs.name.dir", "/tmp/hadoop/dfs/name"));

 显然这里就是根据你的配置文件的dfs.name.dir来获取对应的目录文件

main[1] print dir
 dir = "/tmp/hadoop/dfs/name"

说明配置文件里确实没有设置!

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

下面就是执行格式化操作:

Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.main(), line=395 bci=30
395              format(conf);

这个里面才是核心代码!!!

71          FSDirectory.format(getDir(conf), conf);

调用了静态类的静态方法,跟进去看看!

===

这个静态方法的全部内容就是如下:

 

    /** Create a new dfs name directory.  Caution: this destroys all files

     * in this filesystem. */

    public static void format(File dir, Configuration conf)

      throws IOException {

        File image = new File(dir, "image");

        File edits = new File(dir, "edits");

        if (!((!image.exists() || FileUtil.fullyDelete(image, conf)) &&

              (!edits.exists() || edits.delete()) &&

              image.mkdirs())) {          

          throw new IOException("Unable to format: "+dir);

        }

    }

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

 可见先获取2个文件,一个是image,一个是edits.

首先看第一句

!image.exists() || FileUtil.fullyDelete(image, conf)

根据短路原则,表明如果不存在image文件则算了,否则通过FileUtil.fullyDelete全部删除!

这个具体细节就不说了,调用本地文件系统删除,没啥可说的!

最后一行就是说

(!edits.exists() || edits.delete())
&&
image.mkdirs()
如果edits存在就删除,并且最后还要再重新创建文件夹image

-----------

所以两次执行ls的结果如图:

验证了代码!

备注:读者对于文件系统内部的删除等操作不用太关注,这些东西其实都没啥技术含量

都是很简单的封装,JAVA的封装真的没啥意思,还是C的简单粗暴来的痛快!

 最后:

 

>
Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.main(), line=396 bci=34
396              System.err.println("Formatted "+dir);

main[1] next
> Formatted /tmp/hadoop/dfs/name

Step completed: "thread=main", org.apache.hadoop.dfs.NameNode.main(), line=397 bci=59
397              System.exit(0);

main[1] next
>
The application exited
hadoop@idc66:/usr/local/hadoop-0.1.0/build/classes$

 

这样也就执行完了,我们就很轻松了验证了

./bin/hadoop namenode -format的原理,是不是很痛快?

饕餮大餐后续更精彩! 

 

 

 

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 922
博文 1491
码字总数 1247043
作品 9
南京
架构师
私信 提问
加载中

评论(5)

盒饭超人
盒饭超人

引用来自“盒饭超人”的评论

哦哦 推荐本网上有下的书吧大哥 谢谢了啊

引用来自“强子哥哥”的评论

hadoop权威指南 hadoop in action, Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理,
谢谢你啊
强子大叔的码田
强子大叔的码田 博主

引用来自“盒饭超人”的评论

哦哦 推荐本网上有下的书吧大哥 谢谢了啊
hadoop权威指南 hadoop in action, Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理,
盒饭超人
盒饭超人
哦哦 推荐本网上有下的书吧大哥 谢谢了啊
强子大叔的码田
强子大叔的码田 博主

引用来自“盒饭超人”的评论

大神 我入职1年,java半年,可以把你hadoop资料发我吗 我也想学

我就是看书和源码的
盒饭超人
盒饭超人
大神 我入职1年,java半年,可以把你hadoop资料发我吗 我也想学
Hdoop 学习笔记

简介:Hadoop分布式系统体系结构的核心: HDFS和MapReduce 。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作...

james_lz
2016/03/08
116
0
hadoop格式化失败原因:format is aborted

user6@das0 hadoop-0.20.203.0]$ bin/hadoop namenode -format 12/02/20 14:05:17 INFO namenode.NameNode: STARTUP_MSG: Re-format filesystem in /data0/hadoop-name ? (Y or N) y Format ......

liangtee
2013/03/17
110
0
好程序员大数据笔记之:Hadoop集群搭建

在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天集中总结以下笔记,希望对各位同学...

好程序员IT
2019/05/21
17
0
centos6安装hadoop

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系...

mailfile
2016/09/21
0
0
hadoop程序员用自己5年的实战经验告诉我大数据是这样搭建环境

Hadoop由GNU / Linux平台及其版本支持。因此,我们必须安装一个Linux操作系统来设置Hadoop环境。如果您有 除Linux以外的操作系统,您可以在其中安装Virtualbox软件,并在Virtualbox内部安装L...

卢家大少
2018/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL-基于SELECT查询的UPDATE查询

我需要检查(从同一张表)基于日期时间的两个事件之间是否存在关联。 一组数据将包含某些事件的结束日期时间,另一组数据将包含其他事件的开始日期时间。 如果第一个事件在第二个事件之前完成...

javail
47分钟前
60
0
将PostgreSQL数据库复制到另一台服务器

我正在将生产PostgreSQL数据库复制到开发服务器。 什么是最快,最简单的方法? #1楼 pg_dump the_db_name > the_backup.sql 然后将备份复制到您的开发服务器,并使用以下命令进行还原: ps...

技术盛宴
今天
39
0
[译]软件架构师之路

今天给大家带来一篇自己翻译的干货《软件架构师之路》。本周Github上升很快的项目。其内容对致力于成为软件架构师(不论前后端)的同学应该都会有极大的帮助。 项目地址: 中文地址 https://...

gamedilong
今天
41
0
聊聊artemis的ExpiryScanner

序 本文主要研究一下artemis的ExpiryScanner startExpiryScanner activemq-artemis-2.11.0/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl......

go4it
今天
51
0
MySQL概述

MySql主要概念 参考:https://snailclimb.gitee.io/javaguide/#/database/MySQL MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数...

Las_Vegas
今天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部