2012-12-08 18 views
6

私は、HadoopのMapReduceフレームワークとXuggleを統合したプログラムを開発中です。そのためには、メモリ内のHadoopデータオブジェクトを読み書きするクラスIURLProtocolHandlerFactoryを実装しています。Xuggleでメモリ内の入力を開くことができません

あなたはここに関連するコードを見ることができます: アイデアは、それがIURLProtocolHandler返すファイルを開くとき、私は後でその名前を参照するときようにUUIDでIURLProtocolHandlerFactoryクラスの各BytesWritableオブジェクトを登録することですhttps://gist.github.com/4191668

そのインスタンスに添付されている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 

次はどこに行くべきか、私はどのようにデバッグを続けなければならないのでしょうか?私の実装に欠陥があるかもしれませんが、私はそれを見ることができません。

答えて

2

私は入力/出力の多くのタイプが​​JNIコードのネイティブファイル記述子に変換されているが、渡すものは変換できないという問題があると思います。 XuggleIO.map()を通過した後、再びIContainerを呼び出してから、IContainerのJNIコードに入り、おそらくネイティブのファイル記述子を取得しようとし、avio_open()を呼び出すことになるので、独自のIURLProtocolHandlerを作成することはできません。 。

​​には、ファイルではない/ファイル記述子がなく、正しく処理されることがあります。あなたが開くことができるものは、java.io.DataOutputjava.io.DataOutputStream(および対応する入力)のIContainerコードに記載されています。 BytesReadable/BytesWriteableをラップするDataInput/DataOutput実装を作成し、IContainerで開くことをお勧めします。

問題が解決しない場合は、一時ファイルへのご入力を書いて、一時ファイルからの出力を読んで:)

+0

を作成してみてください。私自身のIURLProtocolHandlerFactoryを読んだり書いたりするのはとても素敵でクリーンなアイデアだと思っていました。私は自分の入力用にDataInputを実装し、まだ私用のIURLProtocolHandlerFactoryを使用しているのを見ましたが、私は秘密に、きれいで素敵な状態を保つことができると期待していました。それはとにかくこのインタフェースのポイントですか?動作する実装はどのように見えますか? – gphilip

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を作成してから、

関連する問題