2

Google Cloud Storage にある圧縮データに対して、Google Compute Engine で Hadoop ジョブを実行しようとしています。SequenceFileInputFormat を使用してデータを読み取ろうとすると、次の例外が発生します。

hadoop@hadoop-m:/home/salikeeno$ hadoop jar ${JAR} ${PROJECT} ${OUTPUT_TABLE}
14/08/21 19:56:00 INFO jaws.JawsApp: Using export bucket 'askbuckerthroughhadoop' as specified in 'mapred.bq.gcs.bucket'
14/08/21 19:56:00 INFO bigquery.BigQueryConfiguration: Using specified project-id 'regal-campaign-641' for output
14/08/21 19:56:00 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.8-hadoop1
14/08/21 19:56:01 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
14/08/21 19:56:03 INFO input.FileInputFormat: Total input paths to process : 1
14/08/21 19:56:09 INFO mapred.JobClient: Running job: job_201408211943_0002
14/08/21 19:56:10 INFO mapred.JobClient:  map 0% reduce 0%
14/08/21 19:56:20 INFO mapred.JobClient: Task Id : attempt_201408211943_0002_m_000001_0, Status : FAILED
java.lang.RuntimeException: native snappy library not available
        at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:189)
        at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:125)
        at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1581)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1490)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1479)
        at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1474)
        at org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader.initialize(SequenceFileRecordReader.java:50)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:521)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)
  1. SnappyCodec が利用できないようです。Google コンピューティング エンジンの Hadoop クラスタに Snappy を含める/有効にする方法を教えてください。
  2. Hadoop クラスターのデプロイ中に、bdutil スクリプトを使用して Snappy lib を (必要な場合) デプロイできますか?
  3. Google Compute Engine にデプロイされた Hadoop クラスタにサードパーティの libs/jar をデプロイするための最良の方法は何ですか?

どうもありがとう

4

1 に答える 1

7

この手順は不要になりました。

bdutil デプロイメントには、デフォルトで Snappy が含まれます。

参考までに、元の回答:

