`
seandeng888
  • 浏览: 158158 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

大数据框架hadoop之版本显示的实现逻辑

阅读更多
    版本显示在各个项目或系统中都有使用到,实现方式也各式各样,接下来了解一下hadoop是如何实现版本显示的逻辑的。首先从使用场景开始。

使用场景

    bin目录下打印系统版本信息。

执行命令

结果

hadoop version


 

结果显示,当前的hadoop版本为1.0.0

接下来就一步步地跟踪代码,详细了解一下版本显示的实现逻辑。

Hadoop脚本

首先打开hadoop脚本(目录${HADOOP_HOME}/BIN),查看脚本接收到命令version后调用哪个类来处理。相关脚本如下:

... ...

elif [ "$COMMAND" = "version" ] ; then

  CLASS=org.apache.hadoop.util.VersionInfo

  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"

... ...

从上表可知,脚本接收到version命令后,对应的执行类是org.apache.hadoop.util.VersionInfo

VersionInfo

运行时,对应的执行类VersionInfomain中直接打印消息。相关代码如下:

/**

 * This class finds the package info for Hadoop and the HadoopVersionAnnotation

 * information.

 */

public class VersionInfo {

  private static Package myPackage;

  private static HadoopVersionAnnotation version;

  static {

    myPackage = HadoopVersionAnnotation.class.getPackage();

    version = myPackage.getAnnotation(HadoopVersionAnnotation.class);

  }

  ... ...

  /**

   * 获取了HadoopVersionAnnotation实例的version()方法的返回值。

   * @return the Hadoop version string, eg. "0.6.3-dev"

   */

  public static String getVersion() {

    return version != null ? version.version() : "Unknown";

  }

  

  /**

   * Get the subversion revision number for the root directory

   * @return the revision number, eg. "451451"

   */

  public static String getRevision() {

    return version != null ? version.revision() : "Unknown";

  }

  

  /**

   * 获取了HadoopVersionAnnotation实例的date()方法的返回值。

   * @return the compilation date in unix date format

   */

  public static String getDate() {

    return version != null ? version.date() : "Unknown";

  }

  

  /**

   * 获取了HadoopVersionAnnotation实例的user()方法的返回值。

   * @return the username of the user

   */

  public static String getUser() {

    return version != null ? version.user() : "Unknown";

  }

  

  /**

   * Get the subversion URL for the root Hadoop directory.

   */

  public static String getUrl() {

    return version != null ? version.url() : "Unknown";

  }

  ... ...

  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());

  }

}

定义了静态变量:myPackeageversion。其中versionHadoopVersionAnnotation的实例。 HadoopVersionAnnotationAnnotation接口类,在这里,hadoop项目组通过这种方式来获取系统版本信息。并不是直接写在代码中。

这个类是个比较普通的类,但是管理了Hadoop的版本信息,包括用户、编译时间、版本信息等内容。在这个类中,封装了HadoopVersionAnnotation这个注释类。

HadoopVersionAnnotation

相关代码如下:

/**

 * A package attribute that captures the version of Hadoop that was compiled.

 */

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.PACKAGE)//是对包的注释,很多地方都是用

public @interface HadoopVersionAnnotation {

 

  /**

   * Get the Hadoop version

   * @return the version string "0.6.3-dev"

   */

  String version();

  

  /**

   * Get the username that compiled Hadoop.

   */

  String user();

  

  /**

   * Get the date when Hadoop was compiled.

   * @return the date in unix 'date' format

   */

  String date();

  

  /**

   * Get the url for the subversion repository.

   */

  String url();

  

  /**

   * Get the subversion revision.

   * @return the revision number as a string (eg. "451451")

   */

  String revision();

}

    这只是个接口类,但是纵观整个项目工程,并没有找到实现类;查看整个项目的源码,也没有找到初始化的地方。

    根据JDK语法,如果类型设置为PACKAGE,则需要在这个Annotation所在的包中,有一个package-info.java类,并且定义如下:

@HadoopVersionAnnotation(version="1.0.0-SNAPSHOT")

package org.apache.hadoop;

    这样,在调用HadoopVersionAnnotationversion()方法时,可以得到在package-info.java中对该方法的返回值。

    下面,就要介绍这个package-info.java是怎么来的了。

package-info.java

     查看编译后生成的hadoop-core-1.0.0.jar包,是可以看到package-info.class类的,相关信息如下:


 

由此可以推测,package-info类应该是在项目工程编译过程中生成的,接下来看一下build.xml文件,虽然没有package-info字眼,但确看到了version字眼,而且执行该脚本是在init目标下。如下所示:

  <!-- ====================================================== -->

  <!-- Stuff needed by all targets                            -->

  <!-- ====================================================== -->

<target name="init" depends="ivy-retrieve-common">

... ...

<exec executable="sh">

   <arg line="src/saveVersion.sh ${version} ${build.dir}"/>

</exec>

... ...

</target>

    接下来将目光转移到saveVersion.sh脚本。

saveVersion.sh脚本

    打开脚本saveVersion.sh,终于发现生成package-info.java类的源码了。相关脚本如下:

... ...

mkdir -p $build_dir/src/org/apache/hadoop

cat << EOF | \

  sed -e "s/VERSION/$version/" -e "s/USER/$user/" -e "s/DATE/$date/" \

      -e "s|URL|$url|" -e "s/REV/$revision/" \

      > $build_dir/src/org/apache/hadoop/package-info.java

/*

 * Generated by src/saveVersion.sh

 */

@HadoopVersionAnnotation(version="VERSION", revision="REV", 

                         user="USER", date="DATE", url="URL")

package org.apache.hadoop;

EOF

打开hadoop编译时创建的目录,确实找到了package-info.java类,如下所示:


 
 

再打开package-info.java类,文件内容正是我们所期待的。如下所示:

/*

 * Generated by src/saveVersion.sh

 */

@HadoopVersionAnnotation(version="1.0.0", revision="", 

                         user="e40-nb2-pcmyuser", date="Mon Nov 17 14:40:26     2014", url="")

package org.apache.hadoop;

 

 

  • 大小: 67.2 KB
  • 大小: 44.8 KB
  • 大小: 6.2 KB
2
1
分享到:
评论

相关推荐

    尚硅谷大数据技术之Hadoop(MapReduce)1

    【尚硅谷大数据技术之Hadoop(MapReduce)1】深入解析MapReduce MapReduce是Google提出的一种用于处理和生成大规模数据集的编程模型,被广泛应用于大数据处理领域。Hadoop将其作为核心组件,实现了分布式计算的功能...

    大数据之Hadoop资料.zip

    《大数据之Hadoop详解》 在当今信息化社会,大数据已成为企业竞争力的重要组成部分,而Hadoop作为处理海量数据的基石,其重要性不言而喻。本资料旨在深入解析Hadoop的核心概念、架构以及实际应用,帮助读者掌握...

    尚硅谷大数据技术之Hadoop

    【尚硅谷大数据技术之Hadoop】是一门深入探讨大数据处理技术的课程,主要聚焦于开源框架Hadoop。Hadoop是Apache软件基金会开发的一个分布式计算项目,它为大规模数据集(大于1TB)提供了高容错性的分布式存储和计算...

    基于ssm开发的电力大数据,hadoop+python数据抓取.zip

    在电力大数据场景下,SSM可以用于实现后台业务逻辑,如用户管理、数据存储与查询、业务流程控制等。它能有效地处理电力系统的各种数据,例如用电量、设备状态、故障信息等。 Hadoop则是分布式计算框架,特别适合...

    大数据技术Hadoop+Spark-hadoop和spark

    ### 大数据技术Hadoop与Spark综合解析 #### 一、Hadoop 生态圈组件介绍 ##### Hadoop 核心模块解析 Hadoop作为大数据处理领域的重要基石之一,其核心功能在于提供分布式存储与计算能力。Hadoop的核心模块主要包括...

    大数据技术Hadoop面试题,看看你能答对多少?(3).docx

    在大数据领域,Hadoop是一个关键的技术,它是一个开源的分布式计算框架,专为处理和存储大规模数据而设计。以下是一些关于Hadoop的面试题及其解析,帮助理解Hadoop的核心组件和工作原理。 1. NameNode管理metadata...

    大数据 hadoop mapreduce 词频统计

    总的来说,大数据Hadoop MapReduce词频统计是大数据分析的重要应用之一,它揭示了文本数据的内在结构,为文本挖掘、信息检索等应用提供了基础。通过理解和掌握这一技术,开发者可以更好地应对现代数据驱动决策的需求...

    大数据Hadoop核心之MapReduce详解

    大数据Hadoop核心之MapReduce详解 MapReduce是Hadoop核心模块之一,作为一个分布式运算程序的编程框架,用于用户开发基于Hadoop的数据分析应用。MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合...

    4_尚硅谷大数据之Hadoop运行模式1

    Hadoop作为开源的大数据处理框架,提供了三种主要的运行模式:本地模式、伪分布式模式和完全分布式模式。这些模式分别适用于不同的应用场景和开发测试需求。 **1. 本地运行模式** 本地运行模式是Hadoop为了方便...

    徐老师大数据培训Hadoop+HBase+ZooKeeper+Spark+Kafka+Scala+Ambari

    根据提供的标题、描述、标签及部分内容链接,我们可以推断出这是一个关于大数据技术栈的培训课程,涉及的技术包括Hadoop、HBase、Zookeeper、Spark、Kafka、Scala以及Ambari。下面将针对这些技术进行详细的介绍和...

    大数据--Hadoop HDFS

    ### 大数据、Hadoop与HDFS详解 随着信息技术的快速发展和互联网的普及,数据量呈爆炸性增长态势。传统的数据处理工具和技术已无法满足如此大规模数据的存储、管理和分析需求。为此,Apache Hadoop应运而生,它提供...

    Hadoop大数据期末考试重点

    21. **Mapper类**:Hadoop提供的Mapper类是实现Map阶段逻辑的基础类。 以上是对Hadoop大数据期末考试重点内容的详细解读,涵盖了Hadoop的分布式文件系统HDFS、MapReduce计算模型以及相关配置和操作细节,考生需要对...

    大数据之路选择Hadoop还是MaxCompute?Hadoop开源与MaxCompute对比材料

    ### 大数据之路选择Hadoop还是MaxCompute? #### 一、Hadoop与MaxCompute概述 ##### 1.1 Hadoop介绍与发展历程 Hadoop是由Apache软件基金会开发的一个开源分布式计算平台,采用Java语言编写,旨在支持大规模数据...

    山东大学大数据实验三:Hadoop实现PageRank

    在本实验中,我们将探索如何使用Hadoop框架来实现PageRank算法,这是Google早期用于网页排名的核心算法。这个实验由山东大学设计,旨在让学生深入理解大数据处理和分布式计算的概念。 首先,我们来看PageRank的基本...

    大数据技术 Hadoop开发者第二期 Nutch MapReduce HDFS Hive Mahout HBase 共64页.r

    在大数据技术领域,Hadoop是不可或缺的核心框架,它为海量数据处理提供了分布式计算的基础。本资料主要涵盖了Hadoop开发者第二期的学习内容,包括Nutch、MapReduce、HDFS、Hive、Mahout以及HBase这六个关键组件,...

    大数据处理系统:Hadoop源代码情景分析_大数据_大数据分析_大数据Hadoop_

    本主题将深入解析Hadoop的源代码,帮助理解其内部工作机制,从而更好地运用和优化这个分布式计算框架。 Hadoop的核心由两个主要组件构成:Hadoop Distributed File System (HDFS) 和 MapReduce。HDFS是Hadoop的数据...

    大数据技术之Hadoop(MapReduce&Yarn).docx

    【大数据技术之Hadoop(MapReduce&Yarn)】 Hadoop是一个开源的分布式计算框架,主要由两个关键组件组成:MapReduce和YARN。MapReduce是Hadoop的核心计算模型,用于处理大规模数据集;YARN则是资源管理系统,负责调度...

    大数据 云计算 分布式 hadoop 实践

    【大数据和分布式云计算Hadoop实践】的课程涵盖了大数据处理的核心技术,主要针对Hadoop这一开源框架进行深入探讨。Hadoop不仅是大数据存储的平台,也是计算框架,它允许开发者在不理解分布式系统底层细节的情况下,...

    Hadoop商业应用案例(1)

    Hadoop集群的扩展性使得它可以灵活应对数据量的增长,同时,MapReduce允许开发人员编写自定义的处理逻辑,实现复杂的数据分析任务。此外,Hadoop还常与NoSQL数据库(如HBase)和数据仓库(如Hive)配合,构建大数据...

Global site tag (gtag.js) - Google Analytics