天天看點

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

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. 準備工作

  1. 下載下傳

    hadoop-2.7.2-src.zip

    ,對此版本的Hadoop進行編譯得到最終的jar,好在
  2. 解壓

    hadoop-2.7.2-src.zip

    加壓後的目錄結構如下:
    在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考
  3. 檢視上面的

    BUILDING.txt

    ,了解建構的詳情

    編譯的說明在

    BUILDING.txt

    檔案中,通過搜尋

    windows

    找到

    windows

    編譯的說明。
在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

根據需要安裝如下這些庫

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如下圖所示:

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考
# 新增環境變量
	 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. 編譯

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

通過

開始

>

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。
           

如果編譯中沒啥問題的話,就會出現如下結果:

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

編譯好的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

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考
在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

Visual Studio

的輸出可以到,通過更新将某些檔案中的v100,修改為v142了。

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

weinutils.sln

也是類似處理。

在windows10下編譯Hadoop-2.7.2源碼1. 編譯hadoop-2.7.2的目的2. 準備工作3. 編譯4. 問題總結5. 參考

問題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

繼續閱讀