1. 程式人生 > >Hadoop 3.1.1 Build 中文文件

Hadoop 3.1.1 Build 中文文件

3.1.1 Hadoop 構建說明:

依賴的軟體:

* Unix System
* JDK 1.8
* Maven 3.3 or later
* ProtocolBuffer 2.5.0
* CMake 3.1 or newer (if compiling native code)
* Zlib devel (if compiling native code)
* openssl devel (if compiling native hadoop-pipes and to get the best HDFS encryption performance)
* Linux FUSE (Filesystem in Userspace) version 2.6 or above (if compiling fuse_dfs)
* Internet connection for first build (to fetch all Maven and Hadoop dependencies)
* python (for releasedocs)
* bats (for shell code testing)
* Node.js / bower / Ember-cli (for YARN UI v2 building)

----------------------------------------------------------------------------------
最簡單的獲取構建的方式是通過提供的Docker Config 獲取全部的合適的構建環境和工具, 這個要求一個比較新的
Docker版本(1.4.1 或以上的版本)

然後在 Linux上:
安裝Docker後,執行命令 : $ ./start-build-env.sh

在Mac OS上:

首先確認 Virtualbox 和 docker toolbox 都安裝好了.
你可以安裝後面網址的描述使用docker toolbox http://docs.docker.com/mac/step_one/.
$ docker-machine create --driver virtualbox \
--virtualbox-memory "4096" hadoopdev
$ eval $(docker-machine env hadoopdev)
$ ./start-build-env.sh

接下來的Terminal視窗會位於原始碼的掛載版本中,所有測試和構建所需的工具都已安裝和配置。注意,在這個Docker
環境裡, 你只能在此處 access Hadoop 的原始碼, 所以如果你需要執行:
dev-support/bin/test-patch /path/to/my.patch
那麼你的Patch 只能放在 Hadoop 的原始碼中


已知問題:
- 在Mac OS 上,Boot2Docker 掛載的目錄當前是非常的慢, 這個是boot2docker 在mac 上的已知問題:
請參考:
https://github.com/boot2docker/boot2docker/issues/593
這個問題已經通過 duplicate 的方法解決了, 他們指出通過利用NFS mounts的新方法可以很好的解決這個問題:
https://github.com/boot2docker/boot2docker/issues/64
另外一個變通的解決這個問題的方法是在Mac 上面按照一臺Linux虛擬機器,然後在這臺虛擬機器裡面進行編譯和開發

在新安裝的 Ubuntu 14.04 LTS 桌面OS 上,要求安裝的 packages 有:

* Oracle JDK 1.8 (更合適)
$ sudo apt-get purge openjdk*
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
* Maven
$ sudo apt-get -y install maven
* Native libraries (OS 本地庫)
$ sudo apt-get -y install build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev
* ProtocolBuffer 2.5.0 (必須安裝的軟體)
$ sudo apt-get -y install protobuf-compiler

可選安裝的 packages:

* Snappy compression
   $ sudo apt-get install snappy libsnappy-dev
* Intel ISA-L library for erasure coding
  請參考 https://01.org/intel%C2%AE-storage-acceleration-library-open-source-version (或者 https://github.com/01org/isa-l)
* Bzip2
  $ sudo apt-get install bzip2 libbz2-dev
* Jansson (C Library for JSON)
  $ sudo apt-get install libjansson-dev
* Linux FUSE
  $ sudo apt-get install fuse libfuse-dev
* ZStandard compression
  $ sudo apt-get install zstd

Maven 主要的目錄結構:

hadoop (Main Hadoop project)
- hadoop-project (Parent POM for all Hadoop Maven modules. )
(All plugins & dependencies versions are defined here.)
- hadoop-project-dist (Parent POM for modules that generate distributions.)
- hadoop-annotations (Generates the Hadoop doclet used to generated the Javadocs)
- hadoop-assemblies (Maven assemblies used by the different modules)
- hadoop-common-project (Hadoop Common)
- hadoop-hdfs-project (Hadoop HDFS)
- hadoop-mapreduce-project (Hadoop MapReduce)
- hadoop-tools (Hadoop tools like Streaming, Distcp, etc.)
- hadoop-dist (Hadoop distribution assembler)

從哪裡下 Maven 的命令?

Maven的命令可以在任何子模組中執行. 唯一的缺點是如果不是從utrunk 上下達MAVEN 命令, 那麼其他所有
的非當前模組都需要存在於Maven的 Cache中,或者能從 Maven Repository中下載.

Maven 構建的 goals:

