如何动态扩展StarCluster/qsub/EC2以在多个节点上运行并行作业

1 投票
2 回答
1099 浏览
提问于 2025-04-17 18:39

我刚开始使用Startcluster/qsub/grid engine来运行并行任务,之前看了一些相关的帖子,但还是不太确定如何为我的具体需求构建一个可扩展的解决方案。在继续之前,我想再听听一些建议。

以下是我的需求:

  1. 我有一个很大的tar文件(大约40到50GB,最多可以达到100GB) -----> 这方面我没什么办法,只能接受这个大文件作为输入。

  2. 我需要解压和解压缩这个文件 -----> 我用命令tar xvf tarfilename.tar | parallel pbzip -d来解压和解压缩。

  3. 解压缩后的输出大约会有几十万个文件,差不多是500,000个文件。

  4. 这些解压后的文件需要处理。我有一个模块化的代码,可以逐个处理每个文件,并输出5个不同的文件。

大文件 -----并行解压缩---> 解压后的文件 -----并行处理 ---> 每个处理文件输出5个文件

  1. 我目前有一个并行的Python脚本,可以在16个核心和16GB内存的机器上处理这些解压后的文件。

  2. 问题是我该如何无缝扩展。例如,如果我的代码已经运行了10个小时,我想再加一台8核的机器,但在并行Python中我无法做到,因为我必须提前知道处理器的数量。

  3. 同时,当我动态添加更多节点到当前集群时,数据的访问和读写操作该如何处理呢?

所以,我开始阅读并进行一些关于starcluster和qsub的基本实验。虽然我看到可以通过qsub提交多个任务,但我该如何让它从解压后的输入文件夹中获取输入文件呢?

比如,我能否写一个script.sh脚本,在循环中逐个获取文件名并提交给qsub命令?有没有其他更有效的解决方案?

假设我有3台每台16个CPU的机器,如果我提交48个任务到队列,qsub会自动在集群的不同CPU上启动这些任务吗?还是我需要使用并行环境参数,比如-np orte命令来设置每个集群的CPU数量?我的Python脚本是否必须是MPI可执行的?

总结一下,我有几十万个文件作为输入,想把它们提交到多核机器的任务队列中。如果我动态添加更多机器,任务应该能自动分配。

另一个主要挑战是,我需要在最后将500,000个操作的所有输出汇总在一起。有没有建议如何在输出写入时汇总并行任务的输出?

我正在测试一些场景,但想知道是否有其他人也尝试过类似的情况。

有没有人建议使用Hadoop插件? http://star.mit.edu/cluster/docs/0.93.3/plugins/hadoop.html

提前谢谢你们! Karthick

2 个回答

0

经过一段时间对动态扩展的各种选项进行研究,我决定使用队列机制来把工作分配给多个工人。

工作管理器 - 负责读取输入,构建工作,然后把工作放进队列里。
SQS队列是用来管理这些工作的队列服务。
工人进程 - 监听队列并处理输出。

输入/输出驱动器是NFS,所有的服务器和客户端都可以访问。

为了实现动态扩展,只需在/exports中添加NFS客户端信息,然后重启服务器。活跃的客户端在它们各自的fstab文件中有rw,hard,intr的配置。通过在新客户端启动n个工人进程,可以增加更多的工人来处理工作。

到目前为止,这个方法很可靠,扩展效果也很好。我能够在3台机器上启动近90个工人,并在不到5小时的时间内处理20万个文件。之前,由于无法在多个节点之间分配数据和运行工人,处理同样的工作需要接近24小时。

0
  1. 输入输出和数据共享。如果你的输入输出量不大,可以把数据放在主节点上,然后用nfs(网络文件系统)在各个节点之间共享。如果你的输入输出量很大,我建议使用S3存储桶。

  2. 分发:用你的bash脚本来启动多个qsub是个不错的选择。你可以选择对一个文件或者几个文件同时进行处理。

  3. 扩展:把你在集群上运行的并行任务看作不同的工作。你可以选择在每个节点上运行一个或多个应用实例。例如,如果你使用的是cr1.8xlarge节点,它有32个核心。你可以选择在这里启动一个应用实例,使用全部32个核心,或者启动4个应用实例,每个使用8个核心。可以查看Open Grid Engine中每个节点的“插槽”配置。(如果你想把多个节点的核心组合起来运行一个大的应用实例,我没有尝试过,所以无法提供帮助。)然后,要添加一个节点,你可以使用StarCluster中的“addnode”命令。一旦节点启动,OGS会自动将任务分配到那里。你也可以使用StarCluster的负载均衡器来自动添加或移除节点。

所以,这里是我的建议: 1. 把你的文件提取到S3上。 2. 启动StarCluster。 3. 使用你的bash脚本,为每几个文件提交一个qsub任务(让一个任务处理10个文件可能比每个文件一个任务更高效)。 4. 你的应用需要与S3进行输入输出。 5. 当队列为空时,使用一个脚本检查结果,确保所有任务都顺利完成。如果有输出缺失,可以重新安排任务。

  • 我不知道你的聚合是怎么做的,所以无法提供帮助。
  • 我也没有使用过hadoop,所以这方面也帮不了你。
  • 你不需要让你的python脚本支持MPI。
  • 如果你使用的是异构集群,那么你一开始就知道每个节点上会有多少核心可用。
  • 如果你把一个32核心的节点定义为有4个插槽,那么你的任务每个最多应该使用8个核心。

撰写回答