案例一

目的

计算并保存给定 csv 文件首列数据的平均值

案例相关文件

data.csv

操作步骤

  1. 准备文件:创建一个名为mydata的文件夹,并上传data.csv数据文件到该文件夹下
  2. 创建任务:创建一个计算任务,该任务读取/mydata/data.csv文件内容并进行计算,将计算结果(此案例中为平均值)写入到/mydata/result文件中,同时把整个处理日志记录在/mydata/log文件中
  3. 获取结果:任务结束后,下载result结果文件和log日志文件
  4. 清理工作:确认结果后,删除任务文件

1. 准备文件

1.1 创建一个名为mydata的文件夹

请求

# 注意请把 Authorization 对应的值替换成自己的 token
curl --request POST \
  --url 'http://matpool.com:30100/v1/fs?path=/mydata/' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

infos字段为mydata所在目录的内容,文件夹mydata已被成功创建

{
    "code":0,
    "msg":"",
    "infos":[
        {
            "name":"mydata",
            "size":0,
            "createTime":{
                "seconds":1562300853,
                "nanos":925948233
            },
            "modTime":{
                "seconds":1562300853,
                "nanos":925948233
            },
            "ownerId":0,
            "isDir":true
        }
    ]
}

异常情况

如果文件或文件夹mydata已存在,则返回

{
    "code":16,
    "msg":"create dir already exist"
}

1.2 上传data.csv文件到mydata文件夹中

请求

# 注意请把 Authorization 对应的值修改为自己的 token
curl --request POST \
  --url 'http://matpool.com:30100/v1/fs?path=/mydata/data.csv' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM' \
  --form file=@/home/huangzhiran/doc/data/Accident_Information.csv

返回

infos字段是mydata目录的内容,文件data.csv已被成功创建

{
    "code": 0,
    "msg": "",
    "infos": [
        {
            "name": "data.csv",
            "size": 705451630,
            "createTime": {
                "seconds": 1562302046,
                "nanos": 47628437
            },
            "modTime": {
                "seconds": 1562302046,
                "nanos": 47628437
            },
            "ownerId": 0,
            "isDir": false
        }
    ]
}

异常情况

如果data.csv文件已存在,再次上传同名文件时,新的文件会被重命名后保存,如下请求返回所示,文件被重命名为data_1562304273.csv

{
    "code":0,
    "msg":"",
    "infos":[
        {
            "name":"data.csv",
            "size":705451630,
            "createTime":{
                "seconds":1562302046,
                "nanos":47628437
            },
            "modTime":{
                "seconds":1562302046,
                "nanos":47628437
            },
            "ownerId":0,
            "isDir":false
        },
        {
            "name":"data_1562304273.csv",
            "size":705451630,
            "createTime":{
                "seconds":1562304279,
                "nanos":190850611
            },
            "modTime":{
                "seconds":1562304279,
                "nanos":190850611
            },
            "ownerId":0,
            "isDir":false
        }
    ]
}

2. 创建任务

2.1 创建 job

本案例中,计算 csv 文件平均值及统计行数的逻辑都写在了接口入参的 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' \
  # 此案例假设需要申请 10GB 的磁盘
  --form 'spec={"diskGB":10}' \
  # 此案例没有用到环境变量,仅作为样例参考
  --form 'envs="SS=ssss;ZZ=qqqqq"' \
  # 计算平均值以及统计行数逻辑作为接口 cmd 参数的值传入
  --form 'cmd="awk '\''{a+=$1}END{print a/NR}'\'' /mnt/mydata/data.csv > /mnt/mydata/result; wc /mnt/mydata/data.csv > /mnt/mydata/log;"' \
  --form app_name=ubuntu \
  --form app_version=18.04

返回

以下返回表明 job 已被成功创建, 由 job.state 里的内容可知 job 已完成初始化,当前处于排队中的状态

{
    "code":0,
    "msg":"",
    "job":{
        "id":525,
        "ctx":{
            "ownerId":1,
            "nodeId":-1
        },
        "state":{
            "status":1,
            "log":[
                {
                    "id":2574,
                    "status":6,
                    "ts":{
                        "seconds":1562317937
                    },
                    "sourceId":525
                },
                {
                    "id":2575,
                    "status":1,
                    "ts":{
                        "seconds":1562317937
                    },
                    "sourceId":525
                }
            ]
        },
        "status":1,
        "app":{
            "name":"ubuntu",
            "ver":"18.04",
            "envs":"SS=ssss;ZZ=qqqqq",
            "format":2,
            "files":{
                "mnt":"/mnt",
                "input":"",
                "output":"",
                "stdout":"",
                "stderr":""
            },
            "cmd":"awk '{a+=$1}END{print a/NR}' /mnt/mydata/data.csv > /mnt/mydata/result; wc /mnt/mydata/data.csv > /mnt/mydata/log;",
            "hostname":"",
            "creds":""
        },
        "res":{
            "cpus":0,
            "gpus":0,
            "diskGB":10
        },
        "createTime":{
            "seconds":1562317937
        }
    }
}

