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

时间:2013-03-11 08:52:12

标签: python hadoop qsub parallel-python starcluster

我是使用Startcluster / qsub / grid引擎来运行并行作业的新手,我尝试阅读其他几个相同的帖子。我仍然不确定如何为我的特定要求构建可扩展的解决方案。在继续讨论之前,我想先提一些建议。

以下是我的要求:

  1. 我有一个巨大的tar文件[~40 - 50 GB,最高可达100GB] ----->我在这里做的不多。我接受了一个巨大的单个tar文件作为输入。

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

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

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

  5. Tar文件-----并行解压缩--->未压缩文件-----并行处理--->每个文件处理5个输出文件

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

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

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

    4. 所以,我开始阅读并使用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

      先谢谢 Karthick

2 个答案:

答案 0 :(得分:0)

  1. I / O和数据共享。如果您的I / O很低,您可以将数据保留在主节点上并使用nfs在节点之间共享。如果您有很多I / O,我建议使用S3存储桶。

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

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

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

    • 我不知道你的聚合是如何完成的,所以我说不出来。
    • 我从未使用过hadoop,所以我也无法帮助那里。
    • 您无需使您的python脚本MPI可执行。
    • 如果您使用异构群集,那么您从一开始就知道每个节点上有多少核心可用。
    • 如果您定义一个具有32个核心的节点以具有4个插槽,那么您应该使您的作业最多使用8个核心。

答案 1 :(得分:0)

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

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

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

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

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