11

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

当我将它们复制到本地并尝试使用 Google 标准库解压缩它们时,它告诉我该文件缺少 Snappy 标识符。当我尝试通过插入一个 Snappy 标识符来解决这个问题时,它会弄乱校验和。

我可以做些什么来读取这些文件而不必编写单独的 Hadoop 程序或通过 Hive 之类的东西传递它?

4

4 回答 4

26

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

hadoop fs -text /path/filename

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

hdfs dfs -text /path/filename

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

于 2014-11-26T23:08:18.243 回答
3

请查看Cloudera 博客上的这篇文章。它解释了如何将 Snappy 与 Hadoop 一起使用。本质上,原始文本上的 Snappy 文件是不可拆分的,因此您无法跨多个主机读取单个文件。

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

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

于 2013-05-21T18:34:02.430 回答
0

那是因为 hadoop 使用的 snappy 有更多的元数据,这些元数据没有被https://code.google.com/p/snappy/之类的库所破坏,您需要使用 hadoop native snappy 来取消下载您下载的数据文件。

于 2013-07-25T22:54:15.733 回答
0

如果你登陆这里并试图通过本地命令行解压缩 .snappy 文件(就像我一样),试试这个工具:

https://github.com/kubo/snzip#hadoop-snappy-format

于 2021-10-20T01:39:29.420 回答