在Windows上安装/构建Hadoop时出现错误

9

我正在尝试在Windows x64(8.1和Server 2012 R2)上安装Apache Hadoop 2.7.1,但我失败了:

    [INFO] Apache Hadoop Common ............................... FAILURE [ 37.925 s]

在过去的几天里,我认为我按照所有教程的步骤进行了操作,例如HadoopOnWindowsthis one。我完成了所有先决条件,但是随着我在Google上搜索,我发现与我的问题相关的是以下内容:
  • 将MSBuild.exe的路径设置为:C:\Windows\Microsoft.NET\Framework64\v4.0.30319;,加入到Path中
  • CMake的路径设置为所在位置
  • 安装Microsoft SDK 7.1并使用其Microsoft SDK 7.1 CMD运行
  • 尝试使用Visual Studio 2013编译hadoop-common\src\main\winutils\libwinutils.slnhadoop-common\src\main\winutils\winutils.sln,但由于编译错误而失败。甚至无法使用Visual Studio 2010打开它们。我不知道如何纠正编译错误(如果这是问题的话)

其他人,类似的问题
我正在关注一些类似的话题,包括:one, two, three, four。我主要尝试了所有建议,但仍然无法解决问题。

错误

    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 01:11 min
    [INFO] Finished at: 2015-07-08T15:18:29+02:00
    [INFO] Final Memory: 69M/269M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.1:exec (c
    ompile-ms-winutils) on project hadoop-common: Command execution failed. Process
    exited with an error: 1 (Exit value: 1) -> [Help 1]
    [ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
    ch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR]
    [ERROR] For more information about the errors and possible solutions, please rea
    d the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionE
    xception
    [ERROR]
    [ERROR] After correcting the problems, you can resume the build with the command

    [ERROR]   mvn <goals> -rf :hadoop-common

帮助
我不知道下一步该怎么做,感觉已经尝试了所有方法。请帮助我解决这个错误并在Windows上继续安装Hadoop。

更新1 仔细查看错误堆栈后,我发现找不到文件Microsoft.Cpp.props。此外,整个文件夹Program Files (x86)/MSBuild也丢失了。因此,我安装了Visual Studio 2010,解决了这个问题。

当然,新的问题出现了。我能够构建libwinutils,但无法构建winutils。我收到了很多LNK2001错误:

Error   48  error LNK1120: 18 unresolved externals  C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\x64\Release\winutils.exe  winutils
Error   36  error LNK2001: unresolved external symbol BuildServiceSecurityDescriptor    C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   32  error LNK2001: unresolved external symbol ChownImpl C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   40  error LNK2001: unresolved external symbol CreateEnvironmentBlock    C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   44  error LNK2001: unresolved external symbol CreateLogonTokenForUser   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   41  error LNK2001: unresolved external symbol DestroyEnvironmentBlock   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   37  error LNK2001: unresolved external symbol EnableImpersonatePrivileges   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   34  error LNK2001: unresolved external symbol GetSecureJobObjectName    C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   38  error LNK2001: unresolved external symbol KillTask  C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   43  error LNK2001: unresolved external symbol LoadUserProfileForLogon   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   35  error LNK2001: unresolved external symbol LogDebugMessage   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   46  error LNK2001: unresolved external symbol LookupKerberosAuthenticationPackageId C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   31  error LNK2001: unresolved external symbol MIDL_user_allocate    C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\hadoopwinutilsvc_s.obj    winutils
Error   30  error LNK2001: unresolved external symbol MIDL_user_free    C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\hadoopwinutilsvc_s.obj    winutils
Error   47  error LNK2001: unresolved external symbol RegisterWithLsa   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   33  error LNK2001: unresolved external symbol SplitStringIgnoreSpaceW   C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils
Error   42  error LNK2001: unresolved external symbol UnloadProfileForLogon C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   45  error LNK2001: unresolved external symbol UnregisterWithLsa C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\task.obj  winutils
Error   39  error LNK2001: unresolved external symbol wsceConfigRelativePath    C:\hdfs\hadoop-common-project\hadoop-common\src\main\winutils\service.obj   winutils

更新2 @tiho的答案解决了上述提到的问题(我非常感激,因为这已经花了我4天时间)。现在,一个全新的问题,目标是:

