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



我已经阅读并尝试了我能找到的每一个例子,以解决这个看似简单的问题。 假设有一组未压缩的文本文件,我想对它们运行处理步骤,然后输出一组包含结果的压缩文件。 为简单起见,此示例假定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等),添加化简器,设置mapred.output.compression.type(BLOCK,RECROD)等,结果总是相同的。 作为参考,我正在使用 CDH 4.1.2 的新版本。

以下内容适用于 Hadoop v1.0.0

这将产生一个压缩输出:

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

块压缩的序列文件作为输出:

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 的情况下,许多属性已被弃用(请参阅此处的完整列表)。因此,您必须执行以下更改:

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

在Cloudera Manager中,转到服务> 服务地图减少>配置>任务跟踪器>压缩

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

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

相关内容

  • 没有找到相关文章

最新更新