我正在做一个副项目,我们想在Hadoopmapreduce程序中处理图像(最终部署到Amazon的弹性mapreduce(。该过程的输入将是所有文件的列表,每个文件都附加了一些额外的数据(左下角的经度/经度位置 - 这些是航拍照片(
实际的处理需要在 Python 代码中进行,以便我们可以利用 Python 图像库。我能找到的所有 Python 流示例都使用 stdin 并处理文本输入。我可以通过标准数据将图像数据发送到 Python 吗?如果是这样,如何?
我用 Java 编写了一个 Mapper 类,它获取文件列表并将名称、额外数据和二进制内容保存到序列文件中。我在想也许我需要编写一个自定义的 Java 映射器来接收序列文件并将其通过管道传输到 Python。这是正确的方法吗?如果是这样,Java通过管道传输图像和Python读取它们应该是什么样子的?
如果不是很明显,我对 Java 或 Python 不是很熟悉,所以也有可能是我只是咬得比我能咀嚼的更多,因为我对这两种语言的介绍......
我可以看到几种可能的方法:
- 使用额外的数据和文件内容作为 python 程序的输入。这里棘手的部分将是编码。坦率地说,我不知道流媒体如何处理原始二进制内容,我假设基本答案是"不好"。主要问题是进程之间的 stdin/stdout 通信非常基于文本,依赖于用制表符和换行符分隔输入,以及类似的东西。您需要担心图像数据的编码,并且可能具有某种预处理步骤或自定义 InputFormat,以便您可以将图像表示为文本。
- 仅使用额外的数据和文件位置作为 python 程序的输入。然后程序可以独立地从文件中读取实际的图像数据。这里的小问题是确保该文件可用于 python 脚本。请记住,这是一个分布式环境,因此文件必须位于HDFS或类似的地方,我不知道是否有好的库可以在python中从HDFS读取文件。
- 自己做java-python交互。编写一个使用 Runtime 类启动 python 进程本身的 java 映射器。通过这种方式,您可以完全控制两个世界的通信方式,但显然它的代码更多,涉及更多。