4

我想对存储在 S3 上的 Elastic Map Reduce 作业的输出使用 LZO 压缩,但不清楚这些文件是否会自动编制索引,以便将来在此数据上运行的作业会将文件拆分为多个任务。

例如,如果我的输出是一堆 TSV 数据行,在 1GB LZO 文件中,未来的地图作业是否只会创建 1 个任务,或者类似 (1GB/blockSize) 的任务(即文件未压缩时的行为,或者目录中是否有 LZO 索引文件)?

编辑:如果这不是自动完成的,推荐什么让我的输出被 LZO 索引?在将文件上传到 S3之前进行索引吗?

4

1 回答 1

6

对我的第一个问题的简短回答: 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);
于 2012-10-23T05:39:57.267 回答