Fre*_*son 2 queue message-queue amazon-ec2 amazon-web-services
我正在使用AWS EC2实例进行生物信息学工作.我有一个(~1000)个大文件,应该使用EC2实例上的脚本进行处理,结果应该上传回S3存储桶.我想将作业(文件)分发给多个EC2实例,优先以现货价格开始.
我需要的是一个简单易用的排队系统(可能是AWS SQS或其他东西),它可以将作业分配到实例并在实例失败时重新启动作业(由于现货价格过高或其他原因).我研究过AWS SQS示例,但这些示例过于先进,通常涉及自动扩展和复杂的消息生成应用程序.
有人能从概念上指出如何以最简单的方式解决这个问题吗?AWS SQS这个简单应用的任何示例?应该如何启动一堆实例以及如何告诉他们收听队列?
对于每个输入文件,我的工作流程基本上都是这样
aws s3 cp s3://mybucket/file localFile ## Possibly streaming the file without copy
work.py --input localFile --output outputFile
aws s3 cp outputFile s3://mybucket/output/outputFile
Run Code Online (Sandbox Code Playgroud)
Joh*_*ein 11
您正在描述一种非常常见的面向批处理的设计模式:
实现这一目标的最佳方法是:
而不是使排队系统"在实例失败时将作业分配给实例并重新启动作业",而SQS仅用于存储作业.Auto-Scaling将负责启动实例(包括重新启动是竞价变化),实例本身会从队列中提取工作.将其视为"拉动"模型而非"推动"模型.
虽然整个系统看起来很复杂,但每个单独的组件都非常简单.我建议一步一步:
aws sqs put-messageCLI 一样简单,也可以使用Boto(适用于Python的AWS开发工具包)在Python中添加几行代码.这是一些示例代码(在命令行上使用消息调用它):
#!/usr/bin/python27
import boto, boto.sqs
from boto.sqs.message import Message
from optparse import OptionParser
# Parse command line
parser = OptionParser()
(options, args) = parser.parse_args()
# Send to SQS
q_conn = boto.sqs.connect_to_region('ap-southeast-2')
q = q_conn.get_queue('my-queue')
m = Message()
m.set_body(args[0])
print q.write(m)
print args[0] + ' pushed to Queue'
Run Code Online (Sandbox Code Playgroud)
User Data在实例启动时使用该字段触发工作.从shell脚本运行工作流,或者也可以将S3上载/下载代码编写为Python应用程序的一部分(包括循环以继续提取新消息).这是从队列中检索消息的一些代码:
#!/usr/bin/python27
import boto, boto.sqs
from boto.sqs.message import Message
# Connect to Queue
q_conn = boto.sqs.connect_to_region('ap-southeast-2')
q = q_conn.get_queue('my-queue')
# Get a message
m = q.read(visibility_timeout=15)
if m == None:
print "No message!"
else:
print m.get_body()
q.delete_message(m)
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
3840 次 |
| 最近记录: |