あなたの最後の質問は、一般的なケースで答えるのが最も簡単なので、そこから始めましょう。依存関係を出荷するための一般的なガイダンスは、アプリケーションが分散キャッシュを利用して JAR とライブラリをワーカー (Hadoop 1 または 2) に配布することです。コードで既に GenericOptionsParser を使用している場合は、-libjars フラグを使用して JAR を配布できます。ファット JAR についても説明している Cloudera のブログ ( http://blog.cloudera.com/blog/2011/01/how-to-include- third-party-libraries-in-your-map-reduce -仕事/

他のシステムレベルのコンポーネントをインストールおよび構成するために、bdutil は拡張メカニズムをサポートしています。拡張機能の良い例は、bdutil にバンドルされている Spark 拡張機能 (extensions/spark/spark_env.sh) です。実行中の bdutil 拡張機能は -e フラグで追加されます。たとえば、Hadoop で Spark をデプロイするには:

./bdutil -e extensions/spark/spark_env.sh deploy    

1 番目と 2 番目の質問に関して: GCE 上の Hadoop で Snappy を処理する場合、2 つの障害があります。1 つ目は、Apache によってビルドされ、Hadoop 2 tarball にバンドルされているネイティブ サポート ライブラリが i386 用にビルドされているのに対し、GCE インスタンスは amd64 用にビルドされていることです。Hadoop 1 は両方のプラットフォームのバイナリをバンドルしますが、環境をバンドルまたは変更しない限り、snappy を見つけることはできません。このアーキテクチャの違いにより、Hadoop 2 では (snappy であろうとなかろうと) ネイティブのコンプレッサーは使用できず、Hadoop 1 では Snappy を簡単に使用することはできません。

これらの両方を克服する最も簡単な方法は、amd64 ネイティブ Hadoop ライブラリと libsnappy を含む独自の Hadoop tarball を作成することです。以下の手順は、これを行い、結果の tarball を bdutil で使用するためにステージングするのに役立ちます。

まず、Debian Wheezy バックポート イメージを使用して新しい GCE VM を起動し、VM サービス アカウントに Cloud Storage への読み取り / 書き込みアクセスを許可します。これをビルド マシンとして使用し、バイナリのビルド/保存が完了したらすぐに安全に破棄できます。

Snappy を使用した Hadoop 1.2.1 のビルド

新しいインスタンスに SSH で接続し、次のコマンドを実行して、途中でエラーがないか確認します。

sudo apt-get update
sudo apt-get install pkg-config libsnappy-dev libz-dev libssl-dev gcc make cmake automake autoconf libtool g++ openjdk-7-jdk maven ant

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

wget http://apache.mirrors.lucidnetworks.net/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz

tar zxvf hadoop-1.2.1.tar.gz 
pushd hadoop-1.2.1/

# Bundle libsnappy so we don't have to apt-get install it on each machine
cp /usr/lib/libsnappy* lib/native/Linux-amd64-64/

# Test to make certain Snappy is being loaded and is working:
bin/hadoop jar ./hadoop-test-1.2.1.jar testsequencefile -seed 0 -count 1000 -compressType RECORD xxx -codec org.apache.hadoop.io.compress.SnappyCodec -check

# Create a new tarball of Hadoop 1.2.1:
popd
rm hadoop-1.2.1.tar.gz
tar zcvf hadoop-1.2.1.tar.gz hadoop-1.2.1/

# Store the tarball on GCS: 
gsutil cp hadoop-1.2.1.tar.gz gs://<some bucket>/hadoop-1.2.1.tar.gz

Snappy を使用した Hadoop 2.4.1 のビルド

新しいインスタンスに SSH で接続し、次のコマンドを実行して、途中でエラーがないか確認します。

sudo apt-get update
sudo apt-get install pkg-config libsnappy-dev libz-dev libssl-dev gcc make cmake automake autoconf libtool g++ openjdk-7-jdk maven ant

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

# Protobuf 2.5.0 is required and not in Debian-backports
wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
tar xvf protobuf-2.5.0.tar.gz
pushd protobuf-2.5.0/ && ./configure && make && sudo make install && popd
sudo ldconfig

wget http://apache.mirrors.lucidnetworks.net/hadoop/common/hadoop-2.4.1/hadoop-2.4.1-src.tar.gz

# Unpack source
tar zxvf hadoop-2.4.1-src.tar.gz
pushd hadoop-2.4.1-src

# Build Hadoop
mvn package -Pdist,native -DskipTests -Dtar
pushd hadoop-dist/target/
pushd hadoop-2.4.1/

# Bundle libsnappy so we don't have to apt-get install it on each machine
cp /usr/lib/libsnappy* lib/native/

# Test that everything is working:
bin/hadoop jar share/hadoop/common/hadoop-common-2.4.1-tests.jar org.apache.hadoop.io.TestSequenceFile -seed 0 -count 1000 -compressType RECORD xxx -codec org.apache.hadoop.io.compress.SnappyCodec -check

popd

# Create a new tarball with libsnappy:
rm hadoop-2.4.1.tar.gz
tar zcf hadoop-2.4.1.tar.gz hadoop-2.4.1/

# Store the new tarball on GCS:
gsutil cp hadoop-2.4.1.tar.gz gs://<some bucket>/hadoop-2.4.1.tar.gz

popd
popd

bdutil_env.sh または hadoop2_env.sh の更新

適切なネイティブ ライブラリがバンドルされた Hadoop バージョンを取得したら、Hadoop 1 の場合は bdutil_env.sh、Hadoop 2 の場合は hadoop2_env.sh を更新することで、bdutil を新しい Hadoop tarball に向けることができます。いずれの場合も、適切なファイルを開き、次の行に沿ったブロック:

# URI of Hadoop tarball to be deployed. Must begin with gs:// or http(s)://
# Use 'gsutil ls gs://hadoop-dist/hadoop-*.tar.gz' to list Google supplied options
HADOOP_TARBALL_URI='gs://hadoop-dist/hadoop-1.2.1-bin.tar.gz'

上記の tarball を保存した URI を指すように URI を変更します。

HADOOP_TARBALL_URI='gs://<some bucket>/hadoop-1.2.1.tar.gz'
于 2014-08-22T02:42:12.100 に答える