1. 自行コンパイルの必要性
Apache Hadoopの公式バイナリ配布版は、特定のプラットフォーム向けに事前コンパイルされたものであり、すべての環境に対応するものではない。特に、ローカルライブラリ(圧縮機能、Cプログラムサポートなど)は、プラットフォームごとに異なる制約を持つ。
特定の機能や圧縮 codec を使用する場合や、最適なパフォーマンスを得るためには、自身の環境でソースコードからコンパイルすることが推奨される。
2. コンパイル環境の準備
2.1 動作確認済みシステム
本手順は macOS Big Sur 11.0.1 において検証を行っている。
Linux 環境ではファイアウォールとSELinuxの無効化が必要である:
service iptables stop
chkconfig iptables off
# SELinuxの無効化
vim /etc/selinux/config
# 以下の行をコメントアウトまたは変更
# SELINUX=enforcing
SELINUX=disabled
2.2 JDKのセットアップ
JDK 1.8.0_162 を使用し、環境変数を設定する。Linux環境では、システムデフォルトのJavaを削除する必要がある:
# インストール済みJavaの確認
rpm -qa | grep java
# 削除例:
rpm -e java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el6_8.x86_64 java-1.7.0-openjdk-1.7.0.131-2.6.9.0.el6_8.x86_64
2.3 Mavenのインストールと設定
Maven 3.5.2 をインストールし、依存関係のダウンロードを高速化するためにAliYunのMirrorを追加することを推奨する:
<mirror>
<id>aliyun</id>
<name>AliYun Maven Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
2.4 環境変数の設定
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export PATH=$JAVA_HOME/bin:$PATH:.
export MAVEN_HOME=/usr/local/apache-maven-3.5.2
export PATH=$PATH:$MAVEN_HOME/bin
3. 依存ライブラリのインストール
macOSではHomebrewを使用して依存関係をインストールするのが最も効率的である。国内のミラーサイトを設定することで、ダウンロード速度の向上とインストール失敗の回避が可能となる。
3.1 コンパイラツール群のインストール
brew install gcc cmake autoconf automake libtool
3.2 圧縮ライブラリのインストール
brew install gzip bzip2 zlib
snappy 1.1.4 の手動インストール:
他のバージョンではコンパイルエラーが発生するため、特定のバージョンを選択する必要がある:
wget https://github.com/google/snappy/archive/1.1.4.tar.gz
tar -zxf 1.1.4.tar.gz
cd snappy-1.1.4
./autogen.sh
./configure --prefix=/usr/local/Cellar/snappy/1.1.4
make && make install
brew link snappy
3.3 OpenSSLのセットアップ
brew install openssl
環境変数を ~/.bash_profile に追加:
export OPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1"
export OPENSSL_INCLUDE_DIR="$OPENSSL_ROOT_DIR/include"
export PKG_CONFIG_PATH="${OPENSSL_ROOT_DIR}/lib/pkgconfig"
source ~/.bash_profile
3.4 Protocol Buffers 2.5.0 のインストール
この特定のバージョンが必須である。最新版では
org.apache.maven.plugin.MojoExecutionException: protoc version is 'libprotoc 3.11.2', expected version is '2.5.0'というエラーが発生する。Homebrewのリポジトリにはこのバージョンが含まれていないため、ソースからコンパイルする必要がある。
wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
tar -zxf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/usr/local/Cellar/protobuf/2.5.0
make && make install
brew link protobuf
3.5 isa-l(オプション)のインストール
まずnasmをインストール:
brew install nasm
isa-lのソースコードをダウンロードしてコンパイル:
cd isa-l-2.28.0
autoreconf --install --symlink -f
./configure --prefix=/usr/local/Cellar/isa-l --libdir=/usr/local/Cellar/isa-l/lib AS=yasm --target=darwin
make && make install
# シンボリックリンクの作成
cd /usr/local/lib
ln -s /usr/local/Cellar/isa-l/lib/libisal.2.dylib libisal.2.dylib
ln -s /usr/local/Cellar/isa-l/lib/libisal.a libisal.a
ln -s /usr/local/Cellar/isa-l/lib/libisal.dylib libisal.dylib
ln -s /usr/local/Cellar/isa-l/lib/libisal.la libisal.la
cd /usr/local/lib/pkgconfig
ln -s /usr/local/Cellar/isa-l/lib/pkgconfig/libisal.pc libisal.pc
4. Hadoopソースコードのコンパイル
Apache Hadoop 3.2.1のソースコードをダウンロードし、解凍後にコンパイルを実行する。
cd ${HOME}/bigdata/hadoop-3.2.1-src
# snappy圧縮サポート付きでコンパイル
# -e -X オプションはビルドプロセスの全ログを出力
mvn clean package -DskipTests -Pdist,native -Dmaven.javadoc.skip -Dtar \
-Drequire.bzip2 -Dbzip2.prefix=/usr/local/Cellar/bzip2/1.0.8 \
-Drequire.openssl -Dopenssl.prefix=/usr/local/Cellar/openssl@1.1/1.1.1k \
-Drequire.snappy -Dsnappy.lib=/usr/local/Cellar/snappy/1.1.4/lib \
-Drequire.isal -Disal.prefix=/usr/local/Cellar/isa-l -Disal.lib=/usr/local/Cellar/isa-l/lib \
-e -X
5. 遭遇した問題と解決方法
5.1 hadoop-commonモジュールのZLIBエラー
[WARNING] CMake Error at ... FindPackageHandleStandardArgs.cmake:230 (message):
[WARNING] Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.11")
ZLIB_LIBRARY が見つからないというエラーが発生する。CMake 3.12以降では、XXX_ROOT変数の解釈方法が変更されている。
解決方法:
対象プロジェクトのCMakeLists.txtを編集し、CMP0074ポリシーを有効化する:
vim hadoop-common-project/hadoop-common/src/CMakeLists.txt
cmake_minimum_requiredの直後に以下を追加:
cmake_policy(SET CMP0074 NEW)
環境変数は以下のみを設定:
export ZLIB_ROOT=/usr/local/Cellar/zlib/1.2.11
5.2 bzip2ライブラリの検出エラー
[WARNING] CMake Error at CMakeLists.txt:68 (message):
[WARNING] Required bzip2 library and/or header files could not be found.
bzip2の各種環境変数を設定しても、このエラーが解消しない場合がある。macOS环境下ではbzip2のコンパイル проверка 问题が発生することがある。
解決方法:
CMakeLists.txtのbzip2檢證ロジックを一時的に無効化:
# 変更前
if(BZIP2_INCLUDE_DIR AND BZIP2_LIBRARIES)
# 変更後
if(REQUIRE_BZIP2)
5.3 MapReduce NativeTaskモジュールのsnappyエラー
[WARNING] CMake Error at CMakeLists.txt:96 (message):
[WARNING] Required snappy library could not be found.
[WARNING] SNAPPY_LIBRARY=SNAPPY_LIBRARY-NOTFOUND
Homebrewでインストールされるsnappyの最新版(1.1.9)はC++11でコンパイルされているが、Hadoop 3.2.1のビルドシステムはC++11に対応していない。
解決方法:
前述のsnappy 1.1.4を特定のプレフィックスにインストールし、正しいライブラリパスを指定することで、この問題を解決できる。
6. コンパイル結果の確認
ビルドが成功すると、以下のディレクトリにコンパイル済みファイルが生成される:
${ソースディレクトリ}/hadoop-dist/target/hadoop-3.2.1
ネイティブライブラリの場所:
${ソースディレクトリ}/hadoop-dist/target/hadoop-3.2.1/lib/native
生成されたnativeディレクトリ内のファイルをHadoopクラスタのインストール先にコピーし、ローカルライブラリのサポート状況を確認する。
zlib、snappy、bzip2などの圧縮機能が正常に動作していることを確認できれば、コンパイルは完了である。
7. まとめ
- OSの選択: 可能であればCentOSなどのLinux系OSでのコンパイルを推奨する。macOSでは多くのローカルライブラリがCMake段階で失敗する可能性がある。
- 必須の環境変数:
export ZLIB_ROOT=/usr/local/Cellar/zlib/1.2.11 export OPENSSL_ROOT_DIR="/usr/local/opt/openssl@1.1" export OPENSSL_INCLUDE_DIR="$OPENSSL_ROOT_DIR/include" export PKG_CONFIG_PATH="${OPENSSL_ROOT_DIR}/lib/pkgconfig" - CMake設定: CMP0074ポリシーを有効化することで、ライブラリ検出の問題を回避できる。
- バージョン固定: snappyは1.1.4、protobufは2.5.0を使用することを強く推奨する。