Docker支持
介绍https://help.aliyun.com/document_detail/batchcompute/user-guide/v20150630/docker.html
BatchCompute v20150630支持Docker镜像了。
您可以自定义制作一个Docker镜像,上传到阿里云OSS, 然后您可以指定您的作业的任务在这个镜像中运行。
1. BatchCompute对Docker支持的原理
这里要和普通VM支持对比说明一下:
(1)先说使用普通VM, 用户提交作业,每个作业可以有多个任务,每个任务指定一个镜像(支持linux 和 window), 系统运行这个任务时,会根据指定的镜像启动VM, 用户任务将运行在这个VM上。任务完成后结果会被上传到指定的OSS目录,VM销毁。然后执行下一个任务。
(2)使用Docker:每个任务也可以指定使用一个Docker容器镜像来运行。 运行task时,会先启动一个VM运行支持Docker的系统镜像(如:支持Docker的ubuntu), 然后会从OSS上下载你指定的Docker镜像,在这个VM中启动起来,用户的任务将运行在这个Docker容器内。 任务完成后结果上传到指定的OSS目录,VM销毁。然后执行下一个任务。
目前一个VM,只支持运行一个Docker镜像。
# 使用VM:
---
|-- job
|-- task
|-- VM (用户指定的VM,支持windows和linux)
|-- program (用户程序)
# 使用Docker模式:
---
|-- job
|-- task
|-- VM (支持docker的ubuntu)
|-- Docker-Container(用户指定的Docker的容器镜像)
|-- program (用户程序)
快速开始
1. 创建阿里云账号
登陆阿里云官网,点左上角“注册”创建阿里云账号。
2. 开通BatchCompute
使用注册成功的阿里云账号登陆,点左上角“产品”,在“大规模计算”中找到批量计算(BatchCompute)进入产品主页,开通BatchCompute服务。
3. 获取 AccessKeyId 和 AccessKeySecret
进入AK控制台 获取 AccessKeySecret:
-
找到启用状态的 AccessKeyId 点击显示,即可获取对应的 AccessKeySecret。
-
如果没有可用的 AccessKeyId 可点击右上角的"创建 Access Key"按钮,创建成功后,系统会生成一对 AccessKeyId 和 AccessKeySecret。
4. 下载 OSS SDK
由于 BatchCompute 使用 OSS 作为存储,请花 10 分钟时间了解 OSS。下载您的开发语言对应的 OSS SDK
5. 创建 OSS Bucket
方法如下:
登录阿里云首页->开放存储服务 OSS -> 管理控制台 -> 新建Bucket
- 本例中我们创建的 OSS Bucket 为 your-bucket,如要运行本例子,您需要在OSS中创建自己的bucket。
具体请参考OSS文档
6. 理解基本概念
为更好的继续下面的操作,首先简单理解BatchCompute中的几个核心概念。
7. 安装Docker
(1) 在 Ubuntu 上安装
sudo apt-get update #更新软件源
sudo apt-get install docker.io #安装docker
#检查是否成功
sudo docker ps
(2) 在 window/Mac 上安装
从官网下载docker toolbox:
https://www.docker.com/docker-toolbox
安装完成后会有2个快捷方式:
Kitematic: 用来管理docker container的图形化界面
Docker Quickstart Terminal: 可以快速启动 docker 命令行界面。
8. 制作Docker镜像
本例中我们将制作一个 ubuntu 镜像,内置python。镜像名称:myubuntu。
新建一个目录 dockerUbuntu,结构如下:
dockerUbuntu
|-- Dockerfile
文件 Dockerfile 的内容:
FROM ubuntu:14.04
# 这里要替换 your_name 为您的名字, 和your_email 为您的Email
MAINTAINER your_name <your_email>
# 更新源
RUN apt-get update
# 安装python
RUN apt-get install -y python
# 安装jdk (如果需要jdk,请去掉下面的注释)
# RUN apt-get install -y openjdk-7-jdk
# 启动时运行这个命令
CMD ["/bin/bash"]
运行以下命令,build镜像:
cd dockerUbuntu #进入 dockerUbuntu 目录
docker build -t myubuntu ./ #正式build, 命名为 myubuntu
- 注意:docker 命令在ubuntu中默认需要加sudo才能运行, 而在Mac/Windows中,需要从“Docker Quickstart Terminal”中启动的命令行工具中运行。
build 完成后, 运行以下命令查看:
docker images
- 注意:在制作镜像时,推荐使用ubuntu:14.04作为基础镜像,因为我们的支持Docker的VM镜像中 已经安装了ubuntu:14.04 docker镜像,这样做可以减少下载成本。
9. 镜像上传到OSS
(1) 安装 OSS Docker registry
使用BatchCompute Docker服务,需要将制作的Docker镜像上传到OSS。
假设您想要将docker存储到oss的目录路径为:
oss://your-bucket/dockers/
我们先安装一个将OSS作为Docker registry(私服)的工具, 这个工具本身也是一个Docker镜像,将OSS映射成一个Docker私服。
安装方法一 (Mac/windows) :
打开Kitematic, 可以直接搜索到registry-oss, 安装完成后,配置一下即可。
如果没有看到STORAGE_PATH 这一项配置,请手动加上。本例子中其值为:dockers
安装方法二:
用以下命令安装运行:
docker run -e OSS_HOST={your_host}
-e OSS_BUCKET=your-bucket
-e STORAGE_PATH=dockers
-e OSS_KEY={your_access_key_id}
-e OSS_SECRET={your_access_key_secret}
-p 5000:5000
-d denverdino/registry-oss:0.9.1
其中的变量需要替换:
参数 | 描述 |
---|---|
your_host | 您的 oss host |
your_access_key_id | 您的 access key id |
your_access_key_secret | 您的 access key secret |
举例(假设我们使用深圳region):
docker run -e OSS_HOST=oss-cn-shenzhen.aliyuncs.com -e OSS_BUCKET=your-bucket -e STORAGE_PATH=dockers -e OSS_KEY=6s8hwj27hshwwushsjwi8 -e OSS_SECRET=k66****2us -p 5000:5000 -d denverdino/registry-oss:0.9.1
- 注意:这里OSS_HOST使用 oss-cn-shenzhen.aliyuncs.com,表示使用深圳region的OSS,而后面提交作业也需要提交到相应的region才能正常工作。
完成后,可以运行以下命令查看:
docker ps #查看运行的container
如果成功安装,可以看到denverdino/registry-oss。
(2) 运行下面命令,将镜像上传到 OSS:
docker tag myubuntu localhost:5000/myubuntu
docker push localhost:5000/myubuntu
注意:
- 要用 localhost:5000/ 作为前缀,用其他的字符串上传不了。 5000 端口是第(1)步中 -p 5000:5000 中(冒号前的5000)指定的。
- 您制作的镜像名称为 localhost:5000/myubuntu,而不是 myubuntu。
可以使用下面的命令检验是否上传成功:
docker pull localhost:5000/myubuntu
或者直接使用OSS控制台查看是否有这个目录: oss://your-bucket/dockers/repositories/library/myubuntu/
10. 作业准备
本作业采用 Python 语言编写,目的是找出给定三份数据里的所有质数并进行排序输出。
该作业包含两个任务: Find 任务和 Sort 任 务。其中,Find 任务会并行运行 3 个实例,每个实例寻找一份数据文件中的质数,然后将结果存到 OSS 中。Sort 任务只有一个实例,即从 OSS 中读出 Find 任务寻找出来的质数并进行排序, 最后再输出到 OSS 中。
(1) 存储输入文件
本作业需输入三份数据文件下载:data.tar,解压后,本别上传到OSS, 路径如下:
oss://your-bucket/find-prime/input-data-0.txt
oss://your-bucket/find-prime/input-data-1.txt
oss://your-bucket/find-prime/input-data-2.txt
- your-bucket如上文所示创建,如要运行本例子, 请改成您自己在OSS上创建的bucket,并创建自己的OSS路径,并且把三份数据文件上传至您自己创建的bucket的路径下。如何上传到OSS,请参考OSS文档。
(2) 编写作业任务
Find 任务和 Sort 任务的 Python 代码下载:find_sort.tar.gz
- 如要运行本例子,请按照上文所述创建的您的bucket路径,填入以下参数:
Find.py
ACCESS_KEY_ID: AccessKeyId可以由上文所述获取
ACCESS_KEY_SECRET: AccessKeySecret可以由上文所述获取
BUCKET: 存储输入输出文件的bucket(注意:不包含"oss://")
FIND_INPUT_PATH: 输入文件在bucket下的路径
FIND_OUTPUT_PATH: 输出文件在bucket下的路径
Sort.py
ACCESS_KEY_ID: AccessKeyId可以由上文所述获取
ACCESS_KEY_SECRET: AccessKeySecret可以由上文所述获取
BUCKET: 存储输入输出文件的bucket(注意:不包含"oss://")
SORT_INPUT_PATH: 输入文件在bucket下的路径
SORT_OUTPUT_PATH: 输出文件在bucket下的路径
- BatchCompute为任务程序提供的环境变量: 环境变量说明
(3) 本地调试
如果你想要使用Docker镜像本地调试一下程序, 可以根据本节内容操作,如果不需要本地调试,请跳过本节。
任务程序可以使用的变量说明
在 BatchCompute 中,运行在 docker 容器中的环境和不使用 docker 容器时的环境变量相同。 请注意以下几个环境变量:
环境变量 | 值 |
---|---|
USER | admin |
PWD | /home/admin |
HOME | /home/admin |
ALI_BATCHCOMPUTE_INSTANCE_ID | 实例ID,视实际情况而定 |
ALI_BATCHCOMPUTE_TASK_ID | 任务名称,视实际情况而定 |
ALI_BATCHCOMPUTE_JOB_ID | 作业ID,视实际情况而定 |
ALI_BATCHCOMPUTE_JOB_NAME | 作业名称,视实际情况而定 |
ALI_BATCHCOMPUTE_OSS_HOST | OSS host,视实际情况而定 |
本地测试命令
在制作完成 docker 镜像后,您可以使用如下的命令进行本地测试。
docker run -it -v /home/local_folder:/home/admin/worker
-e USER=admin
-e HOME=/home/admin
-e ALI_BATCHCOMPUTE_INSTANCE_ID=<your_instance_id>
-e ALI_BATCHCOMPUTE_TASK_ID=<your_task_name>
-e ALI_BATCHCOMPUTE_JOB_ID=job-0000000000
-e ALI_BATCHCOMPUTE_JOB_NAME=<your_job_name>
-e ALI_BATCHCOMPUTE_OSS_HOST=<your_oss_host>
your_docker_image_name your_command
其中
-v /home/local_folder:/home/admin/worker 表示挂载本地/home/local_folder目录到 docker容器镜像中的 /home/admin/worker 目录
-e key=value 表示指定环境变量
your_task_name 作业中 task 的名称
your_job_name: 作业的名称
your_instance_id: 任务实例ID,从0开始递增的整数, 如这个任务你要启动3个实例来运行,则id分别为0,1,2
your_oss_host: OSS主机名(域名,应包含region信息,且不带"http://"前缀)
your_docker_image_name: 您制作的 docker 镜像名称,如 myubuntu
your_command:命令行及参数
举例:
docker run -it -v /home/local_folder:/home/admin/worker -e USER=admin -e HOME=/home/admin -e ALI_BATCHCOMPUTE_INSTANCE_ID=0 -e ALI_BATCHCOMPUTE_TASK_ID=Find -e ALI_BATCHCOMPUTE_JOB_ID=job-0000000000 -e ALI_BATCHCOMPUTE_JOB_NAME=myJob1 -e ALI_BATCHCOMPUTE_OSS_HOST=oss-cn-shenzhen.aliyuncs.com myubuntu python /home/admin/Find.py
这个命令是在本地运行 myubuntu这个docker镜像, 将本地目录/home/local_folder/挂载到docker镜像的/home/admin/worker/目录, 并在这个镜像里运行python /home/admin/worker/Find.py命令。
注意:
- 本地的/home/local_folder目录是程序所在目录, 目录中应当有Find.py。
- ALI_BATCHCOMPUTE_INSTANCE_ID 从0开始,假如你配置该任务启动3个实例, 则ALI_BATCHCOMPUTE_INSTANCE_ID 分别为0,1,2。
- 其中Find.py是你的任务程序,任务程序详细请参看快速开始中的"编写作业任务"一节。
- 如果Find.py中有读取OSS的操作是会产生费用的,如果不想产生费用,建议调试时注释掉OSS操作的代码。
(4) 打包上传
将编写完成的 Find.py、Sort.py 和准备好的 OSS 的 Python SDK 开发包 中的.py子文件打成一个压缩包, 目录结构:
src
|-- Find.py
|-- Sort.py
|-- oss
|-- __init__.py
|-- oss_api.py
|-- oss_fs.py
|-- oss_sample.py
|-- oss_util.py
|-- oss_xml_handler.py
|-- pkg_info.py
打包命令如下:
> cd src
> tar -czf worker.tar.gz *
运行以下命令,查看内容是否正确:
> tar -tvf worker.tar.gz
Find.py
oss
Sort.py
oss/__init__.py
oss/oss_api.py
oss/oss_sample.py
oss/oss_util.py
oss/oss_xml_handler.py
oss/pkg_info.py
- 注意:BatchCompute 只支持以 tar.gz 为后缀的压缩包,请注意务必用以上方式(gzip)打包, 否则将会无法解析。
本例将 worker.tar.gz 上传到 OSS 的 your-bucket 中, object 名字为
find-prime/worker.tar.gz
- 如要运行本例子,您需要创建自己的bucket, 并且把worker.tar.gz文件上传至您自己创建的bucket的路径下。
OSS 全路径为
oss://your-bucket/find-prime/worker.tar.gz
11. 使用控制台提交作业
(1)Docker 特殊字段说明
本地测试通过后,您可以向 BatchCompute 提交作业了。
在 BatchCompute 中, 提交作业时使用 docker 与普通作业相同, 您只需要在作业描述的 ImageId 指定为 BatchCompute 的公共镜像的Id(支持Docker的镜像),并且在task描述的环境变量(EnvironmentVariables)中 增加如下两个参数:
字段名称 | 描述 | 是否可选 |
---|---|---|
BATCH_COMPUTE_DOCKER_IMAGE | Docker镜像名称 | 可选 |
BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH | Docker镜像在 OSS-Registry 中的存储路径 | 可选 |
- 如果没有 BATCH_COMPUTE_DOCKER_IMAGE 参数,表示不使用 docker ,这时 BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH 将被忽略。
- 如果有 BATCH_COMPUTE_DOCKER_IMAGE,则表示使用 docker。
(2) 提交作业
然后点击左侧导航栏“提交作业”进行作业提交。注意这里选择深圳region。
如果需要运行本例子,请把 PackageUri (作业打包上传的OSS路径,本例子中为 worker.tar.gz)、StdoutRedirectPath、StderrRedirectPath(任务结果和错误的输出地址),修改成与上文对应的您的OSS路径。
- 注意:深圳支持Docker的镜像的ImageId 为 img-00000000561CB0FE000061CC00000411
作业JSON模板如下,具体参数含义请参照这里。
{
"JobName": "docker_demo",
"JobTag": "BatchCompute",
"Priority": 0,
"TaskDag": {
"TaskDescMap": {
"Find": {
"PackageUri": "oss://your-bucket/find-prime/worker.tar.gz",
"ProgramName": "Find.py",
"ProgramType": "python",
"StdoutRedirectPath": "oss://your-bucket/find-prime/logs",
"StderrRedirectPath": "oss://your-bucket/find-prime/logs",
"ImageId": "img-00000000561CB0FE000061CC00000411",
"Timeout": 1000,
"InstanceCount": 3,
"EnvironmentVariables": {
"BATCH_COMPUTE_DOCKER_IMAGE": "localhost:5000/myubuntu",
"BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH": "oss://your-bucket/dockers"
},
"ResourceDescription": {
"Cpu": 800,
"Memory": 2000
},
"OssMappingLock": false
},
"Sort": {
"PackageUri": "oss://your-bucket/find-prime/worker.tar.gz",
"ProgramName": "Sort.py",
"ProgramType": "python",
"StdoutRedirectPath": "oss://your-bucket/find-prime/logs",
"StderrRedirectPath": "oss://your-bucket/find-prime/logs",
"ImageId": "img-00000000561CB0FE000061CC00000411",
"Timeout": 1000,
"InstanceCount": 1,
"EnvironmentVariables": {
"BATCH_COMPUTE_DOCKER_IMAGE": "localhost:5000/myubuntu",
"BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH": "oss://your-bucket/dockers"
},
"ResourceDescription": {
"Cpu": 800,
"Memory": 2000
}
}
},
"Dependencies": {
"Find": [
"Sort"
]
}
}
}
- 注意:这个json中的oss路径只是举例使用,提交作业时请根据实际情况修改。
确定各个参数及路径填写正确后,点击左下角的“提交作业”,并确认。
12. 查询作业状态
提交作业后,页面将会自动跳转至控制台作业列表,列表第一列将会显示最新提交成功的作业。