macOS Big SurにおけるHadoop 3.2.1のコンパイル手順

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を使用することを強く推奨する。

7月25日 03:30 投稿