最初の質問に対する簡単な回答: 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);