我配置了一个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?或者我应该如何修改命令?
2条答案
按热度按时间5jdjgkvh1#
错误清楚地表明
ClassNotFoundException: Class com.hd.ipmetrics.IpMetricsWritable not found
.这意味着类路径中缺少必需的库。澄清您的疑问:
map reduce默认情况下将文件输出为part-*并且没有扩展名的含义。请记住,扩展名“thing”只是windows操作系统通常需要的元数据,用于确定文件的合适程序。它在linux/unix中没有任何意义,系统的行为也不会改变,即使您将文件重命名为.snappy(您实际上可以尝试这样做)。
这个命令看起来非常好,可以检查snappy文件,但是似乎没有一些必需的jar文件,这导致了
ClassNotFoundException
.编辑1:默认情况下,hadoop从以下命令发出的路径中选取jar文件:
默认情况下,它列出所有hadoop核心jar。
您可以通过在提示符下执行下面的命令来添加jar
执行此操作后,请尝试通过以下方式再次检查类路径
hadoop classpath
命令,您应该能够看到您的jar与hadoop核心jar一起列出。mitkmikd2#
而不是
hadoop fs –libjars
(它实际上有一个错误的连字符,应该-libjars
. 明白了,你就看不到了Unknown command
)你应该使用
HADOOP_CLASSPATH
环境变量