对于目标识别算法的开发,我需要在大量的体积图像文件(MR扫描)上反复运行一个检测程序。检测程序是命令行工具。如果我在本地计算机上运行单个文件和单线程,大约需要10秒。处理结果被写入文本文件。典型的运行方式是:
我该怎么做才能更快地得到结果呢?我可以访问一个由20个服务器组成的集群,每个服务器都有24个(虚拟)核心(Xeon E5、1 1TByte磁盘、CentOS Linux7.2)。理论上讲,480核应该只需要3.5分钟的任务。我正在考虑使用Hadoop,但它不是为处理二进制数据而设计的,它拆分输入文件,这不是一个选项。我可能需要某种分布式文件系统。我使用NFS进行了测试,网络成为了一个严重的瓶颈。每个服务器只应该处理本地存储的文件。另一种选择可能是购买一个单一的高端工作站,而忘记分布式处理。
我不确定,如果我们需要数据局部性,即每个节点都在本地HD上保存部分数据,并且只处理其本地数据。
发布于 2016-04-27 11:07:27
我经常使用Spot实例在AWS上运行大规模分布式计算。您绝对应该使用由20台服务器组成的集群。
您没有提到您的服务器正在使用哪个操作系统,但是如果它是基于linux的,那么您最好的朋友就是bash。幸运的是,这是一个命令行程序。这意味着您可以使用ssh直接从一个主节点在服务器上运行命令。
典型的处理顺序是:
要开始,您需要对主人的所有奴隶进行ssh访问。然后,您可以向每个奴隶提供scp文件,就像脚本一样。如果您在专用网络上运行,您不必太担心安全性,所以只需将ssh密码设置为一些简单的密码即可。
在CPU内核方面,如果您使用的命令行程序不是为多核设计的,那么您可以只对每个Slave运行几个ssh命令。最好的做法是运行几个测试,看看进程的最佳数量,因为太多的进程可能由于内存不足、磁盘访问或类似的原因而缓慢。但是假设您发现12个同时进程给出了最快的平均时间,然后通过ssh同时运行12个脚本。
完成这一切并不是一项小任务,然而,你将永远能够在一小部分时间内完成工作。
发布于 2016-04-28 15:17:17
你可以用Hadoop。是的,FileInputFormat和RecordReader的默认实现是将文件分割成块,将块分割成行,但是您可以编写自己的FileInputFormat和RecordReader实现。我已经为另一个目的创建了自定义FileInputFormat,我遇到了相反的问题--将输入数据分割得比默认情况更精细,但是对于您的问题,有一个好看的菜谱:https://gist.github.com/sritchie/808035 + https://www.timofejew.com/hadoop-streaming-whole-files/
但从另一边看,Hadoop是一只沉重的野兽。它对映射程序的启动有很大的开销,所以映射器的最佳运行时间是几分钟。你的任务太短了。也许可以创建更聪明的FileInputFormat,它可以将一堆文件解释为单个文件,而将文件作为记录提供给同一个映射程序,我不确定。
https://stackoverflow.com/questions/36887710
复制相似问题