
# 应用示例
本节通过cURL调用CDM API，迁移本地MySQL数据库中的数据到云上服务DWS为例，介绍使用CDM API的基本流程。
1. [获取token]
   获取用户的token，因为在后续的请求中需要将token放到请求消息头中作为认证。
   
2. [创建CDM集群]
   - 如果您已经创建过CDM集群，可以跳过该步骤，直接使用已创建的集群ID。
   
   - 如果您需要使用新的集群执行迁移任务，调用[创建集群](https://support.huaweicloud.com/api-cdm/CreateCluster.html)API创建。
    
3. [创建连接]
   调用[创建连接](https://support.huaweicloud.com/api-cdm/CreateLink.html)API创建MySQL连接和DWS连接。
   
4. [创建迁移作业]
   调用[指定集群创建作业](https://support.huaweicloud.com/api-cdm/CreateJob.html)API创建MySQL到DWS的迁移作业。
   
5. [查看作业结果]
   调用[启动作业](https://support.huaweicloud.com/api-cdm/StartJob.html)API开始执行作业。
   
 
#### 准备数据
在调用API之前，您需要准备如下数据。
表1准备数据 
| 数据项      | 名称           | 说明                                                                                                                                                               | 样例                                   |
|:---|:---|:---|:---|
| 云账户信息    | 项目名          | CDM所属的项目名。                                                                                                                                                       | Project Name                         |
| 云账户信息    | 项目ID         | CDM所属的项目ID。                                                                                                                                                      | 1551c7f6c808414d8e9f3c514a170f2e     |
| 云账户信息    | 账号名          | 用户所属的企业账户名称。                                                                                                                                                     | Account Name                         |
| 云账户信息    | 用户名          | 使用云服务的用户名，该用户需要拥有CDM的操作权限。                                                                                                                                       | Username                             |
| 云账户信息    | 密码           | 用户密码。                                                                                                                                                            | password                             |
| VPC信息    | VPC的ID       | CDM所属的VPC必须与DWS一致。                                                                                                                                               | 6b47302a-bf79-4b20-bf7a-80987408e196 |
| VPC信息    | 子网ID         | CDM所属的子网必须与DWS一致。                                                                                                                                                | 63bdc3cb-a4e7-486f-82ee-d9bf208c8f8c |
| VPC信息    | 安全组ID        | CDM所属的安全组必须与DWS一致。                                                                                                                                               | 005af77a-cce5-45ac-99c7-2ea50ea8addf |
| Endpoint | IAM的Endpoint | 终端节点（Endpoint）即调用API的**请求地址** ，不同服务不同区域的终端节点不同。Endpoint您可以从[终端节点及区域说明](https://console.huaweicloud.com/apiexplorer/#/endpoint)获取。                                | iam_endpoint                         |
| Endpoint | CDM的Endpoint | 终端节点（Endpoint）即调用API的**请求地址** ，不同服务不同区域的终端节点不同。本服务的Endpoint您可以从[终端节点Endpoint](https://support.huaweicloud.com/api-dataartsstudio/dataartsstudio_02_0004.html)获取。 | cdm_endpoint                         |
| MySQL数据库 | IP地址         | 本地的MySQL数据库的IP地址，且该地址允许CDM通过公网IP访问。                                                                                                                              | 1xx.120.85.24                        |
| MySQL数据库 | 端口           | MySQL数据库的端口。                                                                                                                                                     | 3306                                 |
| MySQL数据库 | 数据库名称        | 待导出数据的MySQL数据库名称。                                                                                                                                                | DB_name                              |
| MySQL数据库 | 用户名          | 访问MySQL数据库的用户，该用户拥有MySQL数据库的读、写和删除权限。                                                                                                                            | username                             |
| MySQL数据库 | 密码           | 访问MySQL数据库的用户密码。                                                                                                                                                 | DB_password                          |
| DWS数据库   | IP地址         | DWS数据库的IP地址，CDM可通过内网访问该地址。                                                                                                                                       | 10.120.85.24                         |
| DWS数据库   | 端口           | DWS数据库的端口。                                                                                                                                                       | 3306                                 |
| DWS数据库   | 数据库名称        | 待写入数据的DWS数据库名称。                                                                                                                                                  | DWS                                  |
| DWS数据库   | 用户名          | 访问DWS数据库的用户，该用户拥有DWS数据库的读、写和删除权限。                                                                                                                                | user_dws                             |
| DWS数据库   | 密码           | 访问DWS数据库的用户密码。                                                                                                                                                   | dws_password                         |
   
 #### 获取token
1. 调用其他API前，需要获取token，并设置成环境变量。
   ```
   curl -H "Content-Type:application/json" https://{iam_endpoint}/v3/auth/tokens -X POST -d '
   {
       "auth": {
           "identity": {
               "methods": [
                   "password"
               ],
               "password": {
                   "user": {
                       "name": "Username",
                       "password": "password",
                       "domain": {
                           "name": "Account Name"
                       }
                   }
               }
           },
           "scope": {
               "project": {
                   "id": "1551c7f6c808414d8e9f3c514a170f2e"
               }
           }
       }
   }
   ' -v -k
   ```
   响应Header中"X-Subject-Token"的值即为Token：
   ```
   X-Subject-Token:MIIDkgYJKoZIhvcNAQcCoIIDgzCCA38CAQExDTALBglghkgBZQMEAgEwgXXXXX...
   ```
   
2. 使用如下命令将token设置为环境变量，方便后续事项。
   ```
   export Token = MIIDkgYJKoZIhvcNAQcCoIIDgzCCA38CAQExDTALBglghkgBZQMEAgEwgXXXXX...
   ```
   
 
 #### 创建CDM集群
1. 调用[创建集群](https://support.huaweicloud.com/api-cdm/CreateCluster.html)API创建集群，假设集群详情如下：
   - 集群名称为"cdm-ab82"。
   
   - 集群规格为"cdm.medium"。
   
   - VPC、子网、安全组与DWS一致，且自动绑定弹性IP。
   
   
   如果返回状态码为200，则说明创建命令执行成功。
   ```
   curl -X POST -H 'Content-Type:application/json;charset=utf-8' -H "X-Auth-Token:$Token" -d '
   {
     "cluster": {
       "name": "cdm-ab82",
       "vpcId": "6b47302a-bf79-4b20-bf7a-80987408e196", 
       "instances": [{
               "flavorRef": "fb8fe666-6734-4b11-bc6c-43d11db3c745",
               "nics": [{
                   "net-id": "63bdc3cb-a4e7-486f-82ee-d9bf208c8f8c",
                   "securityGroupId": "005af77a-cce5-45ac-99c7-2ea50ea8addf"
               }],
               "availability_zone": "Project Name",
               "type": "cdm"
           }],
       "datastore": {
               "version": "1.8.5",
               "type": "cdm"
           },
       "isScheduleBootOff": false,
       "scheduleBootTime": "null",
       "scheduleOffTime": "null",
       "isAutoOff": false,
       "sys_tags": [{
               "key": "_sys_enterprise_project_id",
               "value": "1ce45885-4033-40d2-bdde-d4dbaceb387d"
           }]
       },
     "autoRemind": false,
     "phoneNum": "null",
     "email": "null"
   }' 
   https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters -v -k
   ```
   
2. 调用[查询集群列表](https://support.huaweicloud.com/api-cdm/ListClusters.html)查询集群信息，获取集群的ID，并设置为全局变量。
   ```
   curl -X GET -H 'Content-Type:application/json;charset=utf-8' -H "X-Auth-Token:$Token" https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters -k -v
   ```
   获取响应如下所示。
   ```
   {
     "clusters": [{
       "version": "x.x.x",
       "updated": "2018-09-05T08:38:25",
       "name": "cdm-ab82",
       "created": "2018-09-05T08:38:25",
       "id": "bae65496-643e-47ca-84af-948672de7eeb",
       "status": "200",
       "isFrozen": "0",
       "statusDetail": "Normal",
       "actionProgress": {},
       "config_status": "In-Sync"
     }]
   }
   ```
   "status"的状态如果为**200** 则表示集群创建成功，集群对应的ID为**bae65496-643e-47ca-84af-948672de7eeb**。
   
3. 使用如下命令将集群对应的ID设置为全局变量，方便后续事项。
   ```
   export ID = bae65496-643e-47ca-84af-948672de7eeb
   ```
   
 
 #### 创建连接
1. 调用[创建连接](https://support.huaweicloud.com/api-cdm/CreateLink.html)API创建MySQL连接，连接名称为*mysql_link* 。这里假设本地MySQL数据库信息如下：
   - IP地址为**1xx.120.85.24。**
   
   - 端口为**3306**。
   
   - 数据库名称为**DB_name**。
   
   - 登录用户为**username**。
   
   - 密码为**DB_password**。
   
   
   如果返回状态码为200，则说明创建命令执行成功。
   ```
   curl -X POST -H "Content-Type:application/json" -H "X-Auth-Token:$Token" -d '{
     "links": [{
       "enabled": true,
       "update-user": null,
       "name": "mysql_link",
       "link-config-values": {
         "configs": [
                       {
                           "name": "linkConfig",
                           "inputs": [
                               {
                                   "name": "linkConfig.databaseType",
                                   "value": "MYSQL"
                               },
                               {
                                   "name": "linkConfig.host",
                                   "value": "1xx.120.85.24"
                               },
                               {
                                   "name": "linkConfig.port",
                                   "value": "3306"
                               },
                               {
                                   "name": "linkConfig.database",
                                   "value": "DB_name"
                               },
                               {
                                   "name": "linkConfig.username",
                                   "value": "username"
                               },
                               {
                                   "name": "linkConfig.password",
                                   "value": "DB_password"
                               },
                               {
                                   "name": "linkConfig.fetchSize",
                                   "value": "100000"
                               },
                               {
                                   "name": "linkConfig.usingNative",
                                   "value": "true"
                               }
                           ]
                       }
                   ]
       },
       "connector-name": "generic-jdbc-connector",
       "creation-date": 1536654788622,
       "update-date": 1536654788622,
       "creation-user": null
     }]
   }' 
   https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters/bae65496-643e-47ca-84af-948672de7eeb/cdm/link -k -v
   ```
   
2. 调用[创建连接](https://support.huaweicloud.com/api-cdm/CreateLink.html)API创建DWS连接，连接名称为*dws_link* 。这里假设DWS数据库信息如下：
   - 数据库的IP地址为**10.120.85.24**。
   
   - 端口为**3306**。
   
   - 数据库的名称为**DWS**。
   
   - 登录用户为**user_dws**。
   
   - 密码为**dws_password**。
   
   
   ```
   curl -X POST -H "Content-Type:application/json" -H "X-Auth-Token:$Token" -d '{
     "links": [{
       "enabled": true,
       "update-user": null,
       "name": "dws_link",
       "link-config-values": {
         "configs": [
                       {
                           "name": "linkConfig",
                           "inputs": [
                               {
                                   "name": "linkConfig.databaseType",
                                   "value": "DWS"
                               },
                               {
                                   "name": "linkConfig.host",
                                   "value": "10.120.85.24"
                               },
                               {
                                   "name": "linkConfig.port",
                                   "value": "3306"
                               },
                               {
                                   "name": "linkConfig.database",
                                   "value": "DWS"
                               },
                               {
                                   "name": "linkConfig.username",
                                   "value": "user_dws"
                               },
                               {
                                   "name": "linkConfig.password",
                                   "value": "dws_password"
                               },
                               {
                                   "name": "linkConfig.fetchSize",
                                   "value": "100000"
                               },
                               {
                                   "name": "linkConfig.usingNative",
                                   "value": "true"
                               }
                           ]
                       }
                   ]
       },
       "connector-name": "generic-jdbc-connector",
       "creation-date": 1536654788622,
       "update-date": 1536654788622,
       "creation-user": null
     }]
   }' 
   https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters/bae65496-643e-47ca-84af-948672de7eeb/cdm/link -k -v
   ```
   
 
 #### 创建迁移作业
1. 连接创建成功后，调用[指定集群创建作业](https://support.huaweicloud.com/api-cdm/CreateJob.html)API创建迁移作业，作业样例如下：
   - 作业名称：mysql2dws。
   
   - 从MySQL导出数据的数据库名称为*default* ，导出的表名称为**mysql_tbl** ，依据*id*字段将作业分割为多个任务并发执行。
   
   - 导入DWS的数据库名称为**public** ，表名为**cdm_all_type**，导入前不清空数据。
   
   - 当DWS数据库里没有本地MySQL数据库中的表时，CDM自动在DWS端创建该表。
   
   - DWS端加载的字段列表为*id\&gid\&name*。
   
   - 作业抽取数据时，并发执行的Extractor数量为3。
   
   
   如果返回状态码为200，则说明创建命令执行成功。
   ```
   curl -X POST -H "Content-Type:application/json" -H "X-Cluster-ID:$ID" -H "X-Auth-Token:$Token" -d '{
     "jobs": [{
       "job_type": "NORMAL_JOB",
       "name": "mysql2dws",
       "from-link-name": "mysql_link",
       "from-connector-name": "generic-jdbc-connector",
       "to-link-name": "dws_link",
       "to-connector-name": "generic-jdbc-connector",
       "from-config-values": {
         "configs": [{
           "name": "fromJobConfig",
           "inputs": [{
             "name": "fromJobConfig.schemaName",
             "value": "default"
           },
           {
             "name": "fromJobConfig.tableName",
             "value": "mysql_tbl"
           },
           {
             "name": "fromJobConfig.partitionColumn",
             "value": "id"
           }]
         }]
       },
   "to-config-values": {
                "configs": [
                    {
                        "inputs": [
                            {
                                "name": "toJobConfig.schemaName",
                                "value": "public"
                            },
                            {
                                "name": "toJobConfig.tablePreparation",
                                "value": "CREATE_WHEN_NOT_EXIST"
                            },
                            {
                                "name": "toJobConfig.tableName",
                                "value": "cdm_all_type"
                            },
                            {
                                "name": "toJobConfig.columnList",
                                "value": "id&gid&name"
                            },
                            {
                                "name": "toJobConfig.shouldClearTable",
                                "value": "false"
                            }
                        ],
                        "name": "toJobConfig"
                    }
                ]
            },
       "driver-config-values": {
         "configs": [{
           "name": "throttlingConfig",
           "inputs": [{
             "name": "throttlingConfig.numExtractors",
             "value": "3"
           }]
         }]
       }
     }]
   }' https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters/bae65496-643e-47ca-84af-948672de7eeb/cdm/job -k -v
   ```
   
2. 调用[启动作业](https://support.huaweicloud.com/api-cdm/StartJob.html)API开始执行作业。
   ```
   curl -X GET -H 'Content-Type:application/json;charset=utf-8' -H "X-Cluster-ID:$ID" -H "X-Auth-Token:$Token" https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters/bae65496-643e-47ca-84af-948672de7eeb/cdm/job/mysql2dws/start -k -v
   ```
   响应如下：
   ```
   {
     "submissions": [{
       "progress": 1,
       "job-name": "mysql2dws",
       "status": "BOOTING",
       "creation-date": 1536654788622,
       "creation-user": "cdm"
     }]
   }
   ```
   
 
 #### 查看作业结果
1. 调用[查询作业状态](https://support.huaweicloud.com/api-cdm/ShowJobStatus.html)API查询作业状态。
   ```
   curl -X GET -H 'Content-Type:application/json;charset=utf-8' -H "X-Cluster-ID:$ID" -H "X-Auth-Token:$Token" https://{cdm_endpoint}/v1.1/1551c7f6c808414d8e9f3c514a170f2e/clusters/6ec9a0a4-76be-4262-8697-e7af1fac7920/cdm/job/mysql2dws/status -k -v
   ```
   
2. 查看作业执行结果，作业执行成功的响应如下：
   ```
   {
     "submissions": [{
       "progress": 0,
       "job-name": "mysql2dws",
       "status": "SUCCEEDED",
       "creation-date": 1536654788622,
       "creation-user": "cdm",
       "isStopingIncrement": "",
       "last-update-date": 1536654888622,
       "is-execute-auto": false,
       "last-udpate-user": "cdm",
       "isDeleteJob": false,
       "isIncrementing": false,
       "external-id": "job_local1127970451_0009",
       "counters": {
         "org.apache.sqoop.submission.counter.SqoopCounters": {
           "BYTES_WRITTEN": -1,
           "TOTAL_FILES": -1,
           "BYTES_READ": -1,
           "FILES_WRITTEN": -1,
           "TOTAL_SIZE": -1,
           "FILES_READ": -1,
           "ROWS_WRITTEN": 80,
           "ROWS_READ": 80
         }
       }
     }]
   }
   ```
   ![](https://support.huaweicloud.com/api-cdm/public_sys-resources/note_3.0-zh-cn.png)
   - BYTES_WRITTEN：表示写入的字节数。
   
   - BYTES_READ：表示读取的字节数。
   
   - TOTAL_FILES：表示总文件数。
   
   - FILES_WRITTEN：表示写入的文件数。
   
   - FILES_READ：表示读取的文件数。
   
   - ROWS_WRITTEN：表示写入成功的行数。
   
   - ROWS_READ：表示读取成功的行数。
     
 
