Hadoop源码学习笔记(2) ——进入main函数打印包信息
Hadoop源码学习笔记(2)
——进入main函数打印包信息
找到了main函数,也建立了快速启动的方法,然后我们就进去看一看。
进入NameNode和DataNode的主函数后,发现形式差不多:
- public static void main(String args[]) {
- try {
- StringUtils.startupShutdownMessage(DataNode.class, args, LOG);
- DataNode datanode = createDataNode(args, null); //NameNode中类型换成NameNode
- if (datanode != null)
- datanode.join();
- } catch (Throwable e) {
- LOG.error(StringUtils.stringifyException(e));
- System.exit(-1);
- }
- }
进来后第一句是什么,当我们运行到这里时发现:

我们在运行每一个程序时,头上都会在控制台或日志文件中输出这一段话。信息内容主要是描述启动了哪个类,主机,参数,版本,以及编译信息。
跟踪进入StringUtils.startupShutdownMessage类中,
- public static void startupShutdownMessage(Class<?> clazz, String[] args,
- final org.apache.commons.logging.Log LOG) {
- final String hostname = getHostname();
- final String classname = clazz.getSimpleName();
- LOG.info(
- toStartupShutdownString("STARTUP_MSG: ", new String[] {
- "Starting " + classname,
- " host = " + hostname,
- " args = " + Arrays.asList(args),
- " version = " + VersionInfo.getVersion(),
- " build = " + VersionInfo.getUrl() + " -r "
- + VersionInfo.getRevision()
- + "; compiled by '" + VersionInfo.getUser()
- + "' on " + VersionInfo.getDate()}
- )
- );
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- LOG.info(toStartupShutdownString("SHUTDOWN_MSG: ", new String[]{
- "Shutting down " + classname + " at " + hostname}));
- }
- });
- }
在第5行,通过log4j组件进行了输出(这里log4j是一个日志写入组件,对就.net中是log4net,详细就不描述了)。然后前几项类名(className)、主机(hostname)、参数(args)没什么问题,通过应函数取得即可。
其他信息稍后,先看一下第18行,这里是在进程上加了一个勾子,来捕获关闭事件,然后在关闭时,可以输出一下信息,我们可以试下,在控制台运行时,然后按下Ctrl+C终止时,可以看到以下信息:

这段信息,正是第20行代码进行输出的。
其它信息如版本和编译信息呢? 输入内容中是比较细的,它是如何知道的呢? 跟进去看:
- private static HadoopVersionAnnotation version;
- static {
- myPackage = HadoopVersionAnnotation.class.getPackage();
- version = myPackage.getAnnotation(HadoopVersionAnnotation.class);
- }
- public static String getUser() {
- return version != null ? version.user() : "Unknown";
- }
这段代码发现getuser是通过一个HadoopVersionAnnotation类的user()函数,而这个HadoopVersionAnnotation发现是一个接口:
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.PACKAGE)
- public @interface HadoopVersionAnnotation {...}
这个接口是一个比较特殊的接口,在1 2 行可以看到有一特殊标记。我们知道,在java中有些函数上是可以加一个特殊标记的,如@override。而这个override就是一个特殊的标记,它也是一个接口,可以附加在这个函数上,让其具有特殊意义。
而我们的这个HadoopVersionAnnotation就是这样的一个接口,并且它附加在Package上,即用于获取包的信息。
附件在包上的话,这又是在哪呢? 我们在build文件夹找到了:

发现,这里有一个java文件,然后里面定义了包,在包上加了一个@信息,这正是这个接口的定义,同时,在这里传入了版本,编译者,编译时间等信息。于是我们在程序里就可以获取到这里的值了。
但又在想了,这个build文件夹不是一开始没有的么,在运行ant后才创建的么,这个java文件是哪来的?
我们发现,在src文件夹下有saveVersion.sh这么一个文件:

