【问题标题】:Amazon SQS, Boto, and Python: Fetching and Running a Script on Amazon EC2Amazon SQS、Boto 和 Python:在 Amazon EC2 上获取和运行脚本
【发布时间】:2013-10-27 15:42:34
【问题描述】:

我正在尝试在 Amazon EC2 上运行一组 python 脚本。这个help guide 建议使用 Amazon SQS 来管理队列。从本指南中,我了解了如何启动 EC2 实例并将作业从我的计算机发送到队列,但我不明白如何设置 EC2 实例,以便它在从排队,然后将结果保存到 Amazon S3。如何获取、在 EC2 服务器上运行并将结果保存到 Python 脚本的 S3?

【问题讨论】:

    标签: python amazon-s3 amazon-ec2 boto


    【解决方案1】:

    在上述指南中,您可以找到指向 github repository 的链接以及示例代码。这是一个工作示例,回答您的问题。它有据可查,易于阅读。

    即,仔细查看pdf/tasks.py 源代码。简而言之,它使用ec2.run_instances 使用引导 bash 脚本启动 ec2 实例:

    • 使用apt-get 更新实例
    • 在循环中使用boto.connect_sqs 连接到SQS 并获取任务
    • 执行任务
    • 使用boto.connect_s3()连接S3并上传结果
    • 脚本完成时关闭实例。

    更新

    此外,CheckResponseQueueTask 是使用来自SQSCelery.PeriodicTask 定期出列消息并处理它们的一个很好的例子。请查看BOOTSTRAP_SCRIPT,源代码行 51-57,以获取说明上传到 S3 的结果的示例代码。 CheckQueueLevelsTask 说明了新实例引导和使用队列处理器引导,以防任务数量超过实例数量。第 214-244 行供参考。

    【讨论】:

    • 您的更新非常有帮助。我相信我现在了解了您链接到引导实例、从队列中检索任务并保存到 S3 的此脚本是如何进行的,但是新引导的实例在两者之间执行的任务在哪里?是第 160-173 行,只是将文件传输到特定的 S3 存储桶?如果我想在保存到 S3 之前添加一个额外的任务来执行,比如从队列中取出 x 并将 f(x) 的结果保存到 S3,我将如何/在哪里将它添加到代码中?
    • 您可能希望将链接中的代码复制到您的答案中并添加您的注释,以便在链接失效时您的答案不会失效。再次感谢您的所有帮助。
    • 所有在新实例上执行的代码都写在BOOTSTRAP_SCRIPT中。 这是bash 脚本! 魔术(数据处理)发生在subprocess.Popen 上,第 99-104 行。看到这个脚本是在循环(75)中使用python -c语法(21)运行的,当延迟10秒连续10次没有数据获取时,它结束(81),系统关闭(125) .参考刹车线号。
    • git上有18个fork,一个是我的;)代码很多,我觉得这里不适合全部复制。
    • 并且脚本使用魔术线 242 user_data=startup 运行,boto.ec2.run_instances 的参数。事实上,我不知道这个功能,并发现它很有用:)
    【解决方案2】:

    实现此目的的一种方法是在您的 EC2 实例上运行 Celery,该实例能够将 AWS SQS 用作开箱即用的任务代理。

    可以在此处找到有关使用 Celery 和 AWS SQS 的信息: http://docs.celeryproject.org/en/latest/getting-started/brokers/sqs.html

    Celery 还支持并发和多个工作线程。这意味着您可以让多个运行 Celery 的 EC2 实例监听一个 AWS SQS 队列,这些任务将自动在您的实例之间分配。

    【讨论】:

    • Celery 似乎有很大的帮助。然而,文档被分解为程序的每个小部分,我很难将它们拼凑在一起。您能否提供或指出从 Amazon SQS 获取的带注释的示例代码,使用来自 SQS/S3 的输入运行一个函数,然后将输出保存到 S3。理想情况下,代码还可以启动 EC2 实例。
    • 看上面提到的代码,celery 是用来运行异步任务的,github.com/paltman/django-pdf/blob/master/pdf/tasks.py。其实CheckResponseQueueTask是一个周期性消息出队和处理的示例代码。相应地更新了我的答案
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多