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