对我的第一个问题的简短回答: AWS 不进行自动索引。我已经用我自己的工作证实了这一点,并且还在他们的论坛上从 Andrew@AWS那里读到了同样的内容。
以下是如何进行索引:
要索引一些 LZO 文件,您需要使用我自己从Twitter hadoop-lzo项目构建的 Jar。如果您想直接使用 EMR 建立索引,您需要在某处构建 Jar,然后上传到 Amazon S3。
附带说明,Cloudera 对在您自己的集群上进行设置的所有步骤都有很好的说明。我在我的本地集群上做了这个,它允许我构建 Jar 并上传到 S3。如果您不想自己构建它,您可能可以在网上找到一个预先构建的 Jar。
从 Hadoop 作业输出数据时,请确保使用 LzopCodec 而不是 LzoCodec,否则文件不可索引(至少根据我的经验)。示例 Java 代码(同样的想法延续到 Streaming 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);