我是hadoop新手,我将开发一个应用程序,使用hadoop处理多个图像,并向用户实时显示结果,同时他们正在进行计算。基本方法是分发可执行文件和一堆图像并收集结果。我可以在计算过程中以交互方式获得结果吗?对于这样的用例,除了hadoop流媒体,还有其他选择吗?如何为可执行文件提供图像?我找不到任何其他的例子,除了用stdin喂它。
l0oc07j21#
正如0x0fff在另一个答案中所说,这个问题没有提供足够的细节来推荐合适的体系结构。虽然这个问题很老了,但我只是补充了我在这个问题上的研究,以便它能帮助任何人的研究。spark是在分布式系统上进行处理的一种很好的方法。但它并没有一个强大的社区致力于opencv。storm是另一个apache的免费开源分布式实时计算系统。storm使得可靠地处理无限的数据流变得很容易,就像hadoop对批处理所做的那样,它实现了实时处理。stormcv是apache storm的扩展,专门设计用于支持分布式计算机视觉管道的开发。stormcv通过添加特定于计算机视觉(cv)的操作和数据模型,使storm能够用于视频处理。该平台的大部分cv操作都使用opencv,将这个库用于其他功能相对容易。有几个将storm与opencv结合使用的示例。他们的官方git hub页面上有一些例子。你可能想看看这个人脸检测的例子,并尝试它做人类检测-https://github.com/sensorstorm/stormcv/blob/master/stormcv-examples/src/nl/tno/stormcv/example/e2_facedetectiontopology.java.
z9gpfhce2#
实际上,您可以使用hadoopstorm框架创建自定义逻辑。您可以轻松地集成某些特定计算机视觉库的任何功能,并将其分布到该框架的各个部分。此外,storm还有一个称为drpc服务器的扩展,它允许您将逻辑作为简单的rpc调用使用。在我的文章中,您可以找到一个简单的例子,说明如何使用opencv人脸检测在storm中处理视频文件
ulydmbyx3#
对于在hadoop上处理图像,组织计算的最佳方法是:将图像存储在序列文件中。键-图像名称或其id,值-图像二进制数据。这样,您将拥有一个包含所有需要处理的图像的文件。如果将图像动态添加到系统中,请考虑将它们聚合到每日序列文件中。我不认为你应该对这个序列文件使用任何压缩,因为一般的压缩算法不能很好地处理图像处理图像。这里有很多选择。首先是使用hadoopmapreduce并用java编写程序,就像使用java一样,您可以读取序列文件并在每个Map步骤上直接从中获取“值”,其中“值”是二进制文件数据。因此,您可以运行任何处理逻辑。第二种选择是hadoop流媒体。它有一个限制,所有的数据都进入应用程序的stdin,结果从stdout读取。但是您可以通过用java编写自己的inputformat来克服这个问题,该格式将序列文件中的图像二进制数据序列化为base64字符串,并将其传递给通用应用程序。第三种选择是使用spark来处理这些数据,但是您的编程语言选择仍然有限:scala、java或python。hadoop是为了简化对大量数据的批处理而开发的。spark本质上是相似的—它是一个批处理工具。这意味着您在处理所有数据之前无法得到任何结果。spark streaming的情况有点不同——在这里,你处理1-10秒的微批次,并分别处理每一个,所以一般来说,你可以让它为你的案例工作。我不知道你的完整案例,但一个可能的解决方案是使用Kafka+Spark流。应用程序应将二进制格式的图像放入kafka队列,而spark将在集群上以微批量的方式消费和处理这些图像,并通过第三个组件更新用户(至少通过将图像处理状态放入kafka以便其他应用程序进行处理)但一般来说,您提供的信息并不完整,无法为您的具体案例推荐一个好的体系结构
3条答案
按热度按时间l0oc07j21#
正如0x0fff在另一个答案中所说,这个问题没有提供足够的细节来推荐合适的体系结构。虽然这个问题很老了,但我只是补充了我在这个问题上的研究,以便它能帮助任何人的研究。
spark是在分布式系统上进行处理的一种很好的方法。但它并没有一个强大的社区致力于opencv。storm是另一个apache的免费开源分布式实时计算系统。storm使得可靠地处理无限的数据流变得很容易,就像hadoop对批处理所做的那样,它实现了实时处理。
stormcv是apache storm的扩展,专门设计用于支持分布式计算机视觉管道的开发。stormcv通过添加特定于计算机视觉(cv)的操作和数据模型,使storm能够用于视频处理。该平台的大部分cv操作都使用opencv,将这个库用于其他功能相对容易。
有几个将storm与opencv结合使用的示例。他们的官方git hub页面上有一些例子。你可能想看看这个人脸检测的例子,并尝试它做人类检测-https://github.com/sensorstorm/stormcv/blob/master/stormcv-examples/src/nl/tno/stormcv/example/e2_facedetectiontopology.java.
z9gpfhce2#
实际上,您可以使用hadoopstorm框架创建自定义逻辑。您可以轻松地集成某些特定计算机视觉库的任何功能,并将其分布到该框架的各个部分。此外,storm还有一个称为drpc服务器的扩展,它允许您将逻辑作为简单的rpc调用使用。在我的文章中,您可以找到一个简单的例子,说明如何使用opencv人脸检测在storm中处理视频文件
ulydmbyx3#
对于在hadoop上处理图像,组织计算的最佳方法是:
将图像存储在序列文件中。键-图像名称或其id,值-图像二进制数据。这样,您将拥有一个包含所有需要处理的图像的文件。如果将图像动态添加到系统中,请考虑将它们聚合到每日序列文件中。我不认为你应该对这个序列文件使用任何压缩,因为一般的压缩算法不能很好地处理图像
处理图像。这里有很多选择。首先是使用hadoopmapreduce并用java编写程序,就像使用java一样,您可以读取序列文件并在每个Map步骤上直接从中获取“值”,其中“值”是二进制文件数据。因此,您可以运行任何处理逻辑。第二种选择是hadoop流媒体。它有一个限制,所有的数据都进入应用程序的stdin,结果从stdout读取。但是您可以通过用java编写自己的inputformat来克服这个问题,该格式将序列文件中的图像二进制数据序列化为base64字符串,并将其传递给通用应用程序。第三种选择是使用spark来处理这些数据,但是您的编程语言选择仍然有限:scala、java或python。
hadoop是为了简化对大量数据的批处理而开发的。spark本质上是相似的—它是一个批处理工具。这意味着您在处理所有数据之前无法得到任何结果。spark streaming的情况有点不同——在这里,你处理1-10秒的微批次,并分别处理每一个,所以一般来说,你可以让它为你的案例工作。
我不知道你的完整案例,但一个可能的解决方案是使用Kafka+Spark流。应用程序应将二进制格式的图像放入kafka队列,而spark将在集群上以微批量的方式消费和处理这些图像,并通过第三个组件更新用户(至少通过将图像处理状态放入kafka以便其他应用程序进行处理)
但一般来说,您提供的信息并不完整,无法为您的具体案例推荐一个好的体系结构