Hadoop:用Python代码处理图像文件

时间:2013-10-07 19:31:43

标签: python hadoop mapreduce

我正在开展一个侧面项目,我们希望在hadoop mapreduce程序中处理图像(最终部署到Amazon的弹性mapreduce)。进程的输入将是所有文件的列表,每个文件都附加一些额外的数据(左下角的纬度/长位置 - 这些是航拍照片)

实际处理需要在Python代码中进行,因此我们可以利用Python Image Library。我可以找到的所有Python流示例都使用stdin和进程文本输入。我可以通过stdin将图像数据发送到Python吗?如果是这样,怎么样?

我在Java中编写了一个Mapper类,它接受文件列表并将名称,额外数据和二进制内容保存到序列文件中。我想也许我需要编写一个自定义Java映射器,它接收序列文件并将其传递给Python。这是正确的方法吗?如果是这样,那么Java应该将图像管道输出,而Python应该用什么来读取它们?

如果不是很明显,我对Java OR Python并不十分熟悉,所以我也可能只是因为我对这两种语言的介绍而咀嚼的方式超过了我...

1 个答案:

答案 0 :(得分:0)

我可以看到一些可能的方法:

  1. 使用额外数据和文件内容作为python程序的输入。这里棘手的部分是编码。我坦率地不知道流式传输如何与原始二进制内容一起工作,我假设基本答案是“不好”。主要问题是进程之间的stdin / stdout通信是基于文本的,依赖于使用制表符和换行符分隔输入,以及类似的东西。您需要担心图像数据的编码,可能需要某种预处理步骤,或者自定义的InputFormat,以便您可以将图像表示为文本。
  2. 仅使用额外数据和文件位置作为python程序的输入。然后程序可以独立地从文件中读取实际图像数据。这里的打嗝是确保文件可用于python脚本。请记住,这是一个分布式环境,因此文件必须是HDFS或类似的地方,我不知道是否有好的库可以在python中从HDFS读取文件。
  3. 自己进行java-python交互。编写一个使用Runtime类的java映射器来启动python进程本身。通过这种方式,您可以完全控制两个世界的通信方式,但显然它的代码更多,涉及更多。