ネイティブライブラリガイド

概要

このガイドでは、ネイティブHadoopライブラリについて説明し、ネイティブ共有ライブラリに関する簡単な議論を含みます。

注: 環境によっては、「ネイティブライブラリ」という用語は、コンパイルする必要があるすべての*.soを指す場合があります。また、「ネイティブ圧縮」という用語は、特に圧縮に関連するコンパイルする必要があるすべての*.soを指す場合があります。ただし、現在、このドキュメントではネイティブHadoopライブラリ(`libhadoop.so`)についてのみ説明しています。 libhdfsライブラリ(`libhdfs.so`)のドキュメントはこちらです。

ネイティブHadoopライブラリ

Hadoopは、パフォーマンス上の理由とJava実装が利用できない場合のために、特定のコンポーネントのネイティブ実装を提供しています。これらのコンポーネントは、ネイティブHadoopライブラリと呼ばれる単一の動的にリンクされたネイティブライブラリで利用できます。 *nixプラットフォームでは、ライブラリの名前は`libhadoop.so`です。

使用方法

ネイティブHadoopライブラリの使用は非常に簡単です

  1. コンポーネントを確認します。
  2. 対応プラットフォームを確認します。
  3. 事前にビルドされたバージョンのネイティブHadoopライブラリを含むHadoopリリースをダウンロードするか、独自のネイティブHadoopライブラリをビルドします。ダウンロードまたはビルドのいずれの場合でも、ライブラリの名前は同じです:libhadoop.so
  4. 圧縮コーデック開発パッケージ(>zlib-1.2、>gzip-1.2)をインストールします
    • ライブラリをダウンロードする場合は、デプロイメントで使用する圧縮コーデックに応じて、1つ以上の開発パッケージをインストールします。
    • ライブラリをビルドする場合は、両方の開発パッケージをインストールする必要があります。
  5. ランタイムログファイルを確認します。

コンポーネント

ネイティブHadoopライブラリには、さまざまなコンポーネントが含まれています

対応プラットフォーム

ネイティブHadoopライブラリは、*nixプラットフォームでのみサポートされています。ライブラリは、CygwinまたはMac OS Xプラットフォームでは動作しません。

ネイティブHadoopライブラリは、主にGNU/Linuxプラットフォームで使用され、以下のディストリビューションでテストされています

  • RHEL4/Fedora
  • Ubuntu
  • Gentoo

上記のすべてのディストリビューションで、32/64ビットのネイティブHadoopライブラリは、それぞれの32/64ビットのJVMで動作します。

ダウンロード

事前にビルドされた32ビットi386-LinuxネイティブHadoopライブラリは、Hadoopディストリビューションの一部として利用でき、`lib/native`ディレクトリにあります。 Hadoopディストリビューションは、Hadoop Common Releasesからダウンロードできます。

デプロイメントで使用する圧縮コーデックに応じて、zlibおよび/またはgzip開発パッケージを必ずインストールしてください。

ビルド

ネイティブHadoopライブラリはANSI Cで記述されており、GNU autotoolsチェーン(autoconf、autoheader、automake、autoscan、libtool)を使用してビルドされます。つまり、標準準拠のCコンパイラとGNU autotoolsチェーンを備えたプラットフォームであれば、ライブラリのビルドは簡単です(対応プラットフォームを参照)。

ターゲットプラットフォームにインストールする必要があるパッケージは次のとおりです

  • Cコンパイラ(例:GNU Cコンパイラ)
  • GNU Autoolsチェーン:autoconf、automake、libtool
  • zlib開発パッケージ(安定バージョン>= 1.2.0)
  • openssl開発パッケージ(例:libssl-dev)

前提条件パッケージをインストールしたら、標準のHadoop pom.xmlファイルを使用し、ネイティブフラグを渡してネイティブHadoopライブラリをビルドします

   $ mvn package -Pdist,native -DskipTests -Dtar

新しくビルドされたライブラリは、以下の場所に表示されます

   $ hadoop-dist/target/hadoop-3.3.6/lib/native

以下の点に注意してください

  • ネイティブHadoopライブラリをビルドするには、ターゲットプラットフォームにzlibとgzipの両方の開発パッケージをインストールする必要があります。ただし、デプロイメントでは、1つのコーデックのみを使用する場合、1つのパッケージのみをインストールすれば十分です。
  • ネイティブHadoopライブラリをビルドおよびデプロイするには、ターゲットプラットフォームの32/64ビットJVMに応じて、zlibの正しい32/64ライブラリが必要です。

ランタイム

bin/hadoopスクリプトは、システムプロパティ:`-Djava.library.path=<path>`を介してネイティブHadoopライブラリがライブラリパス上にあることを確認します

ランタイム中は、MapReduceタスクのHadoopログファイルを確認してください。

  • すべてが正常であれば、次のようになります。`DEBUG util.NativeCodeLoader - カスタムビルドされたネイティブHadoopライブラリのロードを試行しています...``INFO util.NativeCodeLoader - ネイティブHadoopライブラリがロードされました`
  • 問題が発生した場合:`INFO util.NativeCodeLoader - プラットフォームのネイティブHadoopライブラリをロードできません...該当する場合は組み込みJavaクラスを使用します`

チェック

NativeLibraryCheckerは、ネイティブライブラリが正しくロードされているかどうかを確認するためのツールです。 NativeLibraryCheckerは次のように起動できます

   $ hadoop checknative -a
   14/12/06 01:30:45 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
   14/12/06 01:30:45 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
   Native library checking:
   hadoop: true /home/ozawa/hadoop/lib/native/libhadoop.so.1.0.0
   zlib:   true /lib/x86_64-linux-gnu/libz.so.1
   zstd: true /usr/lib/libzstd.so.1
   lz4:    true revision:99
   bzip2:  false

ネイティブ共有ライブラリ

ライブラリファイルを配布およびシンボリックリンクするために、DistributedCacheを使用して任意のネイティブ共有ライブラリをロードできます。

この例では、共有ライブラリmylib.soを配布し、MapReduceタスクからロードする方法を示します。

  1. 最初にライブラリをHDFSにコピーします:`bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1`
  2. ジョブ起動プログラムには、次のものが含まれている必要があります。`DistributedCache.createSymlink(conf);``DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so.1#mylib.so", conf);`
  3. MapReduceタスクには、次のものが含まれている場合があります。`System.loadLibrary("mylib.so");`

注: ネイティブHadoopライブラリをダウンロードまたはビルドした場合、DistibutedCacheを使用してライブラリをMapReduceタスクで使用できるようにする必要はありません。