[INFO] Apache Hadoop KMS .................................. FAILURE [  1.531 s]

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-kms: An Ant BuildException has occured: java.net.UnknownHostException: archive.apache.org
[ERROR] around Ant part ...<get dest="downloads/apache-tomcat-6.0.41.tar.gz" skipexisting="true" verbose="true" src="http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache tomcat-6.0.41.tar.gz"/>... @ 5:182 in C:\hadoop-2.7.1-src\hadoop-common project\hadoop-kms\target\antrun\build-main.xml: Unknown host archive.apache.org.

我找到了一个简单的解决方法来解决上述问题。我手动下载并添加到以下文件夹中:
C:\hadoop-2.7.1-src\hadoop-common-project\hadoop-kms\downloads C:\hadoop-2.7.1-src\hadoop-hdfs-project\hadoop-hdfs-httpfs\downloads
然后从以下文件中删除了代码行:
C:\hadoop-2.7.1-src\hadoop-common-project\hadoop-kms\target\antrun\build-main.xml C:\hadoop-2.7.1-src\hadoop-hdfs-project\hadoop-hdfs-httpfs\target\antrun\build-main.xml
<mkdir dir="downloads"/>
  <get dest="downloads/apache-tomcat-6.0.41.tar.gz" skipexisting="true" verbose="true" src="http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz"/>

请注意,我还使用代理,我已在settings.xml中设置了代理,并像@tiho提供的同样答案中建议的那样将PATH设置为MAVEN_OPTS。这是问题吗?除了那里建议的选项外,我还向MAVEN_OPTS添加了密码和用户名。
请注意,我可以使用浏览器访问:http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.41/bin/apache-tomcat-6.0.41.tar.gz
但我仍然很好奇如何正确解决这个问题,因为这个问题仍然会出现,而我需要再次进行相同的解决方法。
更新3 话虽如此,这周最幸福的时刻:
[INFO] ------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------
[INFO] Total time: 21:05 min
[INFO] Finished at: 2015-07-10T11:33:17+02:00
[INFO] Final Memory: 228M/672M
[INFO] ------------------------------------------------

你试过在serverfault.com上问吗? - 0x416e746f6e
不是的。为什么我要在那里问,我应该在那里复制这篇帖子吗? - Cristian Ciobotea
不确定。但如果你在这里得不到答案,也许你能在那里获得帮助。 - 0x416e746f6e
4个回答

8
我已经使用Visual Studio 2015社区版构建了它。
以下是我构建的步骤:
我的环境
这是我购买清单:
Windows 10 JDK 1.8.0_51 Maven 3.3.3 Findbugs 1.3.9(我没有使用它) ProtocolBuffer 2.5.0(我没有选择最新版本,必须是2.5.0) CMake 3.3.0 Visual Studio 2015 Community Edition GnuWin32 0.6.3 - 安装有点痛苦,但cygwin也是 zlib 1.2.8 互联网连接
Windows系统环境变量
JAVA_HOME="C:\ Program Files \ Java \ jdk1.8.0_51" MAVEN_HOME=c:\apache-maven-3.3.3
(确保将上述内容指向您的JDK版本和maven安装位置)
我将以下内容追加到我的Windows系统环境变量Path中:

;%MAVEN_HOME%\bin;C:\Windows\Microsoft.NET\Framework64\v4.0.30319;c:\zlib

奇怪的"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"路径是MSBuild.exe的位置,在构建过程中需要使用。

Protoc Buffers 2.5.0

哦,不要又是仅适用于Unix/Linux的构建吧?我已经下载了名为protoc-2.5.0-win32.zip的谷歌包。然后将二进制文件(protoc.exe)提取到c:\ windows \ system32 - 这只是一种把它放在路径上的懒惰方式。

我不确定拥有此win64构建的win32组件的影响。但是:“Hadoop 0.23+需要协议缓冲区JAR(protobufs.jar)在客户端和服务器的类路径上;需要本机二进制文件来编译此版本和以后的Hadoop。”- http://wiki.apache.org/hadoop/ProtocolBuffers.

因此,我理解win32可执行文件仅在构建过程中使用(jar等效文件应打包在构建中)。

如果它以任何方式用于编译本机代码,则可能会留下一些指针无序。我可以回来时再处理这个问题。

调整Hadoop源代码

这是必要的,以允许构建执行。它不应影响构建本身的质量,但请记住,结果是非官方的、不受支持的、自行承担风险的Hadoop,仅适用于开发环境。

