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

标签 linux image hadoop machine-learning distributed-computing

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

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

我怎样才能更快地得到结果?我可以访问一个由 20 个服务器组成的集群,每个服务器有 24 个(虚拟)内核(Xeon E5、1TB 磁盘、CentOS Linux 7.2)。 理论上 480 个内核应该只需要 3.5 分钟即可完成任务。 我正在考虑使用 Hadoop,但它不是为处理二进制数据而设计的,它会拆分输入文件,这不是一个选项。 我可能需要某种分布式文件系统。我使用 NFS 进行了测试,网络成为严重的瓶颈。每个服务器应该只处理他本地存储的文件。 另一种选择可能是购买单个高端工作站而忘记分布式处理。

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

最佳答案

我经常使用 Spot 实例在 AWS 上运行大规模分布式计算。您绝对应该随意使用由 20 台服务器组成的集群。

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

典型的处理顺序是:

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

开始之前,您需要通过 ssh 访问主服务器上的所有从服务器。然后你可以将文件 scp 到每个 Slave,就像脚本一样。如果您在专用网络上运行,则不必太担心安全性,因此只需将 ssh 密码设置为简单的密码即可。

在 CPU 核心方面,如果您使用的命令行程序不是为多核设计的,您可以只对每个 Slave 运行几个 ssh 命令。最好的办法是运行一些测试,看看最佳进程数是多少,因为过多的进程可能会由于内存不足、磁盘访问或类似问题而变慢。但是假设您发现 12 个并发进程给出最快的平均时间,然后通过 ssh 同时运行 12 个脚本。

完成这一切并非易事,但是,您将永远能够在一小部分时间内完成处理。

关于linux - 体积图像数据的分布式处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36887710/

相关文章:

html - 使用 srcset 时如何强制加载低分辨率图像

php - 你如何在 PHP 中将图像转换为黑白图像

java - 图像未出现在 JFrame 中

hadoop - 无法启动 yarn 加工

linux - 递归遍历文件并接收文件信息

c++ - 如何将 XImage 保存为 PNG 格式的 base64 字符串?

python - 将 virtualenv 中的 Python 脚本打包成 Debian 包

hadoop - 关于集群异常的 Hive AvroSerde

hadoop - 如何以其他 Linux 用户身份提交 hadoop 作业

linux - 将除五个最新文件之外的所有文件移至新目录