我想对存储在 S3 上的 Elastic Map Reduce 作业的输出使用 LZO 压缩,但不清楚文件是否自动编制索引,以便将来在此数据上运行的作业会将文件拆分为多个任务。
例如,如果我的输出是一堆 TSV 数据行,在一个 1GB LZO 文件中, future 的映射作业将只创建 1 个任务,或类似 (1GB/blockSize) 任务(即文件未压缩时的行为) ,或者目录中是否有 LZO 索引文件)?
编辑: 如果这不是自动完成的,有什么建议可以让我的输出被 LZO 索引?在将文件上传到 S3 之前进行索引吗?
最佳答案
对我的第一个问题的简短回答: AWS 不进行自动索引。我已经用我自己的工作证实了这一点,并且从 Andrew@AWS on their forum 中也读到了同样的内容。
以下是您可以如何进行索引:
要索引一些 LZO 文件,您需要使用我自己从 Twitter hadoop-lzo 项目构建的 Jar。如果您想直接使用 EMR 建立索引,您需要在某处构建 Jar,然后上传到 Amazon S3。
另外,Cloudera 对 setting this up on your own cluster 的所有步骤都有很好的说明。我在我的本地集群上做了这个,这让我可以构建 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);
关于amazon-s3 - 在 AWS EMR 上的 Hadoop 输出上使用 LZO 时,它是否为文件(存储在 S3 上)编制索引以供将来自动拆分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13019996/