如何从流式Hadoop作业获取压缩(文本)输出

时间:2012-12-02 15:12:58

标签: hadoop compression mapreduce

我已经阅读并尝试了我能找到的每个例子,看起来像这个直截了当的问题。假设有一组未压缩的文本文件,我想对它们运行一个处理步骤,然后输出一组带有结果的压缩文件。为简单起见,此示例假定cat为处理步骤。

我发现的一切都表明这应该有效:

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
    -Dmap.output.compress=true \
    -Dmap.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -mapper /bin/cat \
    -reducer NONE \
    -input /path_to_uncompressed \
    -output /path_to_compressed

作业正常运行,但输出纯文本文件。我尝试改变输入文件大小,改变编解码器(Snappy,BZip2等),添加一个reducer,设置mapred.output.compression.type(BLOCK,RECROD)等,结果总是一样的。作为参考,我使用的是CDH 4.1.2的新安装。

3 个答案:

答案 0 :(得分:6)

以下内容适用于Hadoop v1.0.0

这将产生一个gzip压缩输出:

hadoop jar /home/user/hadoop/path_to_jar/hadoop-streaming-1.0.0.jar \
    -D mapred.output.compress=true \
    -D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -D mapreduce.job.reduces=0 \
    -mapper /bin/cat \
    -input /user/hadoop/test/input/test.txt \
    -output /user/hadoop/test/output

块压缩的SequenceFile作为输出:

hadoop jar /home/user/hadoop/path_to_jar/hadoop-streaming-1.0.0.jar \
    -D mapred.output.compress=true \
    -D mapred.output.compression.type=BLOCK \
    -D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -D mapreduce.job.reduces=0 \
    -mapper /bin/cat \
    -input /user/hadoop/test/input/test.txt \
    -output /user/hadoop/test/output
    -outputformat org.apache.hadoop.mapred.SequenceFileOutputFormat

请注意参数的顺序以及-D和属性名称之间的空格

如果YARN已弃用许多属性(请参阅完整列表here)。因此,您必须进行以下更改:

mapred.output.compress - > mapreduce.output.fileoutputformat.compress mapred.output.compression.codec - > mapreduce.output.fileoutputformat.compress.codec mapred.output.compression.type - > mapreduce.output.fileoutputformat.compress.type

答案 1 :(得分:0)

在Cloudera经理, 去 服务>服务mapreduce>配置> TaskTracker>压缩

  • 压缩MapReduce作业输出(客户端覆盖):不要覆盖客户端配置

答案 2 :(得分:-2)

我为Cloudera工作并遇到过这篇文章。我只是想让你知道Cloudera Manager 4.5(我确认的版本)至少,除了将客户端配置覆盖为true或false之外,还可以选择不覆盖客户端配置。这使得它非常理想,因为您可以更改该设置以允许开发人员选择是否压缩输出。希望有所帮助 - 我知道这是不久前的事了。 :)