win7通过源码编译hadoop-2.7.0

      编译hadoop源代码,意义在于当我们使用eclipse进行hadoop开发时,可以直接在本地运行,而无需打包成jar,然后再提交到hadoop服务器进行运行。当然,这还需要一个可以支持hadoop对应版本的eclipse插件,即hadoop-eclipse-2.x.x.jar。

      如果在linux系统上,其实很容易,没有那么多磕磕盼盼。在windows系统上编译,需要安装的程序或者工具比较多。但是总结起来,就那么几个,能够通过ant,maven构建java项目,能够通过gcc编译c++项目。这其中还需要依赖protobuf库。

编译环境需要安装的工具:

  1. jdk1.8,ant1.9,maven3.3(并配置aliyun源,加速构建)
  2. protobuf库 2.4+
  3. visual studio 2010+ (提供msbuild环境)
  4. cmake 2.8+ (命令行下编译c++项目)
  5. cygwin/msys/gitshell (能够运行sh命令)
  6. 下载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项目,均重新构建。如果有错误提示,忽略构建的过程中出现的错误提示。

修改和重新编译的工程或文件位置:

  1. pom.xml->hadoop-2.7.0/hadoop-hdfs-project/hadoop-hdfs/pom.xml
  2. winutils.sln->hadoop-2.7.0/hadoop-common-project/hadoop-common/src/main/winutils/winutils.sln
  3. native.sln->hadoop-2.7.0/hadoop-common-project/hadoop-common/src/main/native/native.sln

关于环境的说明:

  1. 为什么安装了visual studio还需要安装cmake?visual studio提供了msbuild环境,但是并没有提供命令行下构建多项目的工具。
  2. 为什么安装了maven还需要安装ant?构建hadoop-hdfs项目的时候需要ant构建。
  3. 为什么还需要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程序运行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值