Hadoop >

目次

システムのチューニング

Coming Soon.

参考リソース

  1. HADOOP-5059: 'whoami', 'topologyscript' calls failing with java.io.IOException: error=12, Cannot allocate memory

Hadoop本体のチューニング

Coming Soon.

データフォーマット

データ圧縮の利用

概要

  • 大規模データの解析処理では、一般的に処理フェイズが進むにしたがい対象データが減少する傾向にありますので、第一に入力データ量(読み)を、次に中間データ量(読み書き)を削減し、全フェイズに渡って最も高コストなディスクI/Oの総量を減らすことが重要となります。
  • もちろん、データの圧縮(と伸張)はCPU負荷はトレードオフの関係にありますので、適切な圧縮アルゴリズムを選択し、圧縮率(格納領域の節約)と処理時間をうまくバランスさせる必要があります。
  • また、大規模データからさらに大規模データを生成する場合には、出力データを圧縮することも重要です。

おすすめの圧縮形式

  • 全体的に、LZO圧縮の利用がおすすめです。
  • 入出力データ以外の用途では、Hadoop デフォルトの Deflate (zlib) 圧縮の利用もおすすめです。デフォルトなので、利用設定が容易です。
  • 詳しくは、Hadoop圧縮検証をご参照ください。

圧縮形式

  • Hadoop で利用が可能な圧縮形式は以下の通りです。
  • Pure Java実装とネイティブ実装の両方が用意されているコーデックについては、ネーティブライブラリがロード可能な場合にはそちらが使用され、そうでない場合にはPure Java実装のコーデックが使用されます。
    No.圧縮形式Apache Hadoop
    に同梱
    SplittablePure Java
    実装
    ネイティブ
    実装
    備考
    1Deflate (zlib)-○(libhadoop.so)Hadoop のデフォルト。圧縮コーデックを明示的に設定しない場合に使われます。
    2Gzip-○(libhadoop.so)
    3Bzip2△(システム上のlibbz2.so)Apache Hadoop 0.23.7, 2.1.0-beta以降でネイティブサポート。
    4LZO-*1-○(libgplcompression.so)LZOのライセンスがGPLのためHadoopには含まれません。
    5LZ4--○(libhadoop.so)Apache Hadoop 0.23.12.x以降で利用可能
    6Snappy--○(libhadoop.so)Apache Hadoop 1.0.2以降(HADOOP-7206)、CDH3u1以降

Deflate (zlib)、Gzip、LZ4およびSnappyコーデックのインストールと利用

  • ネイティブライブラリ(libhadoop.so)がApache Hadoop本体に同梱されていますが、アーキテクチャが合致しない場合(主に2.x系)にはソースからビルドする必要があります。最近の2.x系には、32bit版が同梱されているようです。
  • CDHおよびHDPでは、パッケージにより環境に合ったライブラリがインストールされます。

Bzip2コーデックのインストールと利用

  1. 元はPure Java実装のみでしたが、Apache Hadoop 0.23.7, 2.1.0-beta以降でネイティブ実装がサポートされています。ただし、他のコーデックのようにHadoop本体に共有オブジェクトが同梱されているわけではなく、システムのライブラリにダイナミックリンクするようですので、利用する際には以下の要領でシステムにlibbz2.soをインストールする必要があります。
    [Debian]$ sudo apt-get install libbz2
    [CentOS]$ sudo yum install bzip2-libs
  2. また、Apache Hadoop 1.1.0以降ではBzip2圧縮ファイルの複数mapへのスプリットがサポートされていますが、ドキュメントによると、ネイティブ実装ではそれをサポートしないようなので、目的にあわせてPure Java/ネイティブいずれの実装を用いるか以下のプロパティで指定する必要があります。
    1. core-site.xml
      1. <property>
      2.     <name>io.compression.codec.bzip2.library</name>
      3.     <value>system-native</value>
      4.     <description>The native-code library to be used for compression and
      5.     decompression by the bzip2 codec.  This library could be specified
      6.     either by by name or the full pathname.  In the former case, the
      7.     library is located by the dynamic linker, usually searching the
      8.     directories specified in the environment variable LD_LIBRARY_PATH.
      9.  
      10.     The value of "system-native" indicates that the default system
      11.     library should be used.  To indicate that the algorithm should
      12.     operate entirely in Java, specify "java-builtin".</description>
      13. </property>

LZOコーデックのインストールと利用

note.pngライセンスの関係上、Hadoop-LZO はApache Hadoop(他のディストリビューションであればHadoopパッケージ本体)に同梱されませんので、利用する場合には別途インストールする必要があります。

