1

lzo を使用してマップ出力を圧縮したいのですが、実行できません。私が使用したHadoopのバージョンは0.20.2. 私は設定しました:

conf.set("mapred.compress.map.output", "true") 
conf.set("mapred.map.output.compression.codec",
"org.apache.hadoop.io.compress.LzoCodec");

Hadoop で jar ファイルを実行すると、マップ出力を書き込めないという例外が表示されます。

lzoをインストールする必要がありますか? lzo を使用するにはどうすればよいですか?

4

1 に答える 1

11

LZO のライセンス (GPL) は Hadoop (Apache) のライセンスと互換性がないため、バンドルすることはできません。クラスターに LZO を個別にインストールする必要があります。

次の手順は、CDH 4.2.0 のフル スタックと CM Free Edition がインストールされたCloudera のデモ VM (CentOS 6.2、x64) でテストされていますが、Red Hat ベースの任意の Linux でも動作するはずです。

インストールは次の手順で構成されます。

  • LZOのインストール

    sudo yum install lzop

    sudo yum install lzo-devel

  • ANTのインストール

    sudo yum install ant ant-nodeps ant-junit java-devel

  • ソースのダウンロード

    git clone https://github.com/twitter/hadoop-lzo.git

  • Hadoop-LZO のコンパイル

    ant compile-native tar

    詳しい手順とトラブルシューティングについては、https://github.com/twitter/hadoop-lzoを参照してください。

  • Hapoop-LZO jar を Hadoop ライブラリにコピーする

    sudo cp build/hadoop-lzo*.jar /usr/lib/hadoop/lib/

  • ネイティブ コードを Hadoop ネイティブ ライブラリに移動する

    sudo mv build/hadoop-lzo-0.4.17-SNAPSHOT/lib/native/Linux-amd64-64/ /usr/lib/hadoop/lib/native/

    cp /usr/lib/hadoop/lib/native/Linux-amd64-64/libgplcompression.* /usr/lib/hadoop/lib/native/

    複製したバージョンで正しいバージョン番号

  • (疑似クラスターとは対照的に) 実際のクラスターで作業する場合は、これらを残りのマシンに rsync する必要があります。

    rsync /usr/lib/hadoop/lib/すべてのホストに。

    -n を使用して、最初にこれをドライランできます

  • Cloudera Manager にログイン

  • サービスから選択: mapreduce1->Configuration

  • クライアント -> 圧縮

  • 圧縮コーデックに追加:

    com.hadoop.compression.lzo.LzoCodec

    com.hadoop.compression.lzo.LzopCodec

  • 「バルブ」ですべてを検索

  • MapReduce サービス構成に追加 安全弁

    io.compression.codec.lzo.class=com.hadoop.compression.lzo.LzoCodec mapred.child.env="JAVA_LIBRARY_PATH=/usr/lib/hadoop/lib/native/Linux-amd64-64/"

  • MapReduce サービスに追加 環境安全弁

    HADOOP_CLASSPATH=/usr/lib/hadoop/lib/*

それでおしまい。

使用する MarReduce ジョブは、ファイルTextInputFormatとシームレスに連携する必要があり.lzoます。ただし、LZO ファイルにインデックスを付けて ( を使用して) 分割可能にすることを選択した場合、インデクサーが各ファイルの次にファイルをcom.hadoop.compression.lzo.DistributedLzoIndexer書き込むことがわかります。これらは入力の一部として解釈されるため、これは問題です。この場合、MR ジョブを で動作するように変更する必要があります。.index.lzoTextInputFormatLzoTextInputFormat

Hive の時点では、LZO ファイルのインデックスを作成しない限り、変更も透過的です。インデックス作成を開始する場合 (より良いデータ分散を利用するため)、入力形式を に更新する必要がありますLzoTextInputFormat。パーティションを使用する場合は、パーティションごとに実行できます。

于 2013-06-17T09:42:26.460 に答える