体积图像数据的分布式处理

对于物体识别algorithm的开发,我需要在大量的体积图像文件(MR扫描)上重复运行检测程序。 检测程序是一个命令行工具。 如果我在本地计算机上在单个文件上运行它,而单线程大约需要10秒。 处理结果被写入文本文件。 典型的运行将是:

  • 每个300 MB的10000个图像= 3TB
  • 单芯10秒= 100000秒=约27小时

我能做些什么来获得更快的结果? 我可以访问20台服务器的集群,每台服务器有24个(虚拟)内核(Xeon E5,1TByte磁盘,CentOS Linux 7.2)。 理论上480个核心只需要3.5分钟的任务。 我正在考虑使用Hadoop,但它不是用来处理二进制数据,而是分割input文件,这不是一个选项。 我可能需要某种分布式文件系统。 我使用NFS进行testing,networking成为严重的瓶颈。 每个服务器只应该处理他本地存储的文件。 另一种select可能是购买一台高端工作站,忘记分布式处理。

我不确定,如果我们需要数据局部性,即每个节点都保存本地数据的一部分,只处理本地数据。

我使用竞价型实例定期在AWS上运行大规模分布式计算。 您应该可以使用20台服务器的集群。

你没有提到你的服务器正在使用哪个操作系统,但是如果它是基于Linux的,你最好的朋友是bash。 你也很幸运,这是一个命令行程序。 这意味着您可以使用ssh在一个主节点上直接在服务器上运行命令。

典型的处理顺序是:

  1. 在主节点上运行一个脚本,在所有从节点上通过ssh发送和运行脚本
  2. 每个从属节点从存储它们的主节点(通过NFS或scp)下载一部分文件,
  3. 每个从节点处理其文件,通过scp,mysql或文本存储保存所需的数据

要开始,你需要ssh访问所有从主的奴隶。 然后,您可以像脚本一样将scp文件分配给每个Slave。 如果你正在私人网络上运行,你不必太在意安全性,所以只要设置ssh密码就可以了。

就CPU内核而言,如果您使用的命令行程序不是为多核而设计的,那么您可以对每个从机运行多个ssh命令。 最好的办法是运行一些测试,看看最佳的进程数是多少,因为内存不足,磁盘访问或类似的进程可能会很慢。 但是,如果您发现12个并发进程提供了最快的平均时间,则可以通过ssh同时运行12个脚本。

完成这一切并不是一件小事,但是,你将永远能够在很短的时间内完成任务。

你可以使用Hadoop。 是的,FileInputFormat和RecordReader的默认实现是将文件拆分成块并将块拆分成行,但是您可以编写自己的FileInputFormat和RecordReader实现。 我创建了另一个用途的自定义FileInputFormat,我有相反的问题 – 分裂输入数据比默认更精细,但有一个很好看的食谱正是你的问题: https : //gist.github.com/sritchie/808035加https://www.timofejew.com/hadoop-streaming-whole-files/

但从另一方面来说,Hadoop是一个沉重的野兽。 它对mapper启动有很大的开销,所以mapper的最佳运行时间是几分钟。 你的任务太短。 也许有可能创建更聪明的FileInputFormat,它可以将一堆文件解释为单个文件,并将文件作为记录解析为同一个映射器,我不确定。