我正在尝试使用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
很难看出发生了什么。
答案 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,但是如果启用调试级别日志记录,则应该看到完整的堆栈跟踪(不知道如何执行此操作)