案例二
目的
计算并保存文件夹内每个文件的 Hash
案例相关文件
操作步骤
- 创建任务:创建一个计算任务,同时上传任务依赖文件 (tar.gz格式),该任务遍历解压后的文件夹,计算每个文件的 Hash 并保存到
/result
文件中 - 获取结果:任务进行中,读取
result
结果文件;任务结束后,下载result
结果文件
1. 创建任务
1.1 创建 job
本案例中,计算文件 Hash 的逻辑都写在了接口入参的 cmd 参数中
请求
# 注意请把 Authorization 对应的值修改为自己的用户 token
curl --request POST \
--url 'http://matpool.com:30100/v1/job' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM' \
--header 'content-type: multipart/form-data' \
--form 'spec={"diskGB":10}' \
--form 'envs="SS=ssss;ZZ=qqqqq"' \
--form file_name=easy-rsa.tar.gz \
--form easy-rsa.tar.gz=@/home/huangzhiran/tmp/easy-rsa.tar.gz \
--form 'cmd="find . -type f -print0 | xargs -0 md5sum >> /mnt/result;"' \
--form app_name=ubuntu \
--form app_version=18.04
返回
以下返回表明 job 已被成功创建, 由 job.state 里的内容可知 job 已完成初始化,当前处于排队中的状态
{
"code":0,
"msg":"",
"job":{
"id":526,
"ctx":{
"ownerId":1,
"nodeId":-1
},
"state":{
"status":1,
"log":[
{
"id":2579,
"status":6,
"ts":{
"seconds":1562321532
},
"sourceId":526
},
{
"id":2580,
"status":1,
"ts":{
"seconds":1562321532
},
"sourceId":526
}
]
},
"status":1,
"app":{
"name":"ubuntu",
"ver":"18.04",
"envs":"SS=ssss;ZZ=qqqqq",
"format":2,
"files":{
"mnt":"/mnt",
"input":"input",
"output":"",
"stdout":"",
"stderr":""
},
"cmd":"find . -type f -print0 | xargs -0 md5sum >> /mnt/result;",
"hostname":"",
"creds":""
},
"res":{
"cpus":0,
"gpus":0,
"diskGB":10
},
"createTime":{
"seconds":1562321532
}
}
}
2. 获取结果
2.1 通过 job/file_content 接口获取 result 文件内容
header 中的 Range 字段指明了读取文件的范围
请求
# 注意请把 Authorization 对应的值修改为自己的用户 token
# 注意把 jobID 修改为自己创建的 jobID
curl --request GET \
--url 'http://matpool.com:30100/v1/job/file_content?id=526&path=/result' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM' \
--header 'Range: bytes=0-50'
返回
直接返回文件内容
46438b614dcb2175148fa7e0bdc604a4 ./root/.profile
2.2 获取 job 状态
请求
# 注意请把 Authorization 对应的值修改为自己的用户 token
# 注意把 jobID 修改为自己创建的 jobID
curl --request GET \
--url 'http://matpool.com:30100/v1/job?id=526' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'
返回
由 job.state 可知 job 现已完成
{
"code":0,
"msg":"",
"job":{
"id":526,
"ctx":{
"ownerId":1,
"nodeId":603
},
"state":{
"status":4,
"log":[
{
"id":2579,
"status":6,
"ts":{
"seconds":1562321532
},
"sourceId":526
},
{
"id":2580,
"status":1,
"ts":{
"seconds":1562321532
},
"sourceId":526
},
{
"id":2581,
"status":2,
"ts":{
"seconds":1562321533
},
"sourceId":526
},
{
"id":2582,
"status":3,
"ts":{
"seconds":1562321558
},
"sourceId":526
},
{
"id":2583,
"status":4,
"ts":{
"seconds":1562321950
},
"sourceId":526
}
]
},
"status":4,
"app":{
"name":"ubuntu",
"ver":"18.04",
"envs":"SS=ssss;ZZ=qqqqq",
"format":2,
"files":{
"mnt":"/mnt",
"input":"input",
"output":"",
"stdout":"",
"stderr":""
},
"cmd":"find . -type f -print0 | xargs -0 md5sum >> /mnt/result;",
"hostname":"",
"creds":""
},
"res":{
"cpus":0,
"gpus":0,
"diskGB":10
},
"createTime":{
"seconds":1562321532
}
}
}
2.3 通过 job/files 接口下载 result 文件
请求
# 注意请把 Authorization 对应的值修改为自己的用户 token
# 注意把 jobID 修改为自己创建的 jobID
curl --request GET \
--url 'http://matpool.com:30100/v1/job/files?id=526&src_path=/result&dest_name=result' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'
返回
直接返回文件内容
85ac22e89166668551f1897025221ecb ./proc/1/task/1/smaps
9b410a16ec5c6805b06122c2fa126a23 ./proc/1/task/1/smaps_rollup
f9b3a6e1dc0e5433359bde9b848b40a8 ./proc/1/task/1/pagemap
2.4 访问用户根目录
请求
# 注意请把 Authorization 对应的值修改为自己的用户 token
curl --request GET \
--url 'http://matpool.com:30100/v1/fs?path=/' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'
返回
由“1.1 创建 job”步骤的返回可知,该 job 的 id 是 526,相应地,在用户的根目录下有个名为 526 (对应 job id)的文件夹被自动创建
{
"code":0,
"msg":"",
"infos":[
{
"name":"526",
"size":270233,
"createTime":{
"seconds":1562321542,
"nanos":921790399
},
"modTime":{
"seconds":1562321542,
"nanos":921790399
},
"ownerId":0,
"isDir":true
}
]
}
2.5 访问job目录
查看 526 目录里的内容
请求
# 注意请把 Authorization 对应的值修改为自己的用户 token
curl --request GET \
--url 'http://matpool.com:30100/v1/fs?path=/526/' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'
返回
infos字段显示 526 目录下有一个文件夹 input 和一个文件 result,前者是创建 job 时上传的 *.tar.gz 压缩包解压路径,后者是 job 生成的 result 文件,之后可使用 fs
的 API 来管理这些文件
{
"code":0,
"msg":"",
"infos":[
{
"name":"input",
"size":15340,
"createTime":{
"seconds":1562321531,
"nanos":989803153
},
"modTime":{
"seconds":1562321531,
"nanos":989803153
},
"ownerId":0,
"isDir":true
},
{
"name":"result",
"size":254893,
"createTime":{
"seconds":1562321968,
"nanos":964071716
},
"modTime":{
"seconds":1562321968,
"nanos":964071716
},
"ownerId":0,
"isDir":false
}
]
}
← 计算平均数