编译hadoop源代码,意义在于当我们使用eclipse进行hadoop开发时,可以直接在本地运行,而无需打包成jar,然后再提交到hadoop服务器进行运行。当然,这还需要一个可以支持hadoop对应版本的eclipse插件,即hadoop-eclipse-2.x.x.jar。
如果在linux系统上,其实很容易,没有那么多磕磕盼盼。在windows系统上编译,需要安装的程序或者工具比较多。但是总结起来,就那么几个,能够通过ant,maven构建java项目,能够通过gcc编译c++项目。这其中还需要依赖protobuf库。
编译环境需要安装的工具:
- jdk1.8,ant1.9,maven3.3(并配置aliyun源,加速构建)
- protobuf库 2.4+
- visual studio 2010+ (提供msbuild环境)
- cmake 2.8+ (命令行下编译c++项目)
- cygwin/msys/gitshell (能够运行sh命令)
- 下载hadoop-2.7.0源代码。https://github.com/apache/hadoop/archive/release-2.7.0.zip
关于环境的几点说明,如果安装的是visual studio 2010,那么在执行maven package的时候无需更改任何配置,或者重新构建winutils.sln,native.sln。如果是visual studio 2015 或者 visual studio 2017,需要修改一个pom.xml配置文件。并且需要在visual studio中打开winutils.sln,native.sln项目,均重新构建。如果有错误提示,忽略构建的过程中出现的错误提示。
修改和重新编译的工程或文件位置:
- pom.xml->hadoop-2.7.0/hadoop-hdfs-project/hadoop-hdfs/pom.xml
- winutils.sln->hadoop-2.7.0/hadoop-common-project/hadoop-common/src/main/winutils/winutils.sln
- native.sln->hadoop-2.7.0/hadoop-common-project/hadoop-common/src/main/native/native.sln
关于环境的说明:
- 为什么安装了visual studio还需要安装cmake?visual studio提供了msbuild环境,但是并没有提供命令行下构建多项目的工具。
- 为什么安装了maven还需要安装ant?构建hadoop-hdfs项目的时候需要ant构建。
- 为什么还需要cygwin的环境?构建过程中需要运行maven-antrun-plugin的一些任务,这些任务中需要本地能够执行sh命令。
我本机的环境如下:
另外我的linux like环境是git-shell,而不是cygwin。
开始构建:
一定要从visual studio提供的命令行工具进入命令行:开始菜单->所有程序->Visual Studio 2017->Visual Studio Tools->VC->适用于VS 2017的x64本机工具命令提示,然后通过切换目录的方式进入hadoop-2.7.0源码目录,如下所示:
编译命令:mvn package -Pdist,native-win -DskipTests -Dtar -Dmaven.javadoc.skip=true -e
我这里复现了如果是vs2017,编译开始之前,不做重新构建的修改时,出现编译环境不兼容的问题。
D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets
\Microsoft.Cpp.Platform.targets(65,5): error MSB8020: 无法找到 Visual Studio 2010 的生成工具
(平台工具集 =“v100”)。若要使用 v100 生成工具进行生成,请安装 Visual Studio 2010 生成工具。或者,
可以升级到当前 Visual Studio 工具,方式是通过选择“项目”菜单或右键单击该解决方案,然后选择“重定解决
方案目标”。 [E:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\winutils
\libwinutils.vcxproj]
为了后面编译hadoop-hdfs也能顺利通过,这里一次性修改三处。将前面提到的因为visual studio版本不一致的问题全部解决。
重新生成native,winutils项目。打开visual studio 2017,打开项目,找到native.sln所在的位置,导入之后,会提示按照新的windows sdk版本来编译,默认编译版本是windows sdk8。
1>------ 已启动全部重新生成: 项目: native, 配置: Release x64 ------
1>lz4.c
1>lz4hc.c
1>Lz4Compressor.c
1>Lz4Decompressor.c
1>file_descriptor.c
1>NativeIO.c
1>e:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\native\src\org\apache\hadoop\io\nativeio\nativeio.c(292): warning C4312: “类型强制转换”: 从“long”转换到更大的“HANDLE”
1>e:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\native\src\org\apache\hadoop\io\nativeio\nativeio.c(582): warning C4311: “类型强制转换”: 从“HANDLE”到“long”的指针截断
1>e:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\native\src\org\apache\hadoop\io\nativeio\nativeio.c(655): warning C4311: “类型强制转换”: 从“HANDLE”到“long”的指针截断
1>e:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\native\src\org\apache\hadoop\io\nativeio\nativeio.c(996): warning C4312: “类型强制转换”: 从“long”转换到更大的“HANDLE”
1>e:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\native\src\org\apache\hadoop\io\nativeio\nativeio.c(1051): warning C4312: “类型强制转换”: 从“long”转换到更大的“HANDLE”
1>JniBasedUnixGroupsMappingWin.c
1>bulk_crc32.c
1>e:\workspace\hadoop-2.7.0\hadoop-common-project\hadoop-common\src\main\native\src\org\apache\hadoop\util\bulk_crc32.c(58): warning C4091: “static ”: 没有声明变量时忽略“int”的左侧
1>NativeCodeLoader.c
1>NativeCrc32.c
1>windows_secure_container_executor.c
1>LINK : fatal error LNK1181: 无法打开输入文件“libwinutils.lib”
1>已完成生成项目“native.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
忽略构建过程中的警告和错误。同理,winutils.sln也是一样的方式重新构建。
修改hadoop-2.7.0/hadoop-hdfs-project/hadoop-hdfs/pom.xml配置文件,修改构建器的版本,如果是vs2015,那么修改为14,如果是vs2017,那么修改为15:
如果不修改hadoop-2.7.0/hadoop-hdfs-project/hadoop-hdfs/pom.xml配置文件中的构建器版本信息,那么在构建hadoop-hdfs时会报错,没有可用的c和cxx编译器:
main:
[exec] -- The C compiler identification is unknown
[exec] CMake Error in CMakeLists.txt:
[exec] No CMAKE_C_COMPILER could be found.
[exec]
[exec]
[exec]
[exec] CMake Error in CMakeLists.txt:
[exec] No CMAKE_CXX_COMPILER c-- The CXX compiler identification is unknown
[exec] -- Configuring incomplete, errors occurred!
[exec] See also "E:/workspace/hadoop-2.7" could be found.
[exec]
[exec]
[exec]
[exec] .0/hadoop-hdfs-project/hadoop-hdfs/target/native/CMakeFiles/CMakeError.log".
当我们修改了构建器版本的时候,当构建到hadoop-hdfs时,会出现这样的信息:
这样,继续编译,那么就会顺利编译完成了。
构建成功的hadoop版本在hadoop-dist/target目录。
至此,整个编译hadoop源码的过程就完成了,其中经历过很多报错,以及查找报错解决办法,这是一个很有意义的过程。编译一个源码,不仅可以得到我们想要的文件,而且还可以学到很多编程时无法接触到的东西。这里捣鼓visual studio将我的visual studio折腾的无法进行设置项目属性。这其中遇到的两三个问题,是由于hadoop中依赖的native,winutils项目编译版本不一致导致的兼容问题。
接下来就是源码编译一个合适hadoop版本的eclipse插件,可以在本地以Run As ->Java Application的方式进行远程mapreduce程序运行。