2012-09-21 71 views
0

我正在嘗試使用hadoop fs -text讀取文件。該文件是在我自己的類中定義的序列文件 - 爲此,我使用參數-libjars。一般。這次我得到InvocationTargetException沒有堆棧跟蹤:hadoop fs -text返回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

你嘗試讀起。通過發出'export HADOOP_CLASSPATH =/path_to/myjar.jar:$ HADOOP_CLASSPATH; hadoop fs -text/tmp/part-r-00000'代替? –

+0

羅蘭德:沒有效果:/ –

+0

好吧,從日誌中可以很難確定問題的根源,因此我在回答中提出了一些提示,可能可能會幫助您進一步深入 –

回答

1

可能與您的Key/Value類中的嵌套類或依賴關係類有關。

當使用FsShell(hadoop fs)時,-libjars選項會將您的jar添加到類路徑中(如您所期望的),因此您的根鍵/值類現在可用。這裏可能發生的是你的Key/Value類依賴於另一個類,不是在libjars中列出的jar中,或者是嵌套的jar(在jar中的libs文件夾中)。

這讓人感到困惑,因爲hadoop jar命令會在您提交作業時解壓縮jar文件並將lib文件夾中的所有嵌套jar添加到classpath,但FsShell命令不會解壓縮該jar。

煩人的FsShell不轉儲全堆棧跟蹤到stderr,但如果你啓用調試級別的日誌記錄,你應該看到完整的堆棧跟蹤(不知道你是怎麼做到這雖然)

1

通常,如果您得到text: [null|classname|exception]而不是該文件的內容,則最有可能org.apache.hadoop.fs.FsShell在某處引發異常。

如果你有機會,在本地模式調試運行Hadoop的閱讀 的序列時類。文件從命令行。

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

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


檢查也是您的自定義Writable的序列化/反序列化的過程,因爲一個錯誤的反序列化過程:

FsShell我會在這些地方設置斷點會造成這樣的問題。