我是 hadoop 的新手,我打算开发一个应用程序,它使用 hadoop 处理多个图像并向用户实时显示结果,同时他们正在计算。基本方法是分发可执行文件和一堆图像并收集结果。
我可以在计算过程中以交互方式获得结果吗?
对于这种用例,除了 hadoop 流媒体之外,还有其他替代方案吗?
如何为可执行文件提供图像?除了用 stdin 提供它之外,我找不到任何示例。
最佳答案
对于在 Hadoop 上处理图像,组织计算的最佳方式是:
- 将图像存储在序列文件中。键 - 图像名称或其 ID,值 - 图像二进制数据。这样您将拥有一个包含所有需要处理的图像的文件。如果您将图像动态添加到您的系统,请考虑将它们聚合到日常序列文件中。我认为您不应该对此序列文件使用任何压缩,因为一般的压缩算法不适用于图像
- 处理图像。在这里您有许多选项可供选择。首先是使用 Hadoop MapReduce 并用 Java 编写程序,因为使用 Java 可以读取序列文件并在每个映射步骤中直接从中获取“值”,其中“值”是二进制文件数据。鉴于此,您可以运行任何处理逻辑。第二个选项是 Hadoop Streaming。它有一个限制,即所有数据都进入应用程序的 stdin,结果从 stdout 读取。但是您可以通过在 Java 中编写您自己的 InputFormat 来克服这个问题,它将序列文件中的图像二进制数据序列化为 Base64 字符串并将其传递给您的通用应用程序。第三种选择是使用 Spark 来处理这些数据,但同样你在编程语言选择上受到限制:Scala、Java 或 Python。
- 开发 Hadoop 是为了简化对大量数据的批处理。 Spark 本质上是相似的——它是一个批处理工具。这意味着在处理完所有数据之前您无法获得任何结果。 Spark Streaming 的情况有点不同 - 您可以处理 1-10 秒的微批处理并分别处理每个批处理,因此通常您可以让它适用于您的情况。
我不知道你的完整案例,但一种可能的解决方案是使用 Kafka + Spark Streaming。您的应用程序应该将二进制格式的图像放入 Kafka 队列,而 Spark 将在集群上以微批处理的方式使用和处理它们,通过某些第三方组件更新用户(至少通过将图像处理状态放入另一个应用程序的 Kafka)处理它)
但总的来说,您提供的信息并不完整,无法为您的特定案例推荐一个好的架构
关于image-processing - 使用 hadoop 处理图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23057692/