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

时间:2018-02-15 22:42:22

标签: bash hadoop mapreduce hdfs

我配置了Map Reduce作业,将输出保存为使用Snappy压缩的Sequence文件。 MR作业成功执行,但在HDFS中,输出文件如下所示: enter image description here 我预计该文件将具有.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?或者我该如何修改命令?

2 个答案:

答案 0 :(得分:1)

错误明确指出ClassNotFoundException: Class com.hd.ipmetrics.IpMetricsWritable not found

这意味着类路径中缺少必需的库。 澄清你的疑虑:

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

  2. 该命令看起来绝对可以检查snappy文件,但似乎没有一些必需的jar文件,这导致ClassNotFoundException

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

    $ hadoop classpath
    

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

    您可以通过在提示

    上执行以下命令来添加jar
    export HADOOP_CLASSPATH=/path/to/my/custom.jar
    

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

答案 1 :(得分:1)

而不是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-*