是否有任何简单的方法可以找到用于在Hadoop中压缩文件的编解码器?从命令行在Hadoop中压缩编码解码器检测
我需要编写一个Java程序,或将该文件添加到Hive中,以便我可以使用describe formatted table
?
是否有任何简单的方法可以找到用于在Hadoop中压缩文件的编解码器?从命令行在Hadoop中压缩编码解码器检测
我需要编写一个Java程序,或将该文件添加到Hive中,以便我可以使用describe formatted table
?
如果您询问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编解码器,并且我正在压缩中间映射输出以及最终输出。希望有所帮助!
一种方法是在本地下载文件(使用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'
hadoop jar /path/to/parquet-tools.jar meta FILE_LOCATION_ON_HDFS