A go binaries for parrellel task.
parrellel task, 任务多线程工具
程序适用于有很多运行时间短,但是需要运行很多的脚本,有助于减少投递的脚本。 例如有1000个cat 命令需要执行,这些命令间没有依赖关系,每个cat命令运行在2min左右
- 在一个进程里并行的执行指定的命令行
- 并行的线程可指定
- 如果并行执行的其中某些子进程错误退出,再次执行此程序的命令可跳过成功完成的项只执行失败的子进程
- 所有并行执行的子进程相互独立,互不影响
- 如果并行执行的任意一个子进程退出码非0,最终parta 也是非0退出
- parta会统计成功运行子脚本数量以及运行失败子脚本数量输出到stdout,如果有运行失败的脚本会输出到parta的stderr
-i --infile Work.sh, same as qsub_sge's input format
-l --line Number of lines as a unit. Default: 1
-p --thred Thread process at same time. Default: 1
./parta -i input.sh -l 2 -p 2
标准错物流的输出:
[1 2 3 4 5]
All works: 5
Successed: 3
Error: 2
Err Shells:
2 /Volumes/RD/parrell_task/input.sh.shell/work_000002.sh
3 /Volumes/RD/parrell_task/input.sh.shell/work_000003.sh
运行产生的目录结构:
.
├── input.sh
├── input.sh.db
└── input.sh.shell
├── work_000001.sh
├── work_000001.sh.e
├── work_000001.sh.o
├── work_000001.sh.sign
├── work_000002.sh
├── work_000002.sh.e
├── work_000002.sh.o
├── work_000003.sh
├── work_000003.sh.e
├── work_000003.sh.o
├── work_000004.sh
├── work_000004.sh.e
├── work_000004.sh.o
├── work_000004.sh.sign
├── work_000005.sh
├── work_000005.sh.e
├── work_000005.sh.o
└── work_000005.sh.sign
-i 参数为一个shell脚本,例如input.sh这个shell脚本的内容示例如下
echo 1
echo 11
echo 2
sddf
echo 3
grep -h
echo 4
echo 44
echo 5
echo 6
依照-i参数的示例,一共有10行命令,比如我们想每2行作为1个单位并行的执行,那么-l参数设置为2
如果要对整个parta程序所在进程的资源做限制,可设置-p参数,指定最多同时并行多少个子进程
input.sh.db文件,此文件为sqlite数据库input.sh.shell目录,prefix即为-i参数的值,例如-i参数为work.sh,则产生work.sh,shell目录- 按照
-l参数切割的input.sh的子脚本,存放在input.sh.shell目录,以work_000作为子脚本的前缀,例如-l参数为3,则把input.sh从第一行命令开始,每3行写入到work_000前缀命名的子脚本中
./parta -i input.sh -l 2 -p 2
我们可以把以上命令写入到work.sh里,然后把work.sh投递到SGE或者K8s计算节点
parta会针对每一个输入脚本,在脚本所在目录生成脚本名称+.db的sqlite3数据库,用于记录各子脚本的运行状态,例如input.sh对应的数据库名称为input.sh.db
input.sh.db这个sqlite3数据库有1个名为job的table,job主要包含以下几列
0|Id|INTEGER|1||1
1|subJob_num|INTEGER|1||0
2|shellPath|TEXT|0||0
3|status|TEXT|0||0
4|exitCode|integer|0||0
5|retry|integer|0||0
6|starttime|datetime|0||0
7|endtime|datetime|0||0
- subJob_num 列表示记录的是第几个子脚本
- shellPath为对应子脚本路径
- status表示对应子脚本的状态,状态有4种: Pending Failed Running Finished
- exitCode为对应子脚本的退出码
- retry为如果子脚本出错的情况下parta程序自动重新尝试运行该出错子进程的次数(目前还未启用此功能)
- starttime为子脚本开始运行的时间
- endtime为子脚本结束运行的时间
例如示例所示input.sh中的第2个和第3个子脚本出错,那么待input.sh退出后,修正子脚本的命令行,再重新运行或者投递input.sh即可。在重新运行
work.sh时,parta会自动跳过已经成功完成的子脚本,只运行出错的子脚本。
alpine 镜像默认不带sqlite3,parta依赖于sqlite3,alpine需要更新,Dockerfile可以参考下面的
FROM alpine:latest
MAINTAINER Yuan Zan <seqyuan@gmail.com>
COPY ./parta /opt/
WORKDIR /opt
RUN apk update && apk add --no-cache \
ttf-dejavu sqlite bash && \
mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 && \
chmod +x parta
if [ -e /bin/sh ];then rm /bin/sh ; fi \
&& if [ -e /bin/bash ];then ln -s /bin/bash /bin/sh ; fi
ENV PATH /opt:$PATH:/bin
这样就能直接在docker容器内的命令行使用parta,而不必写绝对路径了
export version="v1.4.0" && git add -A && git commit -m $version && git push && git tag $version && git push origin $version