迁移VS项目

以下文件需要使用Visual Studio 2015打开:

\hadoop-common-project\hadoop-common\src\main\winutils\winutils.vcxproj \hadoop-common-project\hadoop-common\src\main\native\native.vcxproj

Visual Studio会提示它们是旧版本。你所要做的就是保存并关闭。

启用cmake VS 2015项目生成hdfs

在\hadoop-hdfs-project\hadoop-hdfs\pom.xml的第441行,将else的值编辑为以下内容:

<condition property="generator" value="Visual Studio 10" else="Visual Studio 14 2015 Win64">

(“value”值适用于win32 - 如果构建win32,则可能需要进行编辑)。

构建它

你应该在Windows上尝试找到“VS2015开发人员命令提示符”。我仍然想知道这个有什么特别之处,但事实是只有它才能正常工作。

更多环境变量 这些应该在命令提示符上完成:

set Platform=x64

set ZLIB_HOME=C:\zlib\include(与官方说明不同,这应该指向include文件夹)。

最后构建它

进入hadoop源文件夹并输入:

mvn package -Pdist,native-win -DskipTests -Dtar

下一步是什么?

按照官方文档配置和启动您的hadoop实例。

我会尝试在我的博客上保留二进制文件的链接:

http://kplitzkahran.blogspot.co.uk/2015/08/hadoop-271-for-windows-10-binary-build.html


非常有帮助的答案!在这个答案的帮助下,我成功地在VS2015 + Windows 10上构建了Hadoop。 - Haibara Ai
1
在Hadoop 3.0.1包文件'\ hadoop-hdfs-project \ hadoop-hdfs \ pom.xml'中没有任何属性可以设置Visual Studio版本。 有什么想法吗? - Dinesh Kumar P

4
花了我一整天的时间才建立起来... 微软在向后兼容方面显然存在很多问题。如果Hadoop能够转移到更近期的工具链,这将会有所帮助。
以下是我必须执行的关键步骤(超出文档中提到的步骤)。这是使用Windows SDK编译器而不是VS 2010(虽然应该可以使用VS 2010,但我没有尝试过):
  1. 卸载Visual Studio 2013(我建议卸载任何Visual Studio >= 2010)-- 这是为了摆脱错误 MSBUILD : Configuration error MSB4146: Cannot evaluate the property expression "$([MSBuild]::ValueOrDefault('$(VCTargetsPath)','$(MSBuildExtensionsPath32)\Microsoft.Cpp\v4.0\V120\'))"
  2. 卸载Visual Studio C++ 2010 Redistributable(x64 + x86)-- 避免安装Windows SDK 7.1时出错
  3. 完全卸载.NET Framework 4.5 -- 避免转换为COFF文件时失败:文件无效或损坏
  4. 重新启动计算机
  5. 安装.NET Framework 4.0
  6. 安装Windows SDK 7.1
我在我的Git安装的bin文件夹(用于GNU工具)、CMake的bin文件夹和包含protoc.exe的文件夹中添加了PATH(在Windows SDK shell中)。此外(但大多数人应该不需要),我必须设置Maven使用我的HTTP代理,首先按照Maven文档中所示编辑settings.xml,但还要通过定义环境变量MAVEN_OPTS=-Dmy.proxy.host -Dhttp.proxyPort=my.proxy.port来设置,否则在构建过程中会出现超时问题。
请注意,在构建过程中我注意到有很多警告:我怀疑其中一些是由于使用Java SDK 1.8而不是1.7引起的。然而,在最终看到BUILD SUCCESS后,我不想再尝试1.7了。

嗨Tiho,感谢您的详细解释。不幸的是,我遇到了上面解释的未解决的外部符号问题。我按照发布的说明进行操作,但仍然没有成功。 Visual Studio 2010,Java 1.8,Windows 10 32位,Hadoop 2.6 我无法使用VS构建winutils和其他库。 这可能是我的系统设置有问题。我认为我不必修复任何源代码,这可能是一个配置问题。 任何意见都将不胜感激。 此致, Paul - Playing With BI
@PlayingWithBI,恐怕我不能说比我上面发布的更多了,我自己还没有尝试过任何其他的设置。但是我看到你提到了VS 2010,而我个人卸载了它并使用了Windows SDK编译器。也许你也可以试试? - tiho

