6

私はHadoopのMapReduceフレームワークをXuggleと統合するプログラムに取り組んでいます。そのために、IURLProtocolHandlerFactoryメモリ内のHadoopデータオブジェクトとの間で読み取りと書き込みを行うクラスを実装しています。

ここで関連するコードを見ることができます: https ://gist.github.com/4191668

クラス内の各BytesWritableオブジェクトをIURLProtocolHandlerFactory UUIDに登録して、後でファイルを開いているときにその名前を参照すると、IURLProtocolHandlerそのオブジェクトにアタッチされているインスタンスが返さBytesWritableれ、メモリとの間で読み取りと書き込みができるようにするという考え方です。

問題は、次のような例外が発生することです。

java.lang.RuntimeException: could not open: byteswritable:d68ce8fa-c56d-4ff5-bade-a4cfb3f666fe
at com.xuggle.mediatool.MediaReader.open(MediaReader.java:637)

(投稿されたリンクの下も参照してください)

デバッグすると、オブジェクトがファクトリで正しく検出され、さらに、プロトコルハンドラで読み取られていることがわかります。出力ファイルから/へリスナーを削除すると、同じことが起こるので、問題はすでに入力にあります。Xuggleのコードを深く掘り下げると、JNIコード(ファイルを開こうとします)に到達しますが、これ以上進むことはできません。これは明らかにエラーコードを返します。

XugglerJNI.IContainer_open__SWIG_0

次にどこに行くべきか、どのようにデバッグを続けるべきかについて、いくつかのヒントを本当にいただければ幸いです。たぶん私の実装には欠陥がありますが、私はそれを見ることができません。

4

2 に答える 2

2

あなたが直面している問題は、多くの種類の入出力がIContainerJNIコードのネイティブファイル記述子に変換されることだと思いますが、渡したものは変換できません。IURLProtocolHandlerこの方法で独自のファイルを作成することはできない場合があります。これは、を通過した後、 XuggleIO.map()IContainerを再度呼び出してから、IContainer JNIコードを呼び出して、ネイティブファイル記述子を取得してを呼び出すことになるためですavio_open()

ただし、ファイルではない/ファイル記述子がない、正しく処理されるものがいくつかある場合あります。IContainer開くことができるものは、IContainerコード、つまりjava.io.DataOutputand java.io.DataOutputStream(および対応する入力)で確認できます。BytesReadable/BytesWriteableをラップアラウンドするDataInput/DataOutput実装を作成し、それをIContainerで開くことをお勧めします。

それが機能しない場合は、入力を一時ファイルに書き込み、出力を一時ファイルから読み取ります:)

于 2012-12-19T19:37:31.213 に答える
0

最初にファイルをローカルにコピーしてから、コンテナを開いてみてください。

filePath = split.getPath();
final FileSystem fileSystem = filePath.getFileSystem(job);
Path localFile = new Path(filePath.getName());
fileSystem.createNewFile(localFile);
fileSystem.copyToLocalFile(filePath, localFile);
int result = container.open(filePath.getName(), IContainer.Type.READ, null);

このコードは、RecordReaderクラスで機能します。

あなたの場合、最初にファイルをローカルにコピーしてから、MediaReaderを作成してみてください。

于 2013-04-24T11:25:52.587 に答える