使用hadoop处理图像

rem*_*ezx 6 hadoop mapreduce image-processing hdfs hadoop-streaming

我是hadoop的新手,我将开发一个应用程序,使用hadoop处理多个图像并向用户显示实时结果,同时计算正在进行中.基本方法是分发可执行文件和一堆图像并收集结果.

我可以在计算过程中以交互方式获得结果吗?

对于这种用例,还有除hadoop流之外的其他选择吗?

如何通过图像提供可执行文件?除了用stdin喂它之外我找不到任何例子.

0x0*_*FFF 3

对于在 Hadoop 上处理图像,组织计算的最佳方法是:

  1. 将图像存储在序列文件中。Key - 图像名称或其 ID,Value - 图像二进制数据。这样,您将拥有一个包含需要处理的所有图像的单个文件。如果您将图像动态添加到系统中,请考虑将它们聚合到每日序列文件中。我认为您不应该对此序列文件使用任何压缩,因为一般压缩算法不能很好地处理图像
  2. 处理图像。这里有很多选项可供选择。首先是使用 Hadoop MapReduce 并用 Java 编写程序,因为使用 Java,您将能够读取序列文件并在每个映射步骤中直接从中获取“值”,其中“值”是二进制文件数据。鉴于此,您可以运行任何处理逻辑。第二个选项是 Hadoop 流。它有一个限制,即所有数据都发送到应用程序的 stdin,并且从 stdout 读取结果。但是您可以通过用 Java 编写自己的 InputFormat 来克服这个问题,它将序列文件中的图像二进制数据序列化为 Base64 字符串,并将其传递给您的通用应用程序。第三种选择是使用 Spark 来处理这些数据,但您的编程语言选择同样受到限制:Scala、Java 或 Python。
  3. Hadoop 的开发是为了简化大量数据的批处理。Spark 本质上是相似的——它是一个批处理工具。这意味着在处理所有数据之前您无法获得任何结果。Spark Streaming 的情况有点不同 - 您可以处理 1-10 秒的微批次并单独处理每个批次,因此通常您可以使其适合您的情况。

我不知道你的完整情况,但一种可能的解决方案是使用 Kafka + Spark Streaming。您的应用程序应该将二进制格式的图像放入 Kafka 队列,而 Spark 将在集群上以微批次方式消费和处理它们,通过某些第三个组件更新用户(至少通过将图像处理状态放入另一个应用程序的 Kafka 中)来处理它)

但总的来说,您提供的信息并不完整,无法为您的具体案例推荐良好的架构