2016-04-27 41 views
1

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

  • 10000图像与300 MB每= 3TB
  • 经10秒钟的单核=十万秒=约27小时

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

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

回答

2

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

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

处理的典型顺序是:

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

要开始,你需要有ssh访问Master的所有Slaves。然后,您可以像脚本一样将文件scp到每个Slave。如果你在私人网络上运行,你不必太在意安全性,所以只需将ssh密码设置为简单。

就CPU内核而言,如果您使用的命令行程序不是为多核设计的,那么您可以对每个从设备运行多个ssh命令。最好的办法是运行一些测试,看看最佳进程数是多少,因为由于内存不足,磁盘访问等原因导致进程速度太慢。但是,假设您发现12个并发进程提供了最快的平均时间,然后同时通过ssh运行12个脚本。

完成所有工作并不是一件小事,但是,您将永远能够在很短的时间内完成任务。

+0

这或多或少是我们现在正在做的。它不能很好地工作。整个系统很难维护,脚本也相当复杂。应该有一些软件可用于这个问题,它似乎很普通。这实际上是一个“尴尬平行”的问题。 –

+0

我可以看到它可能很笨拙。使用AWS可能会更容易,因为您可以使用所有正确的启动脚本创建新服务器,并从S3获取数据,而运行20个物理服务器听起来像是一场噩梦! –

2

您可以使用Hadoop。是的,FileInputFormat和RecordReader的默认实现是将文件拆分成块并将块拆分成行,但您可以编写自己的FileInputFormat和RecordReader实现。我创建定制FileInputFormat用于其他目的,我有相反的问题 - 比默认的更细划分的输入数据,但对于究竟你的问题好找食谱:https://gist.github.com/sritchie/808035https://www.timofejew.com/hadoop-streaming-whole-files/

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

+0

我发现这个:https://issues.apache.org/jira/browse/MAPREDUCE-5018,它与您提供的链接相结合,看起来像一个解决方案。你怎么看待这件事? –

+0

是https://gist.github.com/sritchie/808035应该在二进制数据上工作,还是只是修复分裂问题?我试过https://www.timofejew.com/hadoop-streaming-whole-files/,但它仍然在输入流中插入制表符。 –