Hadoop中的VersionInfo类

这个类是个比较普通的类,但是管理了Hadoop的版本信息,包括用户、编译时间、版本信息等内容。在这个类中,封装了HadoopVersionAnnotation这个注释类。由于个人觉得这个设置挺巧妙,值得学习,所以特别拿出来说明进行分享。

下面就VersionInfo的几个调用场景进行说明

(1)打印系统版本信息。运行hadoop VERSION时,对应的执行类即为VersionInfo在main中直接打印消息。

public static void main(String[] args) {
    System.out.println("Hadoop " + getVersion());
    System.out.println("Subversion " + getUrl() + " -r " + getRevision());
    System.out.println("Compiled by " + getUser() + " on " + getDate());
    System.out.println("From source with checksum " + getSrcChecksum());
  }

(2)在namenode等后台进程启动时,会调用StringUtils.startupShutdownMessage(NameNode.class, argv, LOG);打印当前的进程和系统消息。

其中startupShutdownMessage打印进程启动或停止的消息日志。

当进程启动时:

LOG.info(
        toStartupShutdownString("STARTUP_MSG: ", new String[] {
            "Starting " + classname,  //打印类名
            "  host = " + hostname,   //机器名和IP地址
            "  args = " + Arrays.asList(args), //参数列表
            "  version = " + VersionInfo.getVersion(), //后面的都是从VersionInfo获取的系统信息。
            "  build = " + VersionInfo.getUrl() + " -r "  
                         + VersionInfo.getRevision() 
                         + "; compiled by '" + VersionInfo.getUser()
                         + "' on " + VersionInfo.getDate()}
        )
      );

当进程停止时,执行run中的内容。可以搜索addShutdownHook,即可理解这部分代码。这个部分和VersionInfo无关,只是顺便说明。

Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        LOG.info(toStartupShutdownString("SHUTDOWN_MSG: ", new String[]{
          "Shutting down " + classname + " at " + hostname}));
      }
    });

好了,到此为止,对VersionInfo的功能进行了介绍,下面介绍其工作的原理。

(3)VersionInfo的工作原理。

定义了静态变量:myPackeage和version。其中version是HadoopVersionAnnotation的实例。HadoopVersionAnnotation是Annotation接口类,在这里,hadoop项目组通过这种方式来获取系统版本信息。并不是直接写在代码中。后面会说到,这实际是从build过程就开始的工作。

private static Package myPackage;
  private static HadoopVersionAnnotation version;
 
  static {
    myPackage = HadoopVersionAnnotation.class.getPackage();
    version = myPackage.getAnnotation(HadoopVersionAnnotation.class);
  }


  /**
   * Get the meta-data for the Hadoop package.
   * @return
   */
  static Package getPackage() {
    return myPackage;
  }
 
  /**
   * Get the Hadoop version.
   * @return the Hadoop version string, eg. "0.6.3-dev"
   */

//代码较多,这里就取getVersion()方法来说明,实际是获取了HadoopVersionAnnotation实例的version()方法的返回值。
  public static String getVersion() {
    return version != null ? version.version() : "Unknown";
  }

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8448fad89572eb22f9b26cbd20707327.html