* Clean : mvn clean [-Preleasedocs]
* Compile : mvn compile [-Pnative]
* Run tests : mvn test [-Pnative] [-Pshelltest]
* Create JAR : mvn package
* Run findbugs : mvn compile findbugs:findbugs
* Run checkstyle : mvn compile checkstyle:checkstyle
* Install JAR in M2 cache : mvn install
* Deploy JAR to Maven repo : mvn deploy
* Run clover : mvn test -Pclover [-DcloverLicenseLocation=${user.name}/.clover.license]
* Run Rat : mvn apache-rat:check
* Build javadocs : mvn javadoc:javadoc
* Build distribution : mvn package [-Pdist][-Pdocs][-Psrc][-Pnative][-Dtar][-Preleasedocs][-Pyarn-ui]
* Change Hadoop version : mvn versions:set -DnewVersion=NEWVERSION

Build 選項:

* 使用 -Pnative 來編譯或打包 native code
* 使用 -Pdocs 來生成或打包發行版本的文件 (using -Pdist)
* 使用 -Psrc 來建立Hadoop原始碼的壓縮包
* 使用 -Dtar 建立Hadoop發行的壓縮包 (using -Pdist)
* 使用 -Preleasedocs 文件中囊括 ChangeLog 和Rlease Doc (要求網路連結)
* 使用 -Pyarn-ui 來構建 YARN UI 的v2版本. (要求網路連結)
* 使用 -DskipShade 構建時關閉依賴包括的Sharding Feature來加速構建時間(在開發環境中用,不要在構建Release時用)

Snappy build 選項:

Snappy 是 native code 是可用的壓縮庫。它是可選項,構建Hadoop時它可有可無

* 使用 -Drequire.snappy 讓 Biuld Process 在 libsnappy.so 不存在情況下失敗退出.
如果這個Option 沒有制定同時libsnappy.so 又不存在. 指令碼會構建一個不包括 snappy 功能的libhadoop.so。
如果你要用 snappy 或者讓構建可以重複性變高,我們推薦你用這個 Option

* 使用 -Dsnappy.prefix 自定義 libsnappy的 header 檔案 和 library 檔案.
如果你使用了 Package Manager 安裝了 snappy, 就不需要這個 Option 了.

* 使用 -Dsnappy.lib 自定義libsnappy library 的位置. 和 snappy.prefix 一樣,
如果你使用了 Package Manager 安裝了 snappy, 就不需要這個 Option 了

* 使用 -Dbundle.snappy 把 snappy.lib directory 內容拷貝到最終編譯出來的 tar包中。
這個Option 要求你要同時使用 -Dsnappy.lib (沒指定會Build失敗),且忽略 -Dsnappy.prefix option.

ZStandard build 選項:

ZStandard 是 native code 是可用的壓縮庫。它是可選項,構建Hadoop時它可有可無

* 使用 -Drequire.zstd 讓 Biuld Process 在 libzstd.so 不存在情況下失敗退出.
如果這個 Option 沒有被指定,那麼 zstd library 就不會存在

* 使用 -Dzstd.prefix to 自定義 libzstd header files and library files.
如果你使用了 Package Manager 安裝了 zstandard 就不需要這個 Option 了.

* 使用 -Dzstd.lib 自定義 libzstd library 路徑
和 zstd.prefix 一樣, 如果你使用了 Package Manager 安裝了 libzstd就不需要這個 Option了

* 使用 -Dbundle.zstd 把 zstd.lib directory 內容拷貝到最終編譯出來的 tar包中。
這個Option 要求你要同時使用 -Dzstd.lib (沒指定會Build失敗),且忽略 -Dzstd.prefix option.

OpenSSL build 選項:

OpenSSL 是 native code 是可用的加密庫. 它是可選項,構建Hadoop時它可有可無

* 使用 -Drequire.openssl 讓 Biuld Process 在 libcrypto.so 不存在情況下失敗退出.
如果這個Option 沒有指定且同時libsnappy.so 又不存在. 指令碼會構建一個不包括 openssl 功能的libhadoop.so。
如果你要用 openssl 或者讓構建可以重複性變高,我們推薦你用這個 Option

* 使用 -Dopenssl.prefix 自定義 libcrypto header files and library files 的路徑.
如果你使用了 Package Manager 安裝了 zstandard 就不需要這個 Option 了.

* 使用 -Dopenssl.lib 自定義libcrypto library 檔案路徑.
和 openssl.prefix 一樣, 如果你使用了 Package Manager 安裝了 libzstd 就不需要這個 Option了

* 使用 -Dbundle.openssl 把 openssl.lib directory 內容拷貝到最終編譯出來的 tar 包中。
這個Option 要求你要同時使用 -Dopenssl.lib (沒指定會Build失敗),且忽略 -Dopenssl.prefix option.


Tests 選項:

* 使用 -DskipTests 在執行 Maven 以下goals時,跳過Run Test case,Goals包括:'package', 'install', 'deploy' or 'verify'
* -Dtest=<TESTCLASSNAME>,<TESTCLASSNAME#METHODNAME>,....
* -Dtest.exclude=<TESTCLASSNAME>
* -Dtest.exclude.pattern=**/<TESTCLASSNAME1>.java,**/<TESTCLASSNAME2>.java
* 跑全部 native unit tests: mvn test -Pnative -Dtest=allNative
* 跑特定的native unit tests: mvn test -Pnative -Dtest=<test>
舉例執行一個叫 test_bulk_crc32 Tests, 命令如下:
mvn test -Pnative -Dtest=test_bulk_crc32

