linux下的体图像数据分布式处理

nwwlzxa7  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(378)

对于目标识别算法的开发,我需要在大量的体积图像文件(mr扫描)上重复运行一个检测程序。检测程序是一个命令行工具。如果我在本地计算机上以单个文件和单线程运行它,大约需要10秒。处理结果将写入文本文件。典型的运行方式是:
10000个图像,每个300 mb=3tb
单核10秒=100000秒=约27小时
我该怎么做才能更快地得到结果?我可以访问一个由20台服务器组成的集群,每个服务器有24个(虚拟)内核(xeon e5,1tbyte磁盘,centos linux 7.2)。理论上,480个核的任务只需要3.5分钟。我正在考虑使用hadoop,但它不是为处理二进制数据而设计的,它会分割输入文件,这不是一个选项。我可能需要某种分布式文件系统。我使用nfs进行了测试,网络成为了一个严重的瓶颈。每个服务器应该只处理本地存储的文件。另一种选择可能是购买一台高端工作站,而忘记分布式处理。
我不确定,如果我们需要数据局部性,即每个节点在本地hd上持有部分数据,并且只处理其本地数据。

uqjltbpv

uqjltbpv1#

我经常使用spot示例在aws上运行大规模分布式计算。您肯定应该使用由20台服务器组成的集群。
你没有提到你的服务器正在使用哪个操作系统,但是如果它是基于linux的,你最好的朋友就是bash。你也很幸运,它是一个命令行程序。这意味着您可以使用ssh从一个主节点直接在服务器上运行命令。
典型的处理顺序是:
在主节点上运行脚本,主节点通过ssh在所有从节点上发送和运行脚本
每个从节点从存储文件的主节点下载一部分文件(通过nfs或scp)
每个从属节点处理其文件,通过scp、mysql或文本scrape保存所需的数据
要开始,您需要从主服务器对所有从服务器进行ssh访问。然后可以将scp文件发送到每个从属服务器,就像脚本一样。如果您在专用网络上运行,则不必太担心安全性,因此只需将ssh密码设置为简单的值。
在cpu内核方面,如果您使用的命令行程序不是为多核设计的,那么您可以对每个从机运行几个ssh命令。最好的办法是运行一些测试,看看最佳的进程数是多少,因为太多的进程可能会由于内存不足、磁盘访问或类似原因而变慢。但是假设您发现12个并发进程的平均时间最快,然后通过ssh同时运行12个脚本。
这不是一个小工作,让它全部完成,然而,你将永远能够处理在一小部分时间。

8wigbo56

8wigbo562#

你可以使用hadoop。是的,fileinputformat和recordreader的默认实现是将文件分割成块并将块分割成行,但是您可以编写自己的fileinputformat和recordreader实现。我创建自定义fileinputformat的另一个目的,我有相反的问题-分割输入数据比默认值更精细,但有一个很好看的食谱正是你的问题:https://gist.github.com/sritchie/808035 加https://www.timofejew.com/hadoop-streaming-whole-files/
但从另一个Angular 看,hadoop是一个沉重的野兽。它对于mapper启动有很大的开销,所以mapper的最佳运行时间是几分钟。你的任务太短了。也许有可能创建更聪明的fileinputformat,它可以将一堆文件解释为单个文件,并将文件作为记录提供给同一个Map器,我不确定。

相关问题