0

でファイルを読み込もうとしていますhadoop fs -text。このファイルは、自分のクラスで定義されたシーケンス ファイルです。そのため、 parameter を使用しています-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

おそらく、キー/値クラスのネストされたクラスまたは依存関係クラスと関係があります。

この-libjarsオプションを使用すると、FsShell ( hadoop fs) によって jar がクラスパスに追加され (予想どおり)、ルートの Key / Value クラスが使用できるようになります。ここでおそらく起こっているのは、Key / Value クラスが、libjars にリストされている jar にないか、ネストされた jar (jar の libs フォルダー内) にある別のクラスに依存していることです。

これは、コマンドがジョブを送信するときに jar を解凍し、lib フォルダー内のネストされたすべての jar をクラスパスに追加するという事実によって混乱を招きhadoop jarますが、FsShell コマンドは jar を解凍しません。

厄介なことに、FsShell は完全なスタック トレースを stderr にダンプしませんが、デバッグ レベルのログ記録を有効にすると、完全なスタック トレースが表示されるはずです (ただし、これを行う方法はわかりません)。

于 2012-10-02T01:36:14.350 に答える