Intel ISA-L build 選項:

Intel ISA-L 是 native code 是可用的糾刪碼庫.它是可選項,構建Hadoop時它可有可無
注意: 這個庫是動態庫. 詳情參考:
https://01.org/intel%C2%AE-storage-acceleration-library-open-source-version
(OR https://github.com/01org/isa-l)

* 使用 -Drequire.isal 讓 Biuld Process 在 libisal.so 不存在情況下失敗退出.
如果這個Option 沒有指定的同時 libisal.so 又不存在. 指令碼會構建一個不包括 ISA-L 功能的libhadoop.so。
如果你要用 native raw erasure coders 功能或者讓構建可以重複性變高,我們推薦你用這個 Option

* 使用 -Disal.prefix 自定義 libisal files 的路徑.
如果你的環境變數路徑裡已經安裝了ISA-L, 就不需要這個 Option 了.

* 使用 -Disal.lib 自定義libcrypto library 檔案路徑.

* 使用 -Dbundle.isal 把 isal.lib directory 內容拷貝到最終編譯出來的 tar 包中。
這個Option 要求你要同時使用 -Disal.lib (沒指定會Build失敗),且忽略 -Disal.prefix option.


特別的外掛: OWASP 的 dependency-check:

OWASP 的 dependency-check 外掛會根據已知的CVEs (他們可能存在的安全缺陷)
掃描對 third party 依賴。他會在 target/dependency-check-report.html 產生一個 Html 報告。
你可以通過執行 'mvn dependency-check:aggregate' 來產生這個報告。

注意,這個外掛要求 maven的版本在 3.1.1+ !

 

各模組的單獨Build

如果你準備單獨構建Hadoop 的子模組, 那該模組所依賴的庫或包全部被當做第三方庫; 這就意味著
這些庫會從你的Maven cache 或者從 Remote Maven Repository 去下載。
有一個變通的方法是在Hadoop 的根目錄下執行一次 'mvn install -DskipTests';然後在去子模組去
編譯。 注意:Maven構建出來的 SNAPSHOTs 會在一段時間後 timeout, 你最好使用 Maven '-nsu' 參
數來禁止從外部 Maven Repo 下載依賴來更新你的 SNAPSHOTs

Protocol Buffer 編譯器

Protocol Buffer 編譯器 'protoc' 的版本必須和 protobuf JAR包匹配
如果你本地有幾個版本的 protoc, 你可以在Build Shell 裡面指定HADOOP_PROTOC_PATH 環境變數來選擇,
否則, protoc 會依據 $PATH 環境變數找到第一個來使用

將 Hadoop 匯入 eclipse

當你想把Hadoop 專案匯入eclipse 時,你需要先安裝 hadoop-maven-plugins

$ cd hadoop-maven-plugins
$ mvn install

然後引數 Eclipse 工程檔案.

$ mvn eclipse:eclipse -DskipTests

最後在通過已經存在的工程匯入Eclipse 即可
[File] > [Import] > [Existing Projects into Workspace].

構建發行版:

構建一個不包括natvie code 和 documentation 的 hadoop binary:

  $ mvn package -Pdist -DskipTests -Dtar -Dmaven.javadoc.skip=true

構建一個包括natvie code 和 文件的 hadoop binary:

  $ mvn package -Pdist,native,docs -DskipTests -Dtar

構建原始碼包:

  $ mvn package -Psrc -DskipTests

構建一個包括native code 和 documentation的 source 包和 binary 包

  $ mvn package -Pdist,native,docs,src -DskipTests -Dtar

(在/tmp/hadoop-site)構建一個臨時的本地網站
  $ mvn clean site -Preleasedocs; mvn site:stage -DstagingDirectory=/tmp/hadoop-site

  注意,這個網站需要在其他的包Ready 之後才能構建

安裝 Hadoop

當你安裝上面給出的命令build 出 Hadoop 後,請參考下面的網站使用:

* Single Node Setup:
hadoop-project-dist/hadoop-common/SingleCluster.html

* Cluster Setup:
hadoop-project-dist/hadoop-common/ClusterSetup.html

 

解決Build 過程中的 memory errors

如果在構建的過程中遇到了 out of memory 的錯誤,你應該使用MAVEN_OPTS 的環境變數來新增
Maven 可以使用的Memory

舉例: 你會設定Maven可以使用 256M 到 1.5G 的Java 堆空間,請這樣配置:

export MAVEN_OPTS="-Xms256m -Xmx1536m"

 

----------------------------------------------------------------------------------

(不建議使用Window,我就不翻譯了)Building on Windows
----------------------------------------------------------------------------------