我正在以快速压缩格式在hdfs上存储文件。我希望能够在本地linux文件系统上检查这些文件,以确保创建它们的hadoop进程执行正确。当我在本地复制它们并尝试用google标准库对它们进行反压缩时,它告诉我文件缺少snappy标识符。当我试图通过插入一个快速标识符来解决这个问题时,它会弄乱校验和。我能做些什么来读取这些文件,而不必编写单独的hadoop程序或通过类似hive的程序来传递它?
jecbmhm31#
我终于发现可以使用以下命令读取hdfs上snappy压缩文件的内容:
hadoop fs -text /path/filename
使用cloudera或hdp上的最新命令:
hdfs dfs -text /path/filename
如果目的是下载文本格式的文件以进行额外的检查和处理,则该命令的输出可以通过管道传输到本地系统上的文件。也可以使用head只查看文件的前几行。
tmb3ates2#
这是因为hadoop使用的snappy有更多的元数据,这些元数据不是像https://code.google.com/p/snappy/,您需要使用hadoop native snappy来取消对下载的数据文件的捕捉。
mqkwyuun3#
请看一下cloudera博客上的这篇文章。它解释了如何在hadoop中使用snappy。基本上,原始文本上的snappy文件是不可拆分的,因此不能跨多个主机读取单个文件。解决方案是以容器格式使用snappy,因此实际上您使用的是hadoop SequenceFile 压缩变形很快。如本回答中所述,可以将属性mapred.output.compression.codec设置为org.apache.hadoop.io.compress.snappycodec,并将作业输出格式设置为 SequenceFileOutputFormat .然后阅读它,你应该只需要使用 SequenceFile.Reader 因为编解码器信息存储在文件头中。
SequenceFile
SequenceFileOutputFormat
SequenceFile.Reader
3条答案
按热度按时间jecbmhm31#
我终于发现可以使用以下命令读取hdfs上snappy压缩文件的内容:
使用cloudera或hdp上的最新命令:
如果目的是下载文本格式的文件以进行额外的检查和处理,则该命令的输出可以通过管道传输到本地系统上的文件。也可以使用head只查看文件的前几行。
tmb3ates2#
这是因为hadoop使用的snappy有更多的元数据,这些元数据不是像https://code.google.com/p/snappy/,您需要使用hadoop native snappy来取消对下载的数据文件的捕捉。
mqkwyuun3#
请看一下cloudera博客上的这篇文章。它解释了如何在hadoop中使用snappy。基本上,原始文本上的snappy文件是不可拆分的,因此不能跨多个主机读取单个文件。
解决方案是以容器格式使用snappy,因此实际上您使用的是hadoop
SequenceFile
压缩变形很快。如本回答中所述,可以将属性mapred.output.compression.codec设置为org.apache.hadoop.io.compress.snappycodec,并将作业输出格式设置为SequenceFileOutputFormat
.然后阅读它,你应该只需要使用
SequenceFile.Reader
因为编解码器信息存储在文件头中。