2.2 获取 job 状态

请求

# 注意请把 Authorization 对应的值修改为自己的 token
# 注意把jobID修改为自己创建的jobID
curl --request GET \
  --url 'http://matpool.com:30100/v1/job?id=525' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

由 job.state 可知 job 现已完成

{
    "code":0,
    "msg":"",
    "job":{
        "id":525,
        "ctx":{
            "ownerId":1,
            "nodeId":602
        },
        "state":{
            "status":4,
            "log":[
                {
                    "id":2574,
                    "status":6,
                    "ts":{
                        "seconds":1562317937
                    },
                    "sourceId":525
                },
                {
                    "id":2575,
                    "status":1,
                    "ts":{
                        "seconds":1562317937
                    },
                    "sourceId":525
                },
                {
                    "id":2576,
                    "status":2,
                    "ts":{
                        "seconds":1562317938
                    },
                    "sourceId":525
                },
                {
                    "id":2577,
                    "status":3,
                    "ts":{
                        "seconds":1562317958
                    },
                    "sourceId":525
                },
                {
                    "id":2578,
                    "status":4,
                    "ts":{
                        "seconds":1562317973
                    },
                    "sourceId":525
                }
            ]
        },
        "status":4,
        "app":{
            "name":"ubuntu",
            "ver":"18.04",
            "envs":"SS=ssss;ZZ=qqqqq",
            "format":2,
            "files":{
                "mnt":"/mnt",
                "input":"",
                "output":"",
                "stdout":"",
                "stderr":""
            },
            "cmd":"awk '{a+=$1}END{print a/NR}' /mnt/mydata/data.csv > /mnt/mydata/result; wc /mnt/mydata/data.csv > /mnt/mydata/log;",
            "hostname":"",
            "creds":""
        },
        "res":{
            "cpus":0,
            "gpus":0,
            "diskGB":10
        },
        "createTime":{
            "seconds":1562317937
        }
    }
}

3. 下载结果

3.1 下载 result 文件

请求

# 注意请把 Authorization 对应的值修改为自己的 token
curl --request GET \
  --url 'http://matpool.com:30100/v1/fs?path=/mydata/result' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

直接返回 result 文件的内容,即 data.csv 文件第一列数据的平均值

18388.8

3.2 下载 log 文件

请求

# 注意请把 Authorization 对应的值修改为自己的用户token
curl --request GET \
  --url 'http://matpool.com:30100/v1/fs?path=/mydata/log' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

直接返回 log 文件的内容,log 表明本次共处理了 1001 行数据

1001 1001 5648 /mnt/mydata/data.csv

4. 清理工作

4.1 删除 result 文件

请求

# 注意请把 Authorization 对应的值修改为自己的 token
curl --request DELETE \
  --url 'http://matpool.com:30100/v1/fs?path=/mydata/result' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

返回

infos字段为 result 文件所在目录的内容,result 文件已被删除

{
    "code":0,
    "msg":"",
    "infos":[
        {
            "name":"log.txt",
            "size":8228,
            "createTime":{
                "seconds":1562308473,
                "nanos":628218942
            },
            "modTime":{
                "seconds":1562308473,
                "nanos":628218942
            },
            "ownerId":0,
            "isDir":false
        },
        {
            "name":"data.csv",
            "size":705451630,
            "createTime":{
                "seconds":1562302046,
                "nanos":47628437
            },
            "modTime":{
                "seconds":1562302046,
                "nanos":47628437
            },
            "ownerId":0,
            "isDir":false
        },
        {
            "name":"data_1562304273.csv",
            "size":705451630,
            "createTime":{
                "seconds":1562304279,
                "nanos":190850611
            },
            "modTime":{
                "seconds":1562304279,
                "nanos":190850611
            },
            "ownerId":0,
            "isDir":false
        }
    ]
}

4.2 删除整个 mydata 文件夹

请求

# 注意请把 Authorization 对应的值修改为自己的 token
curl --request DELETE \
  --url 'http://matpool.com:30100/v1/fs?path=/mydata/' \
  --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjI3Mzk2MzYsIm9yaWdfaWF0IjoxNTYyMTM0ODM2LCJ1c2VyX2luZm8iOiJ7XCJpZFwiOjEsXCJtb2JpbGVcIjpcIjEzMDY3ODYwNjMwXCIsXCJlbWFpbFwiOlwiXCJ9In0.SBxMQ1jKa-rihAQXIAS3kVRGECAU-tFM1_EpDsASSeM'

异常

mydata文件夹中还有内容,不能删除

{
    "code":1,
    "msg":"directory not empty"
}

如上面删除 result 文件一般逐一把 mydata 文件夹中的文件都删除后,再次尝试删除文件夹

返回

infos字段为 mydata 文件夹所在目录的内容,可以看到父目录现在已经是一个空目录了

{
    {
        "code":0,
        "msg":"",
        "infos":[]
    }
}
上次修改: 2019-07-12 16:59