2014-11-14 74 views

回答

1

如果您询问mapreduce正在使用哪个编解码器进行中间映射输出和/或最终输出,您可以检查Hadoop的配置文件,通常位于<HADOOP_HOME>/etc/mapred-site.xml。然而,我并不知道有直接从命令行检查的方法。

设置为中间映射输出压缩看起来应该象下面这样:

<property> 
<name>mapreduce.map.output.compress</name> 
<value>true</value> 
</property> 

<property> 
<name>mapreduce.map.output.compress.codec</name> 
<value>org.apache.hadoop.io.compress.GzipCodec</value> 
</property> 

设置为作业输出压缩看起来应该象下面这样:

<property> 
<name>mapreduce.output.fileoutputformat.compress</name> 
<value>true</value> 
</property> 

<property> 
<name>mapreduce.output.fileoutputformat.compress.type</name> 
<value>BLOCK</value> 
</property> 

<property> 
<name>mapreduce.output.fileoutputformat.compress.codec</name> 
<value>org.apache.hadoop.io.compress.GzipCodec</value> 
</property> 

来自这两个片段,可以看出,我正在使用GZIP编解码器,并且我正在压缩中间映射输出以及最终输出。希望有所帮助!

1

一种方法是在本地下载文件(使用hdfs dfs -get命令),然后按照the procedure检测本地文件的压缩格式。

这对于Hadoop的以外的压缩文件非常有效。对于在Hadoop内生成的文件,这仅适用于数量有限的情况,例如用Gzip压缩的文本文件。

在Hadoop中压缩的文件很可能是所谓的“容器格式”,例如, Avro,序列文件,Parquet等。这意味着并非整个文件被压缩,而只是文件内的数据块。您提到的配置单元的describe formatted table命令确实可以帮助您找出底层文件的输入格式。

一旦您知道文件格式,您应该参考文件格式的文档/源代码以获取编解码器检测的参考。有些文件格式甚至会附带命令行工具,以查看显示压缩编解码器的文件元数据。一些例子:

Avro

hadoop jar /path/to/avro-tools.jar getmeta FILE_LOCATION_ON_HDFS --key 'avro.codec' 

Parquet

hadoop jar /path/to/parquet-tools.jar meta FILE_LOCATION_ON_HDFS