2
我在Windows 10上,使用Visual Studio 2017成功构建了Hadoop 3.0.2。以下是我的设置:
  1. Windows 10操作系统
  2. Visual Studio 2017社区版
  3. Maven 3.5.0
  4. JDK 1.8.0_144
  5. Cmake 3.10.0-rc1
  6. ProtocolBuffer 2.5.0
  7. Cygwin
首先打开这两个解决方案文件,并在VS 2017中保存。
hadoop-3.0.2-src\hadoop-common-project\hadoop-common\src\main\winutils\winutils.sln

并且。
hadoop-3.0.2-src\hadoop-common-project\hadoop-common\src\main\native\native.sln

这将把这两个项目从VS 2010迁移到VS 2017。

第二步,我需要更改位于pom文件中第141行的代码:

D:\hadoop-3.0.2-src\hadoop-hdfs-project\hadoop-hdfs-native-client\pom.xml

to

<condition property="generator" value="Visual Studio 10" else="Visual Studio 15 2017 Win64">

这将确保在构建过程中使用VS 2017。

我也遇到了一个问题,即MSBuild抱怨命令太长然后停止工作,我认为这与Maven默认仓库位置有关。为了解决这个问题,我添加了以下行:

<localRepository>D:/maven_repo</localRepository>

写入文件

apache-maven-3.5.0\conf\settings.xml

将Maven仓库移动到新位置(在这种情况下是D:/maven_repo)。

最后,我打开了x64 Native Tools Command Prompt for VS 2017cd到hadoop源文件夹并输入以下命令:

mvn clean package -Pdist,native-win -DskipTests -Dtar -Dmaven.repo.local=D:\maven_repo

我花了超过10个小时来解决所有问题,希望我的解决方案也能帮助其他人。


0

我想分享一下在Windows 8.1上构建Hadoop 3.1.2的经验。我花了很多时间修复构建错误,但我所需要的只是Hadoop源代码根目录下Building.txt文件中的“在Windows上构建”部分。

我使用了“用于VS 2017的x64本机工具命令提示符”。

因此,以下是我的步骤


1. 阅读'\hadoop-3.1.2-src\Building.txt',其中的“在Windows上构建”章节。

这实际上可能足以弄清楚你需要做什么,但是在VS 2017中,这个过程有点不同。


2. 将源代码放到短路径中,以避免“命令行过长”的错误。

我使用了d:\hdp\文件夹


3. 如Building.txt所述,使用'\hadoop-3.1.2-src\dev-support\win-paths-eg.cmd'设置环境。

当您使用本机工具时,您不需要在.cmd文件的末尾使用CALL命令,因此请将其注释掉:

@REM CALL "%MSVS%\VC\vcvarsall.bat" %VCVARSPLAT%

我的设置看起来像这样:

SET Platform=x64
SET VCVARSPLAT=amd64

@REM ******************
@REM Forcibly move the Maven local repo
@REM (use short path to avoid 'the command line is too long' error)

SET MAVEN_OPTS=-Dmaven.repo.local=D:\.m2

@REM *******************************************
@REM
@REM Locations of your bits and pieces
@REM
@REM NOTE: cmake is assumed to already be on the
@REM command path
@REM (it's true when you use Native Tools Command Prompt)

SET MAVEN_HOME=%MAVEN_HOME%
SET JAVA_HOME=%JAVA_HOME%
@REM SET MSVS=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional
SET PROTO_BIN=D:\tools\protoc-2.5.0-win32
SET GIT_HOME=C:\Program Files (x86)\Git
set ZLIB_HOME=D:\tools\zlib-1.2.11

SET PATH=%JAVA_HOME%\bin;%MAVEN_HOME%\bin;%PROTO_BIN%;%GIT_HOME%\bin;%PATH%

@REM CALL "%MSVS%\VC\vcvarsall.bat" %VCVARSPLAT%

当然,您需要在上面列出的路径中安装Java、Maven、ProtoBuf、Git和ZLib。

4. 运行“VS 2017的x64本机工具命令提示符”

从“VS 2017的x64本机工具命令提示符”中进入Hadoop源文件夹,运行您的“win-paths-eg.cmd”,并使用Maven开始构建:

d:
cd D:\hdp
D:\hdp\dev-support\win-paths-eg.cmd
mvn package -Pdist,native-win -DskipTests -Dtar

5. 等待约30-40分钟。

就这些,朋友们!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接