用于大图像处理的 Hadoop

Hadoop for Large Image Processing

我有一组 50TB 的 ~1GB tiff 图像,我需要 运行 使用相同的算法。目前,我有用 C++ 编写的校正过程并且运行良好,但是连续对所有这些图像进行 运行 将花费很长时间。我知道 MapReduce/Spark 的实现可以工作,但我似乎无法弄清楚如何使用图像 input/output。

我见过的每个 tutorial/example 都使用纯文本。理论上,我也想使用 Amazon Web Services。如果有人对我有一些指导,那就太好了。我显然不是在寻找完整的解决方案,但也许有人已经成功地实施了接近于此的解决方案?提前致谢。

你的数据在HDFS中吗?您希望从 Hadoop/Spark 中得到什么?在我看来,您所需要的只是一个文件名队列和一堆要执行的机器。

您可以将您的应用程序打包到 AWS Lambda 中(参见 Running Arbitrary Executables in AWS Lambda) and trigger events for each file. You can pack your app into a Docker container and start up a bunch of them in ECS,让它们在文件名(或 URL 或 S3 存储桶)队列中松散以进行处理。

我认为 Hadoop/Spark 太过分了,特别是因为它们在处理 1GB 分割作为输入时非常糟糕,而且您的处理不是 M/R(没有键值供 reducer 合并) .如果必须,您可以打包 C++ 应用程序以从标准输入读取并使用 Hadoop Streaming.

归根结底,问题来了:这50TB的数据存储在哪里,是什么格式?解决方案在很大程度上取决于答案,因为您希望将计算带到数据所在的位置,并避免将 50TB 传输到 AWS 甚至上传到 HDFS。

  • 您有 50TB 的 ~1GB 大型 .tif 文件。
  • 您想 运行 每个文件使用相同的算法。

解决 MapReduce 范式问题的一个方面是:

If you do complex calculation on your Data nodes, the system will limp.

您看到的主要是基于文本的简单示例的一个重要原因是,它们实际上是您可以在商业级硬件上 运行 解决的问题。如果您不知道或忘记了,我想指出:

MapReduce programming paradigm is for running the kind of jobs that need scaling out vs scaling up.


一些提示:

  • 对于这么大的数据,在数据所在的地方进行计算而不是将数据带到计算中是有意义的。
  • 运行 商业级硬件上的这项工作显然不是一个好主意。您需要多核机器 - 可能是 16/32。
  • 采购所需的硬件后,您应该优化软件以在任何地方并行化算法 necessary/useful。
  • 您的问题绝对是可以从扩大规模中获益的问题。对于大文件和大量此类文件的集合,增加 RAM 和使用更快的处理器无疑是明智之举。
  • 最后,如果您担心接受输入,您可以将图像读取为二进制。这将限制您使用 .tif 格式的能力,并且您可能需要重新设计您的处理算法。