HDFS 上的 Snappy 压缩文件没有扩展名且不可读

Snappy compressed file on HDFS appears without extension and is not readable

我配置了 Map Reduce 作业以将输出保存为使用 Snappy 压缩的序列文件。 MR 作业成功执行,但在 HDFS 中输出文件如下所示: 我预计该文件将具有 .snappy 扩展名,并且应该是 part-r-00000.snappy。现在我认为这可能是当我尝试使用此模式从本地文件系统读取文件时文件不可读的原因 hadoop fs -libjars /path/to/jar/myjar.jar -text /path/in/HDFS/to/my/file 所以我在执行命令时得到 –libjars: Unknown command

hadoop fs –libjars /root/hd/metrics.jar -text /user/maria_dev/hd/output/part-r-00000

当我使用此命令 hadoop fs -text /user/maria_dev/hd/output/part-r-00000 时,出现错误:

18/02/15 22:01:57 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
-text: Fatal internal error
java.lang.RuntimeException: java.io.IOException: WritableName can't load class: com.hd.metrics.IpMetricsWritable
Caused by: java.lang.ClassNotFoundException: Class com.hd.ipmetrics.IpMetricsWritable not found

会不会是缺少 .snappy 扩展名导致的问题?我应该尝试使用什么其他命令来读取压缩文件? 该 jar 在我的本地文件系统中 /root/hd/ 我应该把它放在哪里才不会导致 ClassNotFoundException?或者我应该如何修改命令?

错误清楚地说 ClassNotFoundException: Class com.hd.ipmetrics.IpMetricsWritable not found

这意味着class路径中缺少所需的库。 澄清你的疑惑:

  1. Map-Reduce默认输出文件为part-*,没有 延伸意义。记住扩展 "thing" 只是一个元数据 windows 操作系统通常要求确定合适的 文件的程序。它在 linux/unix 和 系统的行为不会改变,即使你重命名 文件为 .snappy(你实际上可以试试这个)。

  2. 检查 snappy 文件的命令看起来非常好,但似乎某些必需的 jar 文件不存在,这导致 ClassNotFoundException.

编辑 1: 默认情况下,hadoop 通过以下命令从发出的路径中选择 jar 文件:

$ hadoop classpath

默认情况下,它会列出所有 hadoop 核心 jar。

您可以通过在提示符下执行以下命令来添加您的 jar

export HADOOP_CLASSPATH=/path/to/my/custom.jar

执行此操作后,尝试通过 hadoop classpath 命令再次检查 class 路径,您应该能够看到您的 jar 与 hadoop 核心 jar 一起列出。

而不是 hadoop fs –libjars(实际上有一个错误的连字符,应该是 -libjars。准确地复制它,您将看不到 Unknown command

您应该使用 HADOOP_CLASSPATH 环境变量

export HADOOP_CLASSPATH=/root/hd/metrics.jar:${HADOOP_CLASSPATH}
hadoop fs -text /user/maria_dev/hd/output/part-r-*