Java分散計算基盤HadoopのMac用ネイティブライブラリ

分散計算プラットフォームのHadoopは基本的にJavaで実装されていますが、外部のC/C++で実装されているモジュールと連携するためにネイティブのライブラリが提供されています。具体的には、zlibやsnappyを利用したファイル圧縮機能があります。snappyはGoogleが開発した高速な圧縮伸張速度を特長とするライブラリです:
http://news.mynavi.jp/column/tool/052/index.html

HadoopLinuxをターゲットに開発されているので、提供されているネイティブライブラリはLinux用のみで、Macでは該当するソースをそのままではコンパイルすることも出来ません。幸いなことに、MacコンパイルするためのパッチがHadoopのプロジェクト管理システムのJIRAに登録されていて、最新版のソースにそのまま適用することはできませんが参考になります:
[HADOOP-3659] Patch to allow hadoop native to compile on Mac OS X - ASF JIRA

MacPortsのプロジェクト管理システムのTracに、Hadoopのネイティブライブラリを含めることが要望としてあげられていたので、hadoopのportを対応させました:
#35902 (hadoop is missing native libs) – MacPorts

ネイティブライブラリをビルドするとき、Javaのライブラリとのリンク方法がLinuxMacとでは異なっています。Linuxの場合、ldに対して”-L$JAVA_HOME/jre/lib/$OS_ARCH/server -ljvm"を渡しています。一方Macの場合、Java開発環境のファイルが/System/Library/Frameworks/JavaVM.framework/ 以下にあり、ldに"-framework JavaVM"とだけ指定すれば適切なJavaのライブラリがリンクされます。Mac OS XにはSystem Frameworksと呼ばれる枠組みが用意されていて、JavaVM以外にも様々なFrameworkがあります:
Mac Technology Overview: OS X Frameworks

また、MacPortsでは、OSやインストールされているXcodeのバージョンに応じて適切なコンパイラや引数を利用する仕組みがあります:
UsingTheRightCompiler – MacPorts

通常、configure実行時に自動的に設定されますが、Hadoopのビルドはantを通してconfigureが実行されて、これらの設定が無効になってしまいます。そこで、antが参照するbuild.xmlに変更を加えて、設定が有効になるようにしました。

Hadoopには、FUSE (File-system in USEr space) APIを利用してファイルシステムHDFSをマウントする機能がオプションとして含まれています。MacPortshadoopにfusedfsオプションを指定すると、必要なライブラリや実行ファイルなどがインストールされます:

$ sudo port self update
$ sudo port install hadoop +fusedfs