我配置了Map Reduce作业,将输出保存为使用Snappy压缩的Sequence文件。 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?或者我该如何修改命令?
答案 0 :(得分:1)
错误明确指出ClassNotFoundException: Class com.hd.ipmetrics.IpMetricsWritable not found
。
这意味着类路径中缺少必需的库。 澄清你的疑虑:
Map-Reduce默认输出文件为part- *而没有 扩展的意义。记住扩展“thing”只是一个元数据 通常要求windows操作系统确定合适的 该文件的程序。它在linux / unix中没有任何意义 系统的行为不会改变,即使你重命名 文件为.snappy(你可能会尝试这个)。
该命令看起来绝对可以检查snappy文件,但似乎没有一些必需的jar文件,这导致ClassNotFoundException
。
编辑1: 默认情况下,hadoop通过以下命令从路径emit中选择jar文件:
$ hadoop classpath
默认情况下,它列出所有hadoop核心罐。
您可以通过在提示
上执行以下命令来添加jarexport 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-*