使用场景
在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:基于YARN的大型数据分布式并行编程模式和程序执行框架,是Google的Map Reduce的开源实现。它帮助用户编写处理大型数据集的并行运行程序。MapReduce隐藏了 分布式并行编程的底层细节,开发人员只...
06-hadoop中的RPC框架实现机制.avi 07-hadoop中的RPC应用实例demo.avi 08-hdfs下载数据源码跟踪铺垫.avi 09-hdfs下载数据源码分析-getFileSystem.avi 10-hdfs下载数据源码分析-getFileSystem2.avi 第三天 ...
现有的大数据平台Hadoop、Spark等都在处理文本数据方面具有很好的支持,并且效率也经过了各种优化,所以在利用分布式框架来处理日志类数据,工作难度往往是如何对这些数据进行逻辑上的处理。但是对于非结构化数据,...
本文档面向的是希望对 Spark 设计与实现机制,以及大数据分布式处理框架深入了解的 Geeks。 因为 Spark 社区很活跃,更新速度很快,本文档也会尽量保持同步,文档号的命名与 Spark 版本一致,只是多了一位,最后一...
系统分为前台和后台两部分,前台采用 JSP 和Js编写界面和前端逻辑校验,后台开发主要采用Java语言,使用spring、bootmetro-master等Java EE开发框架,同时使用 MySQL、HDFS Java API等实现云盘用户注册功能、用户...
现在想转行到数据分析师该怎么做? 数据分析师是一个未来10年内都会很火爆...【资料免费领取】简历模板、职场PPT模板、硬核学习资料+PDF资料(SQL、Python、HIVE、HADOOP、大数据等等)https://jinshuju.net/f/fsBfIu
《Hadoop硬实战》包含: ·Hadoop和MapReduce的基本概念 ·85个实战和测试技术 ·真实的场景,实用的解决方案 ·如何整合MapReduce和R前言 致谢关于本书 第1 部分 背景和基本原理1 跳跃中的Hadoop1.1 什么...
3、精通分布式计算框架(hadoop、spark、Storm等)及相关经验,熟练掌握Hive/SQL,Python,熟悉Python、R相关数值科学计算库(NumPy,SciPy等); 4、了解传统的BI/DW 理论,能结合传统BI***实践设计大数据平台; 5、熟悉...
Hadoop集群搭建、HDFS...具体而言,本套文档介绍了大数据的总体情况,指导了如何建立Hadoop集群,深入解释了HDFS的各种机制和调优方法,分析了MapReduce计算框架的核心阶段,以及Yarn在资源调度方面的原理和应用。
使用Hadoop HDFS作为文件存储系统、HBase作为数据存储仓库,采用SpringMVC+Spring框架实现,包括用户注册与登录、我的网盘、关注用户 毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验...
在本阶段,我们主要验证每⼀个处理节点的业务逻辑是否正确, 并验证在多个运⾏后,确保: 1. Map Reduce过程⼯作正常 2. 数据聚合、分离规则已经实现 3. 数据key-value关系已正确⽣成 4. 验证经过map reduce后数据的...
于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。...
四个⼟豪在⼀次聚会中⽐拼财产的逻辑推理题。 A:四个⼈中,B最富。 B:四个⼈中,C最富。 C:我不是最富有的。 D:C⽐我富,A⽐C富。 已知,其中只有⼀个⼈在说假话。 请问:四个⼈中谁最富?从最富到最不富的顺序...
于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。...
本文档面向的是希望对 Spark 设计与实现机制,以及大数据分布式处理框架深入了解的 Geeks。因为 Spark 社区很活跃,更新速度很快,本文档也会尽量保持同步,文档号的命名与 Spark 版本一致,只是多了一位,最后一位...
第2 部分 数据逻辑. 2 将数据导入导出Hadoop. 2.1 导入导出的关键要素 2.2 将数据导入Hadoop . 2.2.1 将日志文件导入Hadoop 技术点1 使用Flume 将系统日志文件导入HDFS 2.2.2 导入导出半结构化和二...
各⼤数据组件介绍 ⼀、zookeeper ZooKeeper是⼀个的,开放源码的协调服务,是的Chubby⼀个的实现,是Hadoop和Hbase的重要组件。它是⼀个为分布式应⽤提供⼀致 性服务的软件,提供的功能包括:配置维护、域名服务、...
首先大数据存储和分析引擎Hadoop自2006年诞生。谈及Hadoop大家自然不会对 MapReduce感到陌生,它将计算分为两个阶段,分别为 Map 和 Reduce。MapReduce计算框架虽然借鉴了函数式编程和矢量编程的思想完成了分布式...
现有的大数据平台Hadoop、Spark等都在处理文本数据方面具有很好的支持,并且效率也经过了各种优化,所以在利用分布式框架来处理日志类数据,工作难度往往是如何对这些数据进行逻辑上的处理。但是对于非结构化数据,...
基于现有的hadoop大数据处理,已经不能够满足业务上对实时性的需求。基于过去的大数据处理的经验和对最新技术的运用,探索出一个对海量的数据流进行实时的收集,处理,分发和分析的平台。并于2015年2月底开源此平台:...