我以 Snappy 压缩格式将文件存储在 HDFS 上。我希望能够在我的本地 Linux 文件系统上检查这些文件,以确保创建它们的 Hadoop 进程已正确执行。
当我将它们复制到本地并尝试使用 Google 标准库解压缩它们时,它告诉我该文件缺少 Snappy 标识符。当我尝试通过插入一个 Snappy 标识符来解决这个问题时,它会弄乱校验和。
我可以做些什么来读取这些文件而不必编写单独的 Hadoop 程序或通过 Hive 之类的东西传递它?
我以 Snappy 压缩格式将文件存储在 HDFS 上。我希望能够在我的本地 Linux 文件系统上检查这些文件,以确保创建它们的 Hadoop 进程已正确执行。
当我将它们复制到本地并尝试使用 Google 标准库解压缩它们时,它告诉我该文件缺少 Snappy 标识符。当我尝试通过插入一个 Snappy 标识符来解决这个问题时,它会弄乱校验和。
我可以做些什么来读取这些文件而不必编写单独的 Hadoop 程序或通过 Hive 之类的东西传递它?
终于发现可以使用下面的命令来读取HDFS上一个Snappy压缩文件的内容:
hadoop fs -text /path/filename
在 Cloudera 或 HDP 上使用最新命令:
hdfs dfs -text /path/filename
如果打算以文本格式下载文件以进行额外检查和处理,则该命令的输出可以通过管道传输到本地系统上的文件。您也可以使用 head 查看文件的前几行。
请查看Cloudera 博客上的这篇文章。它解释了如何将 Snappy 与 Hadoop 一起使用。本质上,原始文本上的 Snappy 文件是不可拆分的,因此您无法跨多个主机读取单个文件。
解决方案是以容器格式使用 Snappy,因此本质上您使用的是 Hadoop SequenceFile
,压缩集为 Snappy。如本答案所述,您可以将属性mapred.output.compression.codec设置为org.apache.hadoop.io.compress.SnappyCodec并将您的作业输出格式设置为SequenceFileOutputFormat
.
然后读取它,您应该只需要使用SequenceFile.Reader
,因为编解码器信息存储在文件头中。
那是因为 hadoop 使用的 snappy 有更多的元数据,这些元数据没有被https://code.google.com/p/snappy/之类的库所破坏,您需要使用 hadoop native snappy 来取消下载您下载的数据文件。
如果你登陆这里并试图通过本地命令行解压缩 .snappy 文件(就像我一样),试试这个工具: