0

我正在尝试使用hadoop fs -text. 该文件是在我自己的类中定义的序列文件 - 为此我使用参数-libjars。一般。这次我得到了没有堆栈跟踪的 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

很难看出发生了什么。

4

2 回答 2

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期间的错误可能会导致此类问题。

于 2012-09-25T13:00:50.840 回答
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,但是如果您启用调试级别日志记录,您应该会看到完整的堆栈跟踪(虽然不确定您是如何做到的)

于 2012-10-02T01:36:14.350 回答