赞
踩
按照批处理任务实现方式的不同,批处理任务可以分为如下图的几种模式:
Job Template Expansion模式:一个Job对象对应一个待处理的Work item,有几个Work item就产生几个独立的Job,通常适合Work item数量少、每个Work item要处理的数据量比较大的场景。比如一个100GB的文件作为一个Work item,总共10个文件需要处理。
Queue with Pod Per Work Item模式:采用一个任务队列存放Work item,一个Job对象作为消费者去完成这些Work item,在这种模式下,Job会启动N个Pod,每个Pod对应一个Work item。
Queue with Variable Pod Count模式:采用一个任务队列存放Work item,一个Job对象作为消费者去完成这些Work item,但与上面的模式不同,Job启动的Pod数量是可变的。
Single Job with Static Work Assignment的模式,也是一个Job产生多个Pod的模式,但它采用程序静态方式分配任务项,而不是采用队列模式进行动态分配。
批处理任务的模式对比
模式名称 | 是否是一个Job | Pod的数量少于Work item | 用户程序是否要做相应的修改 | Kubernetes是否支持 |
---|---|---|---|---|
Job Template Expansion | / | / | 是 | 是 |
Queue with Pod Per Work Item | 是 | / | 有时候需要 | 是 |
Queue with Variable Pod Count | 是 | / | / | 是 |
Single Job with Static Work Assignment | 是 | / | 是 | / |
Kubernetes将Job分以下三种类型:
1.Non-parallel Jobs
2.Parallel Jobs with a fixed completion count
3.Parallel Jobs with a work queue
任务队列方式的并行Job需要一个独立的Queu,Work item都在一个Queue中存放,不能设置Job的.spec.completions参数,Job有以下特性。
如下所示的Job模版(文件名为job.yaml.txt)中的$ITEM可以作为任务项的标识:
apiVersion: batch/v1
kind: Job
metadata:
name: process-item-$ITEM
labels:
jobgroup: jobexample
spec:
template:
metadata:
name: jobexample
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: busybox
command: ["sh", "-c", "echo Processing item $ITEM && sleep 5"]
restartPolicy: Never
通过下面的操作,生成3个对应的Job定义文件并创建Job:
for i in apple banana cherry
do
cat job.yaml.txt | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml
done
ls jobs
job-apple.yaml job-banana.yaml job-cherry.yaml
kubectl create -f jobs
job "process-item-apple" created
job "process-item-banana" created
job "process-item-cherry" created
观察Job的运行情况
kubectl get jobs -l jobgroup=jobexample
NAME DESIRED SUCCESSFUL AGE
process-item-apple 1 1 4m
process-item-banana 1 1 4m
process-item-cherry 1 1 4m
在这种模式下需要一个任务队列存放Work item,比如RabbitMQ,客户端程序先把要处理的任务变成Work item放入到任务队列,然后编写Worker程序并打包镜像并定义成为Job中的Work Pod,Worker程序的实现逻辑是从任务队列中拉取一个Work item并处理,处理完成后即结束进程,如下图所示给出了并行度为2的一个Demo。
这种模式下,Worker程序需要知道队列中是否还有等待处理的Work item,如果有就取出来并处理,否则就认为所有工作完成并结束进程,所以任务队列通常要采用Redis或者数据库来实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。