4

S3 に保存されている Elastic Map Reduce ジョブの出力で LZO 圧縮を使用したいのですが、ファイルが自動的にインデックス化され、このデータで将来のジョブが実行されるとファイルが複数のタスクに分割されるかどうかは明確ではありません。

たとえば、私の出力が 1 GB の LZO ファイル内の TSV データの行の束である場合、将来のマップ ジョブは 1 つのタスク、または (1 GB/ブロック サイズ) タスクのようなもの (つまり、ファイルが圧縮されていないときの動作) のみを作成します。 、またはディレクトリに LZO インデックス ファイルがあった場合)?

編集:これが自動的に行われない場合、出力に LZO インデックスを付けるには何が推奨されますか? ファイルを S3 にアップロードするにインデックスを作成しますか?

4

1 に答える 1

6

最初の質問に対する簡単な回答: AWS は自動インデックス作成を行いません。私は自分の仕事でこれを確認し、フォーラムで Andrew@AWSから同じことを読みました。

インデックス作成を行う方法は次のとおりです。

一部の LZO ファイルのインデックスを作成するには、 Twitter の hadoop-lzoプロジェクトから構築した独自の Jar を使用する必要があります。EMR で直接インデックスを作成する場合は、Jar をどこかに構築してから、Amazon S3 にアップロードする必要があります。

補足として、Cloudera には、独自のクラスターでこれをセットアップするためのすべての手順に関する適切な手順があります。これをローカル クラスターで行ったので、Jar をビルドして S3 にアップロードできました。自分で構築したくない場合は、おそらく構築済みの Jar をネットで見つけることができます。

Hadoop ジョブからデータを出力するときは、LzoCodec ではなく LzopCodec を使用していることを確認してください。そうしないと、ファイルにインデックスを付けることができません (少なくとも私の経験に基づくと)。Java コードの例 (ストリーミング API にも同じ考え方が適用されます):

import com.hadoop.compression.lzo.LzopCodec;
TextOutputFormat.setCompressOutput(job, true); 
TextOutputFormat.setOutputCompressorClass(job, LzopCodec.class)

hadoop-lzo Jar が S3 上にあり、Hadoop ジョブが .lzo ファイルを出力したら、出力ディレクトリでインデクサーを実行します (以下の手順で EMR ジョブ/クラスターを実行します)。

elastic-mapreduce -j <existingJobId> \
  --jar s3n://<yourBucketName>/hadoop-lzo-0.4.17-SNAPSHOT.jar \
    --args com.hadoop.compression.lzo.DistributedLzoIndexer \
    --args s3://<yourBucketName>/output/myLzoJobResults \
    --step-name "Lzo file indexer Jar"

その後、将来のジョブでデータを使用するときは、入力が LZO 形式であることを必ず指定してください。そうしないと、分割が発生しません。Java コードの例:

import com.hadoop.mapreduce.LzoTextInputFormat;
job.setInputFormatClass(LzoTextInputFormat.class);
于 2012-10-23T05:39:57.267 に答える