6

我正在开发一个将 Hadoop 的 MapReduce 框架与 Xuggle 集成的程序。为此,我正在实现一个IURLProtocolHandlerFactory从内存中的 Hadoop 数据对象读取和写入的类。

你可以在这里看到相关代码: https ://gist.github.com/4191668

这个想法是用 UUID 注册类BytesWritable中的每个对象,IURLProtocolHandlerFactory 这样当我稍后在打开文件时引用该名称时,它会返回一个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

我认为您遇到的问题是许多输入/输出类型在 JNI 代码中被转换为本机文件描述符IContainer,但您传递的内容无法转换。可能无法以这种方式创建您自己的,因为它会IURLProtocolHandler在经过.XuggleIO.map()avio_open()

但是,您可能会打开IContainer一些不是文件/没有文件描述符的东西,并且可以正确处理。在IContainer代码中可以看到可以打开的东西,即java.io.DataOutputjava.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 回答