基本可以看出,正是往package-info.java中写入相关信息。
而这个saveVersion.sh可以再追查,在build.xml中有调用。
这个@XXX 其实就是.net中的Attribute称之为特性(属性的属性)。
好的,这个main函数中的第一个砍就算过了。
Hadoop源码学习笔记(2) ——进入main函数打印包信息的更多相关文章
- Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类
Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...
- Hadoop源码学习笔记(6)——从ls命令一路解剖
Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...
- Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...
- Hadoop源码学习笔记(4) ——Socket到RPC调用
Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...
- Hadoop源码学习笔记之NameNode启动场景流程一:源码环境搭建和项目模块及NameNode结构简单介绍
最近在跟着一个大佬学习Hadoop底层源码及架构等知识点,觉得有必要记录下来这个学习过程.想到了这个废弃已久的blog账号,决定重新开始更新. 主要分以下几步来进行源码学习: 一.搭建源码阅读环境二. ...
- Hadoop源码学习笔记之NameNode启动场景流程四:rpc server初始化及启动
老规矩,还是分三步走,分别为源码调用分析.伪代码核心梳理.调用关系图解. 一.源码调用分析 根据上篇的梳理,直接从initialize()方法着手.源码如下,部分代码的功能以及说明,已经在注释阐述了. ...
- Hadoop源码学习笔记之NameNode启动场景流程二:http server启动源码剖析
NameNodeHttpServer启动源码剖析,这一部分主要按以下步骤进行: 一.源码调用分析 二.伪代码调用流程梳理 三.http server服务流程图解 第一步,源码调用分析 前一篇文章已经锁 ...
- Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查
本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...
随机推荐
- 【Oracle 12c】最新CUUG OCP-071考试题库(54题)
54.(12-15) choose the best answer: View the Exhibit and examine the structure of the ORDER_ITEMS and ...
- BZOJ3786: 星系探索(伪ETT)
题面 传送门 题解 坑啊--我好像把\(Splay\)的东西全忘光了-- \(ETT\)(\(Euler\ Tour\ Tree\))是一种可以资瓷比\(LCT\)更多功能的数据结构,然而不管是功能还 ...
- tushare模块的应用
一.简介以及环境安装 TuShare是一个著名的免费.开源的python财经数据接口包.其官网主页为:TuShare -财经数据接口包.该接口包如今提供了大量的金融数据,涵盖了股票.基本面.宏观.新闻 ...
- placeholder插件详解
placeholder插件是用来实现input或者textarea文本框显示默认文字的功能,当获得焦点时,默认文字消失.用户按删除键,把输入的字符删除掉,并失去焦点时,默认文字又出现等功能.使用此插件 ...
- [Objective-C语言教程]日志处理(21)
为了打印日志,可使用Objective-C编程语言中的NSLog方法,首先在HelloWorld示例中使用了这个方法. 下面来看一下打印“Hello World”字样的简单代码 - #import & ...
- 总结day7 ---- 文件操作,读,写,追加,以及相关方法
内容大纲 一:文件的基本操作, >常见问题 >encoding >绝对路径和相对路径的 二:文件的读写追加相关操作 >读(r, r+ ,rb,r+b) >写(w,w+,w ...
- Oracle递归查询(start with)
写代码时碰到要弄清楚Oracle的role之间的传递关系,就是有role A的话,可以通过grant A to B,把A赋予给B,又通过grant B to C .那我想知道所有role中,有哪些ro ...
- eclipse远程debug服务器上的项目(Tomcat),打开、关闭及常见错误汇总
我们工作中,有时候测试/生产环境,出现的结果会与我们预计的不一样,只看代码又看不出去问题所在,这个时候就需要远程debug下服务器上的项目. 注意:(1)需要debug的代码,本机代码需与服务器上一致 ...
- vue+ivew-admin开发项目,内存占用过大解决办法
项目用的ivew+admin ivewUI,直接从github上拉下来用的,配置也没改,我们页面比较多,大该30个页面的样子,一启用,我们的电脑就卡了,然后,看一下,内存占用 1.5G+了,我们电脑4 ...
- Vue中引入jquery方法
vue-cli webpack 引入jquery 今天费了一下午的劲,终于在vue-cli 生成的工程中引入了jquery,记录一下.(模板用的webpack) 首先在package.json里的 ...