首先需要把源码包里的building.txt认真的看一遍,这里有教你如何直接编译(window或者linux版)也有教你如何编译导入eclipse中。
我在这里犯下的错误,就是没有认真吧这个看完,在网上找里若干技术博客,就开始编译了,后面才有了一系列的问题接踵而来……
请看这几段及其重要的地方:
第一步:
第一段为hadoop编译的必须安装环境,这些常见软件的安装,有需直接yum install,有需下载tar.gz包(源码包进行编译)配置环境变量的,不会的话查找相关博客。
----------------------------------------------------------------------------------
Requirements:
* Unix System
* JDK 1.7+
* Maven 3.0 or later
* Findbugs 1.3.9 (if running findbugs)
* ProtocolBuffer 2.5.0
* CMake 2.6 or newer (if compiling native code), must be 3.0 or newer on Mac
* Zlib devel (if compiling native code)
* openssl devel ( if compiling native hadoop-pipes and to get the best HDFS encryption performance )
* Linux FUSE (Filesystem in Userspace) version 2.6 or above ( if compiling fuse_dfs )
* Internet connection for first build (to fetch all Maven and Hadoop dependencies)
第二步:
你需要首先编译这个目录下项目 hadoop-maven-plugins
$ cd hadoop-maven-plugins
$ mvn install
第三步:
如下为一般博客直接教你通过mvn命令编译或者打包的,经过漫长的下载和等待(由于特设社会主义原因,中间你可能会错误n次,直接重复下面面命令n次)直到所有编译打包成功为止。
----------------------------------------------------------------------------------
Building distributions:
Create binary distribution without native code and without documentation:
$ mvn package -Pdist -DskipTests -Dtar
在这里,如果,你直接吧这编译好的源码导入到eclipse中,你会发现,你随便找一个类的父类,都会报这个父类的项目不存在……,无解中。
第四步:
如果你仅仅是为了编译源码,而不是要调试源码,那么上面三个步骤,可以完成任务了。但是作为追求卓越的你,可能想看看原理,调试源码,那就需要跳过第三步(不需要执行第三步),直接执行如下:
到源码的根目录下
----------------------------------------------------------------------------------
$ mvn eclipse:eclipse -DskipTests
编译完成之后,导入maven文件即可。
如上导入eclipse之后,你会发现绝大部分都有问题,你打开文件细看之后,1)就会发现绝大部分都是pom.xml文件某个插件导致的语法有错误,2)java代码错误,3)hadoop-streamingbu项目的build path有问题(直接把这个报错的buildpath删掉):
关于1)pom.xml文件上的错误,你拷贝到百度上,发现最好的解决办法就是:
如图在maven的生命周期配置路径/home/tianjun/workpalce/.metadata/.plugins/org.eclipse.m2e.core配置如下文件lifecycle-mapping-metadata.xml,点击Reload workspace lifecycle mappings metadata按钮,在最外侧的项目上右键->maven->update project
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-antrun-pluginartifactId>
<goals>
<goal>rungoal>
goals>
<versionRange>[1.7,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-remote-resources-pluginartifactId>
<goals>
<goal>bundlegoal>
goals>
<versionRange>[1.5,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-maven-pluginsartifactId>
<goals>
<goal>version-infogoal>
goals>
<versionRange>[2.7.4,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-maven-pluginsartifactId>
<goals>
<goal>protocgoal>
goals>
<versionRange>[2.7.4,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.avrogroupId>
<artifactId>avro-maven-pluginartifactId>
<goals>
<goal>schemagoal>
goals>
<versionRange>[1.7.4,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<goals>
<goal>test-jargoal>
goals>
<versionRange>[2.5,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-plugin-pluginartifactId>
<goals>
<goal>descriptorgoal>
goals>
<versionRange>[3.4,)versionRange>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
pluginExecutions>
lifecycleMappingMetadata>
其实看文件就知道是把这些报语法错误的插件在它的生命周期中忽略掉。
这样我们就会发现,现在只剩下java源码错误的问题了,认真看下,其实这些好像都是缺少某些实体类导致的问题,
其实这些很好理解,本质上这是缺avro rpc序列化的实体和协议类,这是由于avro对应的类是由maven插件在编译的时候生成的,但是,由于pom.xml语法错误,我们忽略了这个插件,自然就不会生成对应的java类了,
解决方法:
下载对应的avro-tool工具,如下,我在maven仓库下载avro-tools-1.7.7.jar,放在/home/tianjun/myjar目录下,用这个指定的目录来的工具来生成对应的java文件
cd /home/tianjun/eclipse-workspace/hadoop-2.7.4-src/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/avro
执行
java -jar /home/tianjun/myjar/avro-tools-1.7.7.jar compile protocol Events.avpr ../java
-------------------------------------------------------------------------------------------------------
cd /home/tianjun/eclipse-workspace/hadoop-2.7.4-src/hadoop-common-project/hadoop-common/src/test/avro
执行
java -jar /home/tianjun/myjar/avro-tools-1.7.7.jar compile schema avroRecord.avsc ../java
最后,你会发现生成对应的java类之后,所有依赖都有了,java代码错误都ok了。