压缩 Amazon EMR 集群输出的方法
有多种方法可以压缩数据处理产生的输出。使用的压缩工具取决于数据的属性。在传输大量数据时,压缩可以提高性能。
输出数据压缩
这会压缩 Hadoop 作业的输出。如果您使用的是 TextOutputFormat,返回结果是 gzip 处理后的文本文件。如果您向 SequenceFiles 写入,那么,返回结果是内部压缩的 SequenceFile。将配置设置 mapred.output.compress 设置为 True,可启用该功能。
如果您运行的是流式作业,则可以将这些参数传递给流式作业的方式启用该功能。
-jobconf mapred.output.compress=true
您还可以使用引导操作,自动压缩所有的作业输出。此处介绍如何使用 Ruby 客户端做到这点。
--bootstrap-actions s3://elasticmapreduce/bootstrap-actions/configure-hadoop \ --args "-s,mapred.output.compress=true"
最后,如果写入自定义 JAR,可以在创建作业时使用以下行启用输出压缩。
FileOutputFormat.setCompressOutput(conf, true);
中间数据压缩
如果您的作业有海量的数据在映射器会 Reducer 之间来回发送,那么启用中间压缩可以提高性能。压缩映射输出,并在其到达核心节点时进行解压缩。配置设置是 mapred.compress.map.output。您同样可以对输出压缩启用这个功能。
当写入自定义 JAR 时,使用下列命令:
conf.setCompressMapOutput(true);
在 Amazon EMR 中使用 Snappy 库
Snappy 是一种压缩和解压缩库,已为提高速度而进行了优化。它在 Amazon EMR AMI 版本 2.0 实例和更高版本中提供,用作中间压缩的默认值。有关 Snappy 库的详细信息,请转到 http://code.google.com/p/snappy/