我正在以Snappy压缩格式将文件存储在HDFS上。我希望能够在本地Linux文件系统上检查这些文件,以确保创建它们的Hadoop进程已正确执行。
[当我在本地复制它们并尝试使用Google标准库对其进行解压缩时,它告诉我该文件缺少Snappy标识符。当我尝试通过插入Snappy标识符解决此问题时,会弄乱校验和。
我该怎么做才能读取这些文件,而不必编写单独的Hadoop程序或将其通过类似Hive的方式传递?
我终于发现我可以使用以下命令来读取HDFS上Snappy压缩文件的内容:
hadoop fs -text /path/filename
使用Cloudera或HDP上的最新命令:
hdfs dfs -text /path/filename
如果打算以文本格式下载文件以进行其他检查和处理,则可以将该命令的输出通过管道传输到本地系统上的文件。您也可以使用head来查看文件的前几行。
请看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
,因为编解码器信息存储在文件头中。
那是因为hadoop使用的snappy具有更多的元数据,而https://code.google.com/p/snappy/之类的库并未解散这些元数据,因此您需要使用hadoop本机snappy取消快照所下载的数据文件。