准备工作 使用 BatchCompute-cli 命令行工具,您可以快速提交作业,可以很方便的管理作业和集群。
注意:本工具只在 python2.7, 3.4, 3.5 版本测试通过,其他python版本慎用。 提交作业 1. 提交作业 (1) 最简单的作业 如果您已经按照准备工作里的步骤配置了默认镜像、实例类型和网络类型,可以通过以下的简单命令提交一个作业。
bcs sub "echo 123" # 提交一个单任务作业,运行: echo 123 如果您没有对命令行工具进行过默认配置,需要在提交的时候指定更多的选项。
bcs sub "echo 123" -t ecs.sn1ne.large -i img-ubuntu-vpc --vpc_cidr_block 192.168.0.0/16 文档的其余示例假设您已经执行了默认的配置步骤。
(2) 提交一个python脚本作业 bcs sub "python test.py" -p ./test.py # -p 表示在作业提交前,将 test.py 打包到 worker.tar.gz,然后上传到OSS. (3) 提交一个目录(多文件)的作业 一般这种情况:src目录下有多个文件, 如:
src |-- test.py |-- dep.py 而 test.py 需要依赖dep.py, 则可以将整个目录一起打包
bcs sub "python test.py" -p ./src/ # 将src目录下的所有文件打包到 worker.tar.gz, 然后上传到OSS,再提交作业 当然,您也可以一次指定多个文件(逗号隔开):
cd src #进入 src 目录 bcs sub "python test.py" -p test.py,dep.py # 将这个2个文件打包到 worker.tar.gz 如果您没有进入src目录, 则需要这样提交:
bcs sub "python test.py" -p src/test.py,src/dep.py # 将这个2个文件打包到 worker.tar.gz 然后您可以使用命令查看worker.tar.gz的内容:
tar -tvf worker.tar.gz 应该是这样的:
test.py dep.py (4) 使用挂载任务程序的方式提交作业 如果我把 test.py 上传到 oss://mybucket/test/test.py,我可以把oss://mybucket/test/ 挂载到VM的本地目录如: /home/admin/test/, 然后我就可以使用 “python /home/admin/test/test.py” 命令运行了。
这么提交即可:
bcs sub "python /home/admin/test/test.py" -r oss://mybucket/test/:/home/admin/test/ 其中参数 -r oss://mybucket/test/:/home/admin/test/ ,表示只读挂载,将oss://mybucket/test/ 挂载到 /home/admin/test/.
这样就无需打包成 worker.tar.gz了。
更多提交作业的信息请用: bcs sub -h 查看帮助
bcs sub "python test.py" -p ./src/ -r oss://my-bucket/inputs/:/home/admin/inputs/ -r 表示只读挂载,将 oss目录oss://my-bucket/inputs/ 挂载到 /home/admin/inputs/, 你的程序可以向读取本地文件一样读取/home/admin/inputs/目录下面的文件 所有挂载的目录,不能是系统目录, 如: /bin, /usr等,建议挂载到/home/下面. 如要挂载多个目录,使用英文逗号隔开, 如: -r oss://my-bucket/inputs/:/home/admin/inputs/,oss://my-bucket/inputs2/:/home/admin/inputs2/ 如果是 Windows 镜像,可以使用下面的命令来挂载:
bcs sub "python test.py" -p ./src/ -r oss://my-bucket/inputs/:D (2) 程序运行结果使用挂载自动上传 我的程序会将运行的结果写到 /home/admin/outputs/ 目录下,我想把这个目录下面的所有数据上传到oss。
bcs sub "python test.py" -p ./src/ -r oss://my-bucket/inputs/:/home/admin/inputs/ -w oss://my-bucket/outputs/:/home/admin/outputs/ -w 表示可写挂载,写入到这个目录下的数据,将会在程序运行完后,由系统自动上传到对应的 oss 目录下。 所有挂载的目录,不能是系统目录, 如: /bin, /usr等,建议挂载到/home/下面. 如要挂载多个目录,使用英文逗号隔开, 如: -w oss://my-bucket/outputs/:/home/admin/outputs/,oss://my-bucket/outputs2/:/home/admin/outputs2/ (3) 使用自定义镜像和实例类型 bcs sub "python test.py" -p ./src/ -c img=img-ubuntu-vpc:type=ecs.sn1ne.large -c 表示使用集群,后面可以指定集群ID,也可以指定AutoCluster配置。 其中AutoCluster配置格式如:img=${ImageId}:type=${InstanceType}。
img=img-ubuntu-vpc 表示使用镜像,您也可以指定自定义镜像。
type=ecs.sn1ne.large 表示使用实例类型,可以用bcs it查看支持的实例类型列表。
可以只指定-c img=${ImageId} 或者只指定 -c type=${InstanceType}, 不指定则使用使用默认镜像和默认实例类型。
(4) 使用集群 bcs sub "python test.py" -p ./src/ -c cls-xxxxxxx -c cls-xxxxxxx 表示使用集群ID cls-xxxxxxx 更多请看如何使用集群.
(5) 使用Docker bcs sub "python test.py" -p ./src/ --docker myubuntu@oss://my-bucket/dockers/ myubuntu 是 localhost:5000/myubuntu 的简写, oss://my-bucket/dockers/ 表示oss docker 镜像仓库的路径。
有关如何使用Docker的详细信息请参考使用 docker。
(6) 自定义磁盘 bcs sub "python test.py" --disk system:cloud_efficiency:50,data:cloud_efficiency:200 只在使用AutoCluster时有效, 支持系统盘配置和一块数据盘(可选)的配置, 使用方法如: —disk system:cloud_efficiency:40,data:cloud_efficiency:50:/home/disk1, 中间用逗号隔开。也可以只指定系统盘,或只指定数据盘。如:—disk system:cloud_efficiency:40
默认只挂载一个系统盘,大小为40GB。
系统盘配置格式: system:< cloud_efficiency|cloud_ssd>:<40-500>, 举例: system:cloud_efficiency:40, 表示系统盘挂载40GB的高效云盘。
数据盘配置格式: data:< cloud_efficiency|cloud_ssd>:<5-2000>:,举例: data:cloud_ssd:50:/home/disk1, 表示挂载一个50GB的SSD云盘作为数据盘, Windows下只能挂载到驱动,如挂载到E盘: data:cloud_ssd:50:E.
注意:对于bcs开头的老专有实例,磁盘类型请使用ephemeral,数据盘大小的取值范围限制为:[5-1024]GB)。 查看作业
所有的命令都可以在后面加 -h 查看帮助, 如: bcs j -h 2. 查看作业详情 bcs j 1 # 查看列表中第1个作业详情 注意: 凡是使用序号代替ID的命令,都要在获取列表之后运行,因为获取列表后才缓存序号和ID的对应关系
jobdetail
当然,你也可以使用 bcs j job-00000000573590DB0000224F00000107,效果同 bcs j 1。 3. 查看任务详情 bcs j 1 1 # 查看作业的第1个任务详情 taskdetail
当然,你也可以使用 bcs j job-00000000573590DB0000224F00000107 task,效果同 bcs j 1 1。 4. 查看实例详情 bcs j 1 1 0 # 查看作业的第1个任务的instanceId为0的实例详情,和日志 instancedetail
当然,你也可以使用 bcs j job-00000000573590DB0000224F00000107 task 0,效果同 bcs j 1 1 0。 5. 查看作业日志 bcs log 1 # 查看作业日志 joblog
当然,你也可以使用 bcs log job-00000000573590DB0000224F00000107,效果同 bcs log 1。
多任务支持
[taskname] cmd=python test.py job_name=demo cluster=img=img-ubuntu:type=ecs.sn1.medium description=test job nodes=1 pack=./src/ read_mount=oss://bucket/input/:/home/input/ write_mount=oss://bucket/output/:/home/output/ 这个配置文件含有一个section: [taskname], 这个taskname将作为task名提交。 除了cmd 和 job_name 外,其他的选项, 都是通过 bcs sub -h 看到的长选项名称, 等同于使用命令—${option}。 2. 多任务支持 config 文件也可以配置多个任务,可以指定任务间依赖关系。
job.cfg 内容:
[DEFAULT] job_name=log-count description=demo force=True deps=split->count;count->merge #下面是任务公共配置 env=public_key:value,key2:value2 read_mount=oss://bucket/input/:/home/input/ write_mount=oss://bucket/output/:/home/output/ pack=./src/ [split] cmd=python split.py cluster=img=img-ubuntu:type=ecs.sn1.medium nodes=1 [count] cmd=python count.py cluster=img=img-ubuntu:type=ecs.sn1.medium nodes=3 [merge] cmd=python merge.py cluster=img=img-ubuntu:type=ecs.sn1.medium nodes=1 [DEFAULT] section中指定job级别的配置, 其他section指定task配置, 其他section名为task名 配置项优先级: 直接在命令行中的—${option}; 优先级最高,其次task section中指定的,最后是DEFAULT section中指定的。 env, read_mount, write_mount, mount 这4个配置项, 可merge, 其他配置项遇到高优先级直接被覆盖 deps=split->count;count->merge 指定依赖, split任务运行完成后,再运行count,count运行完成后,再运行merge. cluster配置用的img和type,不同region支持是不一样的,请根据当前region具体情况设置。 (1) 关于deps 如果DAG如下:
DAG
则deps配置:
deps=split->count1,count2;count1->merge;count2->merge 每个dep是一对多的形式: task1->task2,taks3
多个task之间用逗号隔开,多个dep用分号隔开。
(2) 关于 pack ./src/ |-- split.py |-- ... 如果指定目录:pack=./src/, 则打包src下面的所有文件到 worker.tar.gz, 指定cmd时,需要从 ./src/目录下开始指定,如: cmd=python split.py
如果指定文件: pack=./src/split.py, 则只打包文件到worker.tar.gz, 指定cmd时,只需要指定文件名, 如: cmd=python split.py
pack可以在[DEFAULT]这个section中配置,也可以在每个task中配置, 当然也可以在命令行中指定。
(3) 关于 mount read_mount 为只读挂载,将oss目录挂载到运行程序的虚拟机的文件系统中,linux可以挂载为一个目录,window下只能挂载为一个Driver,如:”E:”。
如果挂载多个,可以使用英文逗号隔开,如:read_mount=oss://bucket/input/:/home/input/,oss://bucket/input2/:/home/input2/。write_mount和mount也是如此。
write_mount 为可写挂载,将oss目录映射到运行程序的虚拟机的目录,只能映射为一个目录,如果这个目录不存在,需要程序创建一下。写入到这个目录的所有文件将会被上传到相应的oss目录。
mount可以用于 NAS 的挂载,比如:
mount=nas://xxxxxx-yyy50.cn-shenzhen.nas.aliyuncs.com:/:/home/mnt/:true vpc_id=vpc-xxxxxxxxxxyyyyyy vpc_cidr_block=192.168.0.0/16 注意:使用 NAS 时要指定 vpc_id 和 cidr_block。
这里mount信息中的 true/false 指的是是否支持可写。
(4) 关于cluster 有2种格式:
AutoCluster格式:
cluster=img= :type= AutoCluster指定任务运行时会自动创建相应配置的集群,运行完成后自动释放掉。
Cluster格式:
cluster= 运行:bcs c 可以查看我的集群,如果没有,可以自行创建。
如:
bcs cc -i -t -n 3 -n 3 表示期望启动3台虚拟机来运行程序 -i img-id 指定image ID -t instance-type 指定实例类型,可以使用 bcs it 查看可用的实例类型 其他选项可以使用 bcs cc -h 查看说明。 使用集群可以大大缩短作业启动时间,但是由于集群是一直运行着的,会一直计费,请自行权衡。
(5) 关于docker 格式如:
docker=myubuntu@oss://bucket/dockers/ 使用docker,需要支持docker的ImageId才能运行成功。如果你没有指定cluster,默认的imageId是支持Docker的,或者你显式指定也行,或者使用clusterId,但是这个cluster的ImageId也要支持docker才行。
这里的myubuntu全名为:localhost:5000/myubuntu,制作docker镜像的时候,前缀必须为localhost:5000/, 因此这里可以省略掉前缀。后面的oss目录,是OSS私有docker镜像仓库目录,详情请看如何使用docker。
(6) 关于nodes nodes 表示指定使用多少台虚拟机运行任务程序。
(7) 关于force force 为 True,表示如果某台虚拟机运行程序出错,整个作业不会失败,继续运行。为False,则整个作业失败。默认为False。
多实例并发 1. 说明: 本例子将启动一个作业(job),该作业包含一个任务(task), 该任务将启动2个instance,并行在2个VM中运行。
2个VM中运行的程序是一样的,都是任务sum中指定的命令”python sum.py”, 程序中使用环境变量中的 BATCH_COMPUTE_DAG_INSTANCE_ID 获取InstanceId, 用来区分Input数据。
InstanceId是从0开始递增的。
每个VM中任务程序处理完 ${InstanceId}-input.txt 数据后,将结果写入到 /home/outputs/${InstanceId}-output.txt 文件, 系统会自动上传到对应的oss目录:oss://your-bucket/sum/outputs/ 目录下。
当2个VM中的程序都运行完成后,任务结束,作业结束。
例子可以在这里下载。
0-input.txt的内容:
1 20 45 1-input.txt的内容:
5 85 103 将 0-input.txt和1-input.txt 上传到:
oss://your-bucket/sum/inputs/0-input.txt oss://your-bucket/sum/inputs/1-input.txt 可以使用下面的命令上传:
cd data bcs oss upload 0-input.txt oss://your-bucket/sum/inputs/ bcs oss upload 1-input.txt oss://your-bucket/sum/inputs/
bcs oss ls oss://your-bucket/sum/inputs/ 3. 启动任务 bcs sub --file job.cfg 4. 查看结果 结果数据在 oss://your-bucket/sum/outputs/中。
可以用下面的命令查看:
bcs o ls oss://your-bucket/sum/outputs/ bcs o cat oss://your-bucket/sum/outputs/0-output.txt bcs o cat oss://your-bucket/sum/outputs/1-output.txt
使用集群
使用默认的AutoCluster方式提交作业,作业等待时间可能较长。
而如果使用集群的方式,可以避免等待,大大缩短等待时间。
详细介绍,请看使用AutoCluster还是Cluster。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。