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

时间:2016-04-27 10:52:11

标签: linux image hadoop machine-learning distributed-computing

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

  • 每张300 MB的10000张图片= 3TB
  • 单核上10秒= 100000秒=约27小时

如何才能更快地获得结果?我可以访问一个包含20个服务器的集群,每个服务器有24个(虚拟)核心(Xeon E5,1TByte磁盘,CentOS Linux 7.2)。 从理论上讲,480核心应该只需要3.5分钟的时间。 我正在考虑使用Hadoop,但它不是为处理二进制数据而设计的,它会拆分输入文件,这不是一个选项。 我可能需要某种分布式文件系统。我使用NFS测试,网络成为一个严重的瓶颈。每个服务器应该只处理他本地存储的文件。 替代方案可能是购买单个高端工作站而忘记分布式处理。

我不确定,如果我们需要数据位置, 即每个节点在本地HD上保存部分数据并仅处理他的 本地数据。

2 个答案:

答案 0 :(得分:2)

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

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

典型的处理顺序是:

  1. 在主节点上运行一个脚本,该脚本通过所有从节点上的ssh发送和运行脚本
  2. 每个从属节点从存储它们的主节点下载一部分文件(通过NFS或scp)
  3. 每个Slave Node处理其文件,通过scp,mysql或text scrape保存所需的数据
  4. 要开始使用,您需要从主服务器获取所有Slave的ssh访问权限。然后,您可以将文件scp到每个Slave,就像脚本一样。如果您在专用网络上运行,则不必过于担心安全问题,因此只需将ssh密码设置为简单的密码即可。

    就CPU核心而言,如果您使用的命令行程序不是针对多核设计的,则可以向每个Slave运行几个ssh命令。最好的办法是运行一些测试,看看最佳进程数是多少,因为由于内存不足,磁盘访问不足等原因,过多的进程可能会很慢。但是你会发现12个并发进程的平均时间最快,然后通过ssh同时运行12个脚本。

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

答案 1 :(得分:2)

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

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