使用场景
在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
运行时,对应的执行类VersionInfo在main中直接打印消息。相关代码如下:
/** * 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()); } } |
定义了静态变量:myPackeage和version。其中version是HadoopVersionAnnotation的实例。 HadoopVersionAnnotation是Annotation接口类,在这里,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;
这样,在调用HadoopVersionAnnotation的version()方法时,才可以得到在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; |
相关推荐
【尚硅谷大数据技术之Hadoop(MapReduce)1】深入解析MapReduce MapReduce是Google提出的一种用于处理和生成大规模数据集的编程模型,被广泛应用于大数据处理领域。Hadoop将其作为核心组件,实现了分布式计算的功能...
《大数据之Hadoop详解》 在当今信息化社会,大数据已成为企业竞争力的重要组成部分,而Hadoop作为处理海量数据的基石,其重要性不言而喻。本资料旨在深入解析Hadoop的核心概念、架构以及实际应用,帮助读者掌握...
【尚硅谷大数据技术之Hadoop】是一门深入探讨大数据处理技术的课程,主要聚焦于开源框架Hadoop。Hadoop是Apache软件基金会开发的一个分布式计算项目,它为大规模数据集(大于1TB)提供了高容错性的分布式存储和计算...
在电力大数据场景下,SSM可以用于实现后台业务逻辑,如用户管理、数据存储与查询、业务流程控制等。它能有效地处理电力系统的各种数据,例如用电量、设备状态、故障信息等。 Hadoop则是分布式计算框架,特别适合...
### 大数据技术Hadoop与Spark综合解析 #### 一、Hadoop 生态圈组件介绍 ##### Hadoop 核心模块解析 Hadoop作为大数据处理领域的重要基石之一,其核心功能在于提供分布式存储与计算能力。Hadoop的核心模块主要包括...
在大数据领域,Hadoop是一个关键的技术,它是一个开源的分布式计算框架,专为处理和存储大规模数据而设计。以下是一些关于Hadoop的面试题及其解析,帮助理解Hadoop的核心组件和工作原理。 1. NameNode管理metadata...
总的来说,大数据Hadoop MapReduce词频统计是大数据分析的重要应用之一,它揭示了文本数据的内在结构,为文本挖掘、信息检索等应用提供了基础。通过理解和掌握这一技术,开发者可以更好地应对现代数据驱动决策的需求...
大数据Hadoop核心之MapReduce详解 MapReduce是Hadoop核心模块之一,作为一个分布式运算程序的编程框架,用于用户开发基于Hadoop的数据分析应用。MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合...
Hadoop作为开源的大数据处理框架,提供了三种主要的运行模式:本地模式、伪分布式模式和完全分布式模式。这些模式分别适用于不同的应用场景和开发测试需求。 **1. 本地运行模式** 本地运行模式是Hadoop为了方便...
根据提供的标题、描述、标签及部分内容链接,我们可以推断出这是一个关于大数据技术栈的培训课程,涉及的技术包括Hadoop、HBase、Zookeeper、Spark、Kafka、Scala以及Ambari。下面将针对这些技术进行详细的介绍和...
### 大数据、Hadoop与HDFS详解 随着信息技术的快速发展和互联网的普及,数据量呈爆炸性增长态势。传统的数据处理工具和技术已无法满足如此大规模数据的存储、管理和分析需求。为此,Apache Hadoop应运而生,它提供...
21. **Mapper类**:Hadoop提供的Mapper类是实现Map阶段逻辑的基础类。 以上是对Hadoop大数据期末考试重点内容的详细解读,涵盖了Hadoop的分布式文件系统HDFS、MapReduce计算模型以及相关配置和操作细节,考生需要对...
### 大数据之路选择Hadoop还是MaxCompute? #### 一、Hadoop与MaxCompute概述 ##### 1.1 Hadoop介绍与发展历程 Hadoop是由Apache软件基金会开发的一个开源分布式计算平台,采用Java语言编写,旨在支持大规模数据...
在本实验中,我们将探索如何使用Hadoop框架来实现PageRank算法,这是Google早期用于网页排名的核心算法。这个实验由山东大学设计,旨在让学生深入理解大数据处理和分布式计算的概念。 首先,我们来看PageRank的基本...
在大数据技术领域,Hadoop是不可或缺的核心框架,它为海量数据处理提供了分布式计算的基础。本资料主要涵盖了Hadoop开发者第二期的学习内容,包括Nutch、MapReduce、HDFS、Hive、Mahout以及HBase这六个关键组件,...
本主题将深入解析Hadoop的源代码,帮助理解其内部工作机制,从而更好地运用和优化这个分布式计算框架。 Hadoop的核心由两个主要组件构成:Hadoop Distributed File System (HDFS) 和 MapReduce。HDFS是Hadoop的数据...
【大数据技术之Hadoop(MapReduce&Yarn)】 Hadoop是一个开源的分布式计算框架,主要由两个关键组件组成:MapReduce和YARN。MapReduce是Hadoop的核心计算模型,用于处理大规模数据集;YARN则是资源管理系统,负责调度...
【大数据和分布式云计算Hadoop实践】的课程涵盖了大数据处理的核心技术,主要针对Hadoop这一开源框架进行深入探讨。Hadoop不仅是大数据存储的平台,也是计算框架,它允许开发者在不理解分布式系统底层细节的情况下,...
Hadoop集群的扩展性使得它可以灵活应对数据量的增长,同时,MapReduce允许开发人员编写自定义的处理逻辑,实现复杂的数据分析任务。此外,Hadoop还常与NoSQL数据库(如HBase)和数据仓库(如Hive)配合,构建大数据...