image-processing - 使用 hadoop 处理图像

标签 image-processing hadoop mapreduce hdfs hadoop-streaming

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

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

对于这种用例,除了 hadoop 流媒体之外,还有其他替代方案吗?

如何为可执行文件提供图像?除了用 stdin 提供它之外,我找不到任何示例。

最佳答案

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

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

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

但总的来说,您提供的信息并不完整,无法为您的特定案例推荐一个好的架构

关于image-processing - 使用 hadoop 处理图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23057692/

相关文章:

c++ - OpenCV 错误 : ‘MAT’ is not a member of ‘cv’

scala - 如何在我的 Spark 应用程序中使用 OpenHashSet?

java - 自定义 InputFormat.getSplits() 从未在 Hive 中调用

python - 使用 Thrift 在 Python 脚本中运行 Hive-Query 时出现 `Connection Refused`

java - MapReduce 中的动态表达式

android - 如何在没有 API 的情况下在 Android 中执行图像处理?

objective-c - Mac OS X 上的图像处理入门

c++ - Opencv 平均滤波器给出与 Matlab 平均滤波器不同的输出

scala - 创建新的 SparkContext 时出现 Hadoop FileAlreadyExistsException

hadoop - 如何从 hdfs 符号链接(symbolic link)读取多个文本文件