设为首页 收藏本站
查看: 833|回复: 0

[经验分享] Hadoop源码学习笔记(2) ——进入main函数打印包信息

[复制链接]
发表于 2015-7-12 07:47:28 | 显示全部楼层 |阅读模式
  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);

  •     }

  •   }
  进来后第一句是什么,当我们运行到这里时发现:
DSC0000.png
  我们在运行每一个程序时,头上都会在控制台或日志文件中输出这一段话。信息内容主要是描述启动了哪个类,主机,参数,版本,以及编译信息。
  跟踪进入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终止时,可以看到以下信息:
DSC0001.png
  这段信息,正是第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文件夹找到了:
DSC0002.png
  发现,这里有一个java文件,然后里面定义了包,在包上加了一个@信息,这正是这个接口的定义,同时,在这里传入了版本,编译者,编译时间等信息。于是我们在程序里就可以获取到这里的值了。
  但又在想了,这个build文件夹不是一开始没有的么,在运行ant后才创建的么,这个java文件是哪来的?
  我们发现,在src文件夹下有saveVersion.sh这么一个文件:
DSC0003.png
  基本可以看出,正是往package-info.java中写入相关信息。
  而这个saveVersion.sh可以再追查,在build.xml中有调用。
  这个@XXX 其实就是.net中的Attribute称之为特性(属性的属性)。
  
  好的,这个main函数中的第一个砍就算过了。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85609-1-1.html 上篇帖子: Hadoop源代码分析【IO专题-SequenceFile】 下篇帖子: Hadoop的InputFormats和OutputFormats
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表