1

我是使用 Startcluster/qsub/grid engine 来运行并行作业的新手,我尝试阅读其他一些相同的帖子。我仍然不确定如何为我的特定需求构建可扩展的解决方案。在继续之前,我想接受更多建议。

以下是我的要求:

  1. 我有一个巨大的 tar 文件 [~40 - 50 GB,它可以达到 100GB] -----> 我在这里无能为力。我接受了一个巨大的单个 tar 文件作为输入。

  2. 我必须解压并解压缩它----->我运行 tar xvf tarfilename.tar | 并行 pbzip -d 解压缩和解压缩相同。

  3. 这种解压缩的输出是几十万个文件,大约 500,000 个文件。

  4. 必须处理此未压缩文件。我有模块化代码,可以接收每个文件并处理它并输出 5 个不同的文件。

Tar File -----Parallel Uncompression---> Uncompressed Files -----Parallel Processing ---> 每个文件处理 5 个输出文件

  1. 我目前有一个在 16 核、16GB 内存上运行的并行 python 脚本,它接收这个未压缩文件列表并并行处理相同的文件。

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

  3. 同时,当我在当前集群中动态添加更多节点时,数据的可访问性和读写操作如何?

因此,我开始阅读并使用 starcluster 和 qsub 进行基本实验。虽然我看到我可以通过 qsub 提交多个作业,但我将如何使其从未压缩的输入文件夹中获取输入文件?

例如,我可以编写一个 script.sh 在 for 循环中一个一个地选择文件名并将其提交给 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

在此先感谢卡西克

4

2 回答 2

0

在研究了可用于动态扩展的各种选项一段时间后,我决定使用队列机制将作业分配给多个工作人员。

Job_Manager - 读取输入,构造作业,将作业添加到队列中 SQS 队列是队列服务 Worker 进程 - 侦听队列并处理输出。

输入/输出驱动器是 NFS 并且可供所有服务器/客户端使用。

要动态扩展,请在 /exports 中添加 NFS 客户端信息并重新启动服务器。活动客户端在其各自的 fstab 中有一个 rw,hard,intr 配置。通过在新客户端中启动 n 个工作进程,可以将更多工作人员添加到进程中。

到目前为止,它是可靠的并且可以很好地扩展。我能够在 3 台机器上启动近 90 名工作人员,并在不到 5 小时内处理 200,000 个文件。早些时候,这需要将近 24 小时才能完成,因为我无法在多个节点上分发数据和运行工作程序。

于 2013-03-23T04:49:18.430 回答
0
  1. I/O 和数据共享。如果您的 I/O 较低,您可以将数据留在主节点上并使用 nfs 在您的节点之间共享。如果您有大量 I/O,我建议您使用 S3 存储桶。

  2. 分发:启动多个 qsub 的 bash 脚本是正确的做法。您可以在单个文件上调用它,也可以一次在几个文件上调用它。

  3. 扩展:将集群上运行的并行作业视为不同的任务。您可以在每个节点上运行 1 个或多个应用程序实例。例如:如果您使用 cr1.8xlarge 节点,则您有 32 个核心。您可以使用 32 个内核启动 1 个应用程序实例,或使用 8 个内核启动 4 个应用程序实例。请参阅 Open Grid Engine 中每个节点的“槽”配置。(如果你更愿意运行一个结合多个节点核心的应用程序的大实例,我从来没有这样做过,所以我无法帮助你。)然后,要添加一个节点,你可以使用“addnode”来自 StarCluster 的命令。一旦节点启动,OGS 也会自动在那里分配作业。您还可以使用 StarCluster 负载均衡器自动添加/删除节点。

所以,这是我的建议。1. 将您的文件解压缩到 S3。2. 启动 StarCluster 3. 使用您的 bashscript,qsub 每隔几个文件执行一个作业(对于一个作业处理 10 个文件可能比处理每个单个文件的作业更有效) 4. 您的应用程序必须 I/O 到 s3 . 5. 当队列为空时,让脚本查看结果以确保所有作业都运行良好。当输出丢失时,您可以重新安排作业。

  • 我不知道您的聚合是如何完成的,所以我无法判断。
  • 我从来没有使用过hadoop,所以我也无能为力。
  • 您无需使您的 python 脚本 MPI 可执行。
  • 如果您使用异构集群,那么您从一开始就知道每个节点上有多少内核可用。
  • 如果您将具有 32 个核心的节点定义为具有 4 个插槽,那么您应该让您的作业每个最多使用 8 个核心。
于 2013-03-12T15:35:58.017 回答