如何在不使用Hadoop的情况下读取HDFS上的Snappy压缩文件?

问题描述 投票:10回答:3

我正在以Snappy压缩格式将文件存储在HDFS上。我希望能够在本地Linux文件系统上检查这些文件,以确保创建它们的Hadoop进程已正确执行。

[当我在本地复制它们并尝试使用Google标准库对其进行解压缩时,它告诉我该文件缺少Snappy标识符。当我尝试通过插入Snappy标识符解决此问题时,会弄乱校验和。

我该怎么做才能读取这些文件,而不必编写单独的Hadoop程序或将其通过类似Hive的方式传递?

hadoop compression hdfs snappy
3个回答
24
投票

我终于发现我可以使用以下命令来读取HDFS上Snappy压缩文件的内容:

hadoop fs -text /path/filename

使用Cloudera或HDP上的最新命令:

hdfs dfs -text /path/filename

如果打算以文本格式下载文件以进行其他检查和处理,则可以将该命令的输出通过管道传输到本地系统上的文件。您也可以使用head来查看文件的前几行。


3
投票

请看this post on Cloudera blog。它说明了如何在Hadoop中使用Snappy。本质上,原始文本上的Snappy文件不可拆分,因此您无法跨多个主机读取单个文件。

解决方案是以容器格式使用Snappy,因此,实质上,您使用的是Hadoop SequenceFile,其压缩设置为Snappy。如in this answer所述,您可以将属性mapred.output.compression.codec设置为org.apache.hadoop.io.compress.SnappyCodec,并将作业输出格式设置为SequenceFileOutputFormat。 >

然后要阅读它,您只需要使用SequenceFile.Reader,因为编解码器信息存储在文件头中。


0
投票

那是因为hadoop使用的snappy具有更多的元数据,而https://code.google.com/p/snappy/之类的库并未解散这些元数据,因此您需要使用hadoop本机snappy取消快照所下载的数据文件。

© www.soinside.com 2019 - 2024. All rights reserved.