1. 编译hadoop-2.7.2的目的
编译hadoop源代码,意义在于当我们使用eclipse进行hadoop开发时,可以直接在本地运行,而无需打包成jar,然后再提交到hadoop服务器进行运行。当然,这还需要一个可以支持hadoop对应版本的eclipse插件,即
hadoop-eclipse-2.x.x.jar
。如果在linux系统上,其实很容易,没有那么多磕磕盼盼。在windows系统上编译,需要安装的程序或者工具比较多。但是总结起来,就那么几个,能够通过
ant
,maven
构建java
项目,能够通过gcc
编译c++
项目。这其中还需要依赖protobuf
库。
我当前的环境是:
windows
版本:windows 10
教育版
Hadoop
:2.7.2
2. 准备工作
-
下载
hadoop-2.7.2-src.zip
,对此版本的Hadoop进行编译得到最终的jar,好在 -
解压
hadoop-2.7.2-src.zip
加压后的目录结构如下:
-
查看上面的
BUILDING.txt
,了解构建的详情编译的说明在
BUILDING.txt
文件中,通过搜索windows
找到windows
编译的说明。
根据需要安装如下这些库
Building on Windows
----------------------------------------------------------------------------------
Requirements:
* Windows 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
* Windows SDK 7.1 or Visual Studio 2010 Professional
* Windows SDK 8.1 (if building CPU rate control for the container executor)
* zlib headers (if building native code bindings for zlib)
* Internet connection for first build (to fetch all Maven and Hadoop dependencies)
* Unix command-line tools from GnuWin32: sh, mkdir, rm, cp, tar, gzip. These
tools must be present on your PATH.
Unix command-line tools are also included with the Windows Git package which
can be downloaded from http://git-scm.com/download/win.
If using Visual Studio, it must be Visual Studio 2010 Professional (not 2012).
Do not use Visual Studio Express. It does not support compiling for 64-bit,
which is problematic if running a 64-bit system. The Windows SDK 7.1 is free to
download here:
http://www.microsoft.com/en-us/download/details.aspx?id=8279
根据BUILDING.txt
中所述,在windows10中使用如下的库:
-
git-2.32.0-64-bit.exe,通过安装git就能够在
cmd
中使用ls
、sh
等linux
命令,这个在编译过程中是需要的。 -
Visual Studio 2019 Community 选择需要安装的组件,C++的是必须的。注意是Visual Studio不是Visual Studio Code。
-
openssl,使用第三方下载Windows安装使用Openssl更方便
-
安装有疑问的网上搜索都会有教程的。
最终的环境变量Path如下图所示:
# 新增环境变量
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_261
HADOOP_HOME=D:\software\hadoop-2.7.2
ANT_HOME=C:\Users\sjl\Downloads\apache-ant-1.9.15
CYGWIN64_HOME=C:\cygwin64
OPENSLL_HOME=C:\Program Files\OpenSSL-Win64
Platform=x64
ZLIB_HOME=D:\Program Files\zlib127-dll\include
MAVEN_HOME=D:\Program Files\apache-maven-3.6.3-bin\apache-maven-3.6.3
# 在系统环境变量Path中添加
%JAVA_HOME%\bin
%CYGWIN64_HOME%\bin
%MAVEN_HOME%\bin
%JAVA_HOME%\jre\bin
%HADOOP_HOME%\bin
C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\
D:\Program Files\findbugs-1.3.9\bin
D:\Program Files\protobuf-2.5.0\src
%ANT_HOME%\bin
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
%OPENSSL_HOME%\bin
%CYGWIN64_HOME%\bin
在cmd
中验证:
ant -v
mvn -v
protoc --version
java -version
findbugs -version
cmake -version
当这些库都准备好之后,就可以开始编译了。
3. 编译
通过开始
> Visual Studio 2019
>Developer Command Prompt for VS2019
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>d:
D:\>cd hadoop-2.7.2-src
D:\hadoop-2.7.2-src>ls
BUILDING.txt dev-support hadoop-dist hadoop-minicluster hadoop-yarn-project
LICENSE.txt hadoop-assemblies hadoop-hdfs-project hadoop-project pom.xml
NOTICE.txt hadoop-client hadoop-mapreduce-project hadoop-project-dist
README.txt hadoop-common-project hadoop-maven-plugins hadoop-tools
# 注意,一定要进入hadoop-2.7.2-src根目录,要有pom.xml才能进行编译
mvn clean package -Pdist -DskipTests
或者
mvn package -Pdist,native,docs -DskipTests -Dtar
# 如果编译失败,修改配置或安装所需库之后,在重复执行上面的mvn。
如果编译中没啥问题的话,就会出现如下结果:
编译好的jar包路径为:D:\hadoop-2.7.2-src\hadoop-dist\target\hadoop-2.7.2
4. 问题总结
通常在编译过程中都会出现点问题,现总结如下:
问题1:
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.1:exec (compile-ms-winutils) on project hadoop-common: Command execution failed.: Cannot run program "msbuild" (in directory "D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common"): CreateProcess error=2, 系统找不到指定的文件。 -> [Help 1]
msbuild
是微软的一个编译工具,这里提示找不到msbuild,因此可能是没有安装msbuild
或没有配置到环境变量中。下面这样是不行的,还会报其他的错,正确的方式是需要下载Visual Studio
,并将msbuild
的路径(如,C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
)加入到系统环境变量Path
中。
# 因为这个目录下有msbuild.exe文件
C:\Windows\Microsoft.NET\Framework\v4.0.30319
问题2:
[INFO] --- exec-maven-plugin:1.3.1:exec (compile-ms-winutils) @ hadoop-common ---
在此解决方案中一次生成一个项目。若要启用并行生成,请添加“/m”开关。
生成启动时间为 2021/6/18 12:06:02。
节点 1 上的项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln”(默认目标)。
ValidateSolutionConfiguration:
正在生成解决方案配置“Release|x64”。
项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln”(1)正在节点 1 上生成“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.
metaproj”(2) (默认目标)。
项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.metaproj”(2)正在节点 1 上生成“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libw
inutils.vcxproj”(3) (默认目标)。
D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.vcxproj(44,3): error MSB4019: 未找到导入的项目“D:\Microsoft.Cpp.Default.props”。请确认 <Import> 声明中的路径正确,且磁
盘上存在该文件。
已完成生成项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.vcxproj”(默认目标)的操作 - 失败。
已完成生成项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.metaproj”(默认目标)的操作 - 失败。
已完成生成项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln”(默认目标)的操作 - 失败。
生成失败。
“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln”(默认目标) (1) ->
“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.metaproj”(默认目标) (2) ->
“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.vcxproj”(默认目标) (3) ->
D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.vcxproj(44,3): error MSB4019: 未找到导入的项目“D:\Microsoft.Cpp.Default.props”。请确认 <Import> 声明中的路径正确,且
磁盘上存在该文件。
0 个警告
1 个错误
已用时间 00:00:00.74
解决办法是:
用Visual Studio
分别打开如下这两个文件,项目 > 重定目标解决方案 > 确定
。目的是将项目信息升级到你的Visual Studio
的版本。
D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln
D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\native\native.sln
从Visual Studio
的输出可以到,通过升级将某些文件中的v100,修改为v142了。
weinutils.sln
也是类似处理。
问题3:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CMake Error at C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY
OPENSSL_INCLUDE_DIR) C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake 230
提示没有找到openssl
,
解决办法是:在window10中安装openssl
,并在系统环境变量中Path
中配置openssl
的路径。
问题4:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (pre-dist) on project hadoop-project-dist: An Ant BuildException has occured: Execute failed: java.io.IOException: Cannot run program "sh" (in directory "D:
\gitCode\JDHadoop-2.7.1\hadoop-project-dist\target"): CreateProcess error=2, ?????????
[ERROR] around Ant part ...<exec dir="D:\gitCode\JDHadoop-2.7.1\hadoop-project-dist\target" executable="sh" failοnerrοr="true">... @ 41:103 in D:\gitCode\JDHadoop-2.7.1\hadoop-project-dist\target\antrun\build-main.xml
[ERROR] -> [Help 1]
解决办法是:安装cygwin64,并配置环境变量。
问题5:
项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.metaproj”(2)正在节点 1 上生成“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.
vcxproj”(3) (默认目标)。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(439,5): error MSB8020: 无法找到 Visual Studio 2010 的生成工具(平台工具集 =“v100”)。若要使用 v100
生成工具进行生成,请安装 Visual Studio 2010 生成工具。或者,可以升级到当前 Visual Studio 工具,方式是通过选择“项目”菜单或右键单击该解决方案,然后选择“重定解决方案目标”。 [D:\hadoop-2.7.2-src\hadoop-common-projec
t\hadoop-common\src\main\winutils\libwinutils.vcxproj]
已完成生成项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.vcxproj”(默认目标)的操作 - 失败。
已完成生成项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.metaproj”(默认目标)的操作 - 失败。
已完成生成项目“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln”(默认目标)的操作 - 失败。
生成失败。
“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln”(默认目标) (1) ->
“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj.metaproj”(默认目标) (2) ->
“D:\hadoop-2.7.2-src\hadoop-common-project\hadoop-common\src\main\winutils\libwinutils.vcxproj”(默认目标) (3) ->
(PrepareForBuild 目标) ->
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(439,5): error MSB8020: 无法找到 Visual Studio 2010 的生成工具(平台工具集 =“v100”)。若要使用 v100
生成工具进行生成,请安装 Visual Studio 2010 生成工具。或者,可以升级到当前 Visual Studio 工具,方式是通过选择“项目”菜单或右键单击该解决方案,然后选择“重定解决方案目标”。 [D:\hadoop-2.7.2-src\hadoop-common-proje
ct\hadoop-common\src\main\winutils\libwinutils.vcxproj]
0 个警告
1 个错误
已用时间 00:00:00.58
这是因为在Hadoop-2.7.2-src/BUILDING.txt
中要求的是Visual Studio 2010
,而当前使用的是Visual Studio 2019
,因此在构建时系统没找到Visual Studio 2010
。
解决办法是:
修改D:\hadoop-2.7.2-src\hadoop-hdfs-project\hadoop-hdfs\pom.xml
中,搜索Visual Studio
,修改Visual Studio 2010
为你所使用的版本。如我修改前后分别为:
# 修改前
<condition property="generator" value="Visual Studio 10" else="Visual Studio 10 Win64">
# 修改后
<condition property="generator" value="Visual Studio 16 2019" else="Visual Studio 16 2019">
如果修改后的版本不对的话,在终端中会提示Visual Studio
的正确版本是哪些的,选择对应的字符串填到上面的位置就行 。
问题6:
错误 MSB4019 Microsoft.Cpp.Default.props
参看vs2019 错误 MSB4019 Microsoft.Cpp.Default.props
这个错误原因是msbuild
没有安装好,或在安装Visual Studio
时没有安装C++组件,或者配置在系统环境变量Path
中的路径有问题,需要修改为Visual Studio
下的正确路径,如:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqPi7W6D-1624180519613)(Hadoop.assets/2020101215410911.png)]
找到自己的原因,然后解决。
从错误编译走向成功编译的过程很枯燥,如果心烦了,就冥想一会而,或出去走走,散去负能量,撸起袖子加油干。
5. 参考
[1] win7通过源码编译hadoop-2.7.0
[2] Win10-x64编译Hadoop2.7.3
[3] Windows 源码编译Hadoop 2.7.4生成X64
[4] Win10x64编译Hadoop2.7.4源码包
[5] Hadoop源代码在Windows下面的编译
[6] vs2019 错误 MSB4019 Microsoft.Cpp.Default.props