開発の経緯と現状

note.pngGitHub?でのfork状況やドキュメントから窺える内容です。正確ではない場合があります。

  1. ドキュメントによると、最初のコードベースは、hadoop-gpl-compressionプロジェクトのものです。米Yahoo!(当時)のOwen O'Malley氏がリードしていたようです。
  2. そこからのforkで、TwitterのKevin Weil氏(kevinweil/hadoop-lzo)により多くの修正と改良が行われました。
  3. その後は、しばらくClouderaのTodd Lipcon氏(toddlipcon/hadoop-lzo)が活発にメンテナンスを行っていたようです。
  4. 最近のバージョンは、元のTwitter(twitter/hadoop-lzo)が担当しているように見えます。また、Hortonworks(hortonworks/hadoop-lzo)は、Windows対応を行っている模様です。

ビルド済みバイナリの入手

  • Twitter からは、最近のバージョンが以下のMavenレポジトリで提供されています。ネイティブライブラリは同梱されていないようです。
  • HDPでは、HDP1.x、HDP2.xともにHDPと同リポジトリからパッケージ(hadoop-lzo、hadoop-lzo-native)インストールすることが可能です。
  • CDHでは、CDH3では配布がありませんが、CDH4ではCDHとは別のgplextrasリポジトリからパッケージ(YARN: hadoop-lzo-cdh4、MRv1: hadoop-lzo-cdh4-mr1)インストールすることができます。

ビルド方法

  • Apache HadoopにHadoop-LZOを追加する場合にはソースからビルドする必要があります。ただし、Hadoop-LZOにはforkされたバージョンが複数ありますので、どのバージョンを利用すべきか迷うところです。
  • 付されたバージョン番号を参考にしますと、最新版はtwitter/hadoop-lzoで、それより少し前によくメンテナンスされていたのはtoddlipcon/hadoop-lzoのようです。以下ではこの二つのバージョンのビルド方法を説明します。
  1. ビルド環境を整えます。JDKはもちろんのこと、ビルドツールにはMavenまたはAntが必要になります。ネイティブビルドのためにはC開発環境の他、以下のようにLZO開発パッケージのインストールが必要です。
    [Debian]$ sudo apt-get install liblzo2-dev
    [CentOS]$ sudo yum install lzo-devel
    1. Chefレシピ: 参考までに、これはHadoop-LZOビルド環境を構築するChefレシピ(ロール)です。
  2. twitter/hadoop-lzo
    1. ソースを取得してビルドします。残念ながらリリースタグが付されていませんので最新のスナップショットでビルドします。
      $ git clone https://github.com/twitter/hadoop-lzo.git
      $ cd hadoop-lzo
      $ mvn clean test package
      ...
      $ ls target | grep hadoop-lzo
      hadoop-lzo-0.4.18-SNAPSHOT-javadoc.jar
      hadoop-lzo-0.4.18-SNAPSHOT-sources.jar
      hadoop-lzo-0.4.18-SNAPSHOT.jar
      $ ls -1 target/native/Linux-i386-32/lib
      libgplcompression.a
      libgplcompression.la
      libgplcompression.so
      libgplcompression.so.0
      libgplcompression.so.0.0.0
  3. toddlipcon/hadoop-lzo
    1. こちらにはリリースタグがありますので、最新版をチェックアウトしてビルドします。antでビルドしますが、javahタスクが利用できる必要があります。
      $ git clone https://github.com/toddlipcon/hadoop-lzo.git
      ...
      $ cd hadoop-lzo/
      $ git tag -l
      0.4.0
      0.4.1
      0.4.10
      0.4.14
      0.4.15
      0.4.2
      0.4.3
      0.4.4
      0.4.5
      0.4.6
      0.4.7
      0.4.8
      0.4.9
      $ git checkout refs/tags/0.4.15
      ...
      $ yum install ant-nodeps  # for javah task
      ...
    2. 以下は32bit版のビルド手順です。
      $ export CFLAGS=-m32
      $ export CXXFLAGS=-m32
      $ ant compile-native
      ...
      $ ls build/ | grep hadoop-lzo
      hadoop-lzo-0.4.15
      hadoop-lzo-0.4.15.jar
      hadoop-lzo-0.4.15.tar.gz
      $ ls -1 build/native/Linux-i386-32/lib
      libgplcompression.a
      libgplcompression.la
      libgplcompression.so
      libgplcompression.so.0
      libgplcompression.so.0.0.0

