在AWS竞价型实例上运行一批作业

时间:2020-08-04 12:23:14

标签: amazon-web-services amazon-ec2 aws-cli aws-batch

我有一批python作业,只不过它们正在读取的输入文件不同,例如:

python main.py --input=file1.json > log_file1.txt
python main.py --input=file2.json > log_file2.txt
python main.py --input=file3.json > log_file3.txt
...

所有这些作业都是独立的,并使用预先构建的anaconda环境。

我可以使用以下工作流在按需EC2实例上运行代码:

  • 使用输入文件和预构建的conda环境安装EBS卷。
  • 激活conda环境。
  • 运行python程序,以便每个程序读取不同的输入文件,并将其写入单独的日志文件。输入文件存储在EBS卷中,日志文件将写入EBS卷中。

现在,我想扩展它以使用AWS竞价型实例—基本上,如果我有N个作业,则请求N个运行上述作业之一的竞价型实例,每个实例均要从现有卷中读取不同的文件并写入输出到同一卷上的不同文件。但是我找不到关于如何执行此操作的全面指南。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

也许这会给您一些思考,因为我的解决方案与您的解决方案并不完全相同,但是可以。 (哦,我还要看一下批处理,只是还没到那儿)。我有不错的股票期权文件,可以分析和转换500个不同的交易品种。我使用了一些工具来计算最大文件的内存需求大约为4MB。我启动了一个至少有30 MB的竞价型实例,该实例来自我在ec2和ebs存储中制作的映像,因此它总是与我测试过的实例相同,只是内存更多。

我运行一个shell脚本,该脚本将500个左右的符号分解为6-10个不同的块,并在一台机器上同时运行它们。我不是时间敏感的,所以我实际上并不需要多台机器。但是我可以,我只需要运行其他脚本即可。

这是脚本:

for y in {0..500..50}
do
    start_slice=$(($y))
    end_slice=$(($y + 50))
 #   echo $low_limit
#    echo $high_limit

/usr/local/bin/pipenv run ~/.local/share/virtualenvs/ec2-user-zzkNbF-x/bin/python /home/ec2-user/code/etrade_getoptionsdata/get_bidask_of_baseline_combos_intraday_parallel.py -s $start_slice -e $end_slice &
# echo 'next file'
done

我的环境是pipenv,并放入了环境路径,因此它可以访问我的所有模块 再次,脚本只是将相同的分析分为50个符号

在我的文件中,我使用了一个for循环,该循环使用传入的参数-s和-e 用于keys_list [s:e]

中的key_cons

启动我一直在使用nohup ./shell.sh $的shell脚本,因此它在后台运行,并且在我的ssh会话结束时不会停止。

如果每个作业需要一个实例,那么就是这样。我进行的每个转换都需要30-45秒,因此仍然需要几个小时。

如果您有任何疑问,请告诉我。