hadoop fs -text返回InvocationTargetException

时间:2012-09-21 15:28:50

标签: hadoop

我正在尝试使用hadoop fs -text读取文件。该文件是我自己的类中定义的序列文件 - 因为我使用参数-libjars。一般。这次我得到没有stacktrace的InvocationTargetException:

# hadoop fs -libjars myjar.jar -text /tmp/part-r-00000
12/09/21 17:24:18 WARN snappy.LoadSnappy: Snappy native library is available
12/09/21 17:24:18 INFO util.NativeCodeLoader: Loaded the native-hadoop library
12/09/21 17:24:18 INFO snappy.LoadSnappy: Snappy native library loaded
text: java.lang.reflect.InvocationTargetException

很难看出发生了什么。

2 个答案:

答案 0 :(得分:1)

通常,如果你得到text: [null|classname|exception]而不是文件的内容,那么很可能org.apache.hadoop.fs.FsShell会在某处抛出异常。

如果有机会,请在阅读时以本地模式运行Hadoop并调试该类 seq。来自命令行的文件。

FsShell我在这些地方设置了断点:

 public int read() throws IOException {
   ...
 }

 public TextRecordInputStream(FileStatus f) throws IOException {
   ...
 }


还要检查自定义Writable的序列化/反序列化过程,因为反序列化过程中的错误可能会导致此类问题。

答案 1 :(得分:1)

可能与Key / Value类中的嵌套类或依赖类有关。

使用-libjars选项时,FsShell(hadoop fs)会将jar添加到类路径中(正如您所期望的那样),因此您的根Key / Value类现在可用。这里可能发生的是你的Key / Value类依赖于另一个类,不是在libjars中列出的jar中,或者是在嵌套jar中(在jar中的libs文件夹中)。

由于hadoop jar命令会解压缩jar并将lib文件夹中的所有嵌套jar添加到类路径中,但是FsShell命令不会解压缩jar,这会让人感到困惑。

令人讨厌的是,FsShell不会将完整的堆栈跟踪转储到stderr,但是如果启用调试级别日志记录,则应该看到完整的堆栈跟踪(不知道如何执行此操作)