インストール

  1. クラスタサイド
    1. JNI用ネイティブライブラリにコーデック自体も含まれていますので、システムにLZOネイティブライブラリ(liblzo2等)をインストール必要はありません。
    2. ビルドされた JAR とJNI用ネイティブライブラリを適当な場所に配備します。それぞれ ${HADOOP_HOME}/lib と ${HADOOP_HOME}/lib/native/${ARCH} に配備するのが無難です*2
    3. ${HADOOP_HOME}/conf/core-site.xml で、LZO コーデックを登録します。
      1. <property>
      2.     <name>io.compression.codecs</name>
      3.     <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,
      4. org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,
      5. com.hadoop.compression.lzo.LzopCodec</value>
      6. </property>
      7. <property>
      8.     <name>io.compression.codec.lzo.class</name>
      9.     <value>com.hadoop.compression.lzo.LzoCodec</value>
      10. </property>
    4. Map出力の圧縮に使用する場合には、下記を参照ください。
  2. クライアントサイド
    1. 入力データは、LZO圧縮してHDFS上にアップロードするだけでなく、スプリットできるようにあらかじめインデックスファイルを生成しておく必要があります。コマンドは以下の通りです。
      1. # Map/Reduceバージョン(巨大ファイルのはずなので、実際にはこちらが現実的でしょう)
      2. $ hadoop jar /local/path/to/hadoop-lzo-<version>.jar com.hadoop.compression.lzo.DistributedLzoIndexer \
      3. > /dfs/path/to/targetfile.lzo
      4. # シングルプロセスバージョン
      5. $ hadoop jar /local/path/to/hadoop-lzo-<version>.jar com.hadoop.compression.lzo.LzoIndexer \
      6. > /dfs/path/to/targetfile.lzo
    2. クライアントのMap/Reduceアプリケーションでは、(入力データのファイルパスが変更になることは別にしても)圧縮形式に対して完全に透過的ではなく TextInputFormat? の代わりに LzoTextInputFormat? を用いる必要があります。つまり、クライアントサイドでもクラスタサイドと同様のインストールが必要となり、アプリケーションのクラスパスとネイティブライブラリパスが適切に設定されている必要があります。
    3. Hadoopストリーミングでは、-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat? オプションを追加する必要があります。
    4. Pig では、ロード関数を LzoTextInputFormat? に対応したものに変更する必要があります。それらの関数群は、Elephant Bird から入手できます。詳細は、Pigと圧縮データを参照してください。

入出力データの圧縮

Pig の場合

Hive の場合

Map出力の圧縮

  • Mapタスクの出力データを圧縮することにより、ジョブの作業領域を節約できるとともに、Ruduceタスクの読み取り負荷を軽減することが可能となります。また、これはジョブの入出力に直接関係しませんので、クラスタのチューニングとして採用することができます。
  • デフォルトでは圧縮オプションが無効ですので、以下の要領で有効にします。コーデックについては、入力、出力データ圧縮時にはブロック分割に有利なLZOが推奨されていますが、ブロック単位で処理されるMapタスク出力時ですので、Gzipなどでもよいかもしれません。
    1. ${HADOOP_HOME}/conf/mapred-site.xml
      1. <property>
      2.     <name>mapred.compress.map.output</name>
      3.     <value>true</value>
      4. </property>
      5.  
      6. <property>
      7.     <name>mapred.map.output.compression.codec</name>
      8.     <value>org.apache.hadoop.io.compress.GzipCodec</value>
      9.     <!--
      10.     <value>org.apache.hadoop.io.compress.DefaultCodec</value>
      11.     <value>org.apache.hadoop.io.compress.BZip2Codec</value>
      12.     LZO コーデックはライセンスの関係からHadoopには同梱されていません。
      13.     別途、インストールの上、コーデックを変更します。
      14.     <value>com.hadoop.compression.lzo.LzoCodec</value>
      15.     -->
      16. </property>

検証

参考リソース

  1. hadoop-gpl-compression
  2. twitter/hadoop-lzo
  3. Hadoop feat. Lzo - save disk space and speed up your programs
  4. Hadoop at Twitter (part 1): Splittable LZO Compression
  5. HADOOP-7206: Integrate Snappy compression
  6. Snappy and Hadoop
  7. HADOOP-4012: Providing splitting support for bzip2 compressed files
  8. HADOOP-7823: port HADOOP-4012 to branch-1 (splitting support for bzip2)
  9. HADOOP-8462: Native-code implementation of bzip2 codec
  10. HADOOP-7657: Add support for LZ4 compression

*1 事前にインデックスの生成が必要です。
*2 クラスパスおよびライブラリパスへの追加が不要です。別の場所に配備する場合には、それらを適切に設定する必要があります。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-06-05 (木) 13:46:02 (1532d)