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進行編譯得到最終的jar,好在hadoop-2.7.2-src.zip
- 解壓
加壓後的目錄結構如下: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中使用如下的庫:
- JDK 1.8
- windows 10 sdk
- Maven 3.3
- apache-ant-1.9.15-bin.zip
- Findbugs 1.3.9
- ProtocolBuffer 2.5.0
- CMake 3.19.8
- Zlib
- 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更友善
-
cygwin
安裝有疑問的網上搜尋都會有教程的。
最終的環境變量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:
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
的正确版本是哪些的,選擇對應的字元串填到上面的位置就行 。
可參考win7通過源碼編譯hadoop-2.7.0
問題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