# 使用Kettle迁移AWS Redshift小表到DWS集群
本实践演示如何使用开源工具Kettle将Redshift数据迁移到DWS。
 #### 了解Kettle
Kettle是一个开源的ETL（Extract-Transform-Load）工具，全称为KDE Extraction, Transportation, Transformation and Loading Environment。它提供了一个可视化的图形化界面，使用户能够通过拖放和连接组件来设计和配置ETL流程。支持多种数据源和目标，包括关系型数据库、文件、API、Hadoop等。Kettle提供了丰富的转换和清洗功能，可以对数据进行格式转换、数据过滤、数据合并、数据计算等操作。
它的主要功能如下：
- 无代码拖拽式构建数据管道。
- 多数据源对接。
- 数据管道可视化。
- 模板化开发数据管道。
- 可视化计划任务。
- 深度Hadoop支持。
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
- DWS需要绑定公网IP后才能与Kettle连接使用。
- Kettle和云数据迁移（Cloud Data Migration，简称CDM）都适用于批处理场景，当数据量或表数量较小时，推荐使用Kettle，反之使用CDM。
- 支持从数据库导出数据到文件，也支持将数据导入到数据库。
- Kettle可通过建立触发器、时间戳字段、Kafka等方式实现数据实时同步。
 
本实践预计时长90分钟，演示迁移Redshift的基本流程如下：
1. [迁移前准备]：准备迁移工具Kettle和相关套件包。
2. [步骤一：元数据迁移]：使用DSC工具进行迁移。
3. [步骤二：新建Transformation并配置源端数据库和目标数据库]：创建一个transformation任务，配置好源端和目标端数据库。
4. [步骤三：迁移业务数据]：包括全量迁移、增量迁移。
5. [步骤四：并发执行迁移作业]：创建一个job，用于并发执行多个transformation任务，达到并发迁移多张表的目的。
6. [步骤五：优化迁移作业]：通过调整Kettle内存大小和Job的任务数量，提高迁移效率。
7. [步骤六：表数据校验]：迁移后数据一致性验证。
 
 #### 迁移前准备
- 已经购买了DWS集群，并已绑定弹性公网IP，并已规划创建好目标数据库**dws_vd**。
- 已获取DSC工具包，[下载并安装DSC](https://support.huaweicloud.com/tg-dws/dws_16_0212.html)。
- 已获取DataCheck工具包，[下载并安装DataCheck](https://support.huaweicloud.com/tg-dws/dws_07_0205.html)。
- 已获取Kettle工具包和dws-client相关插件，并配置好Kettle，参见[使用开源Kettle导入数据](https://support.huaweicloud.com/migration-dws/dws_15_0112.html)的"准备Kettle环境"和"安装dws-client自定义插件"部分。
- 已安装JDK11或以上版本，并配置相关环境变量。
 
 #### 步骤一：迁移元数据
使用华为云自研工具DSC迁移，将Redshift中客户源端导出的样例表的DDL语句转成DWS中可执行的SQL。
1. 解压获取到的DSC工具包，将需要转换的文件放入DSC的input目录下。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   Redshift表结构设计中不含索引，影响性能的关键点取决于DDL中的数据分布键DISTSTYLE和排序键SORTKEY。
   图1DDL语句   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002234894793.png "点击放大")
   
   
2. 自定义配置features-pg.properties文件。 
   图2features-pg.properties文件   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002234897509.png "点击放大")
   
   
3. 进入到DSC对应目录下，执行runDSC脚本。Windows环境下双击runDSC.bat。（Linux环境下执行runDSC.sh。）
4. 执行以下命令进行语法转换。 
   ```
   runDSC.bat -S postgres
   ```
   图3DSC转换   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002199779106.png "点击放大")
   
   
5. 查看结果及转换信息。 
   图4转换结果   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002234919009.png "点击放大")
   
   
6. 连接DWS，执行上一步转换完成的DDL语句，完成建表。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   DSC更多内容请参见[DSC工具使用指导](https://support.huaweicloud.com/tg-dws/dws_mt_index.html)。
   
   
 
 #### 步骤二：新建Transformation并配置源端数据库和目标数据库
1. 在Kettle工具部署好后，双击Kettle工具data-integration目录下的**Spoon** 脚本启动Kettle工具。
   
   图5启动Kettle   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157971433.png "点击放大")
   双击后出现如下界面。
   图6Kettle界面   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122491656.png "点击放大")
   
   
2. 选择"File \> New \> Transformation"，创建一个新的转换。 
   图7新建transformation   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157929833.png "点击放大")
   
   
3. 单击view下面的Database connection，右键单击new，配置源端和目的端的数据库连接。 
   - 源端redshift-VD库连接配置如下：
     - jdbc：redshift://dwdsi-simulacao.cslagxelrdnm.us-east-1.redshift.amazonaws.com:xxxx/dsidw
     
     - Username： xxxxxxx
     
     - Password：xxxxxxx
     
     
     图8配置源端   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157686965.png "点击放大") 
   
   - 目的端DWS-VD库连接配置如下:
     - Host Name: DWS的弹性公网IP。
     
     - Database Name：dws_vd
     
     - Username：dbadmin
     
     - Password：dbadmin用户的密码。
     
     
     图9配置目标端   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157609233.png "点击放大")
     图10options   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122649836.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
     数据库连接成功后，分别右键单击源端和目的端连接，再单击share共享该连接，这样在后续的任务配置中就无需再配置数据库连接。
     
   
   
   
   
4. 分别将Design下面Input和Output目录下的Table input组件和DWS TableOutput组件拖到右侧面板中。
5. 右键单击Table input组件的连接线，将两个组件连接起来。 
   图11连接组件   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157971449.png "点击放大")
   
   
 
 #### 步骤三：迁移业务数据
**全量数据迁移**
1. 右键编辑Table input，数据库选择源端数据库连接。 
   图12编辑Table input   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122491672.png "点击放大")
   
   
2. 右键编辑DWS TableOutput，数据库选择目的端数据库连接。勾选Truncate table、Specify database fields，同时选择Database fields下的Get fields获取源端和目的端的字段映射连接，单击OK。 
   图13编辑Table output   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157929853.png "点击放大")
   图14编辑Database fields   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122649880.png "点击放大")
   
   
3. 配置好后单击Run，开始执行迁移任务。 
   图15执行Run   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157971493.png "点击放大")
   
   
**增量数据迁移**
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
增量迁移和全量迁移的步骤大致相同，区别在于源端SQL中增加了where条件，目的端配置去掉了勾选Truncate table。
1. 右键编辑Table input，数据库选择源端数据库连接。 
   图16编辑Table input   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122491724.png "点击放大")
   
   
2. 右键编辑DWS TableOutput，数据库选择目的端数据库连接。去勾选Truncate table，同时选择Database fields 下的Get fields获取源端和目的端的字段映射连接，单击OK。 
   图17编辑TableOutput   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157929897.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122649904.png "点击放大")
   
   
   
3. 配置好后单击Run，开始执行迁移任务。 
   图18执行Run   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157971521.png "点击放大")
   
   
 
 #### 步骤四：并发执行迁移作业
Job任务配置，就是将上面配置好的多张表的Transformation放到一个任务里面执行，达到多并发执行的目的，从而提高执行效率。
1. 选择"File \> New \>Job"，拖拽相应的组件到面板，用连接线连接到一起，如下图所示。 
   图19新建job   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122491752.png "点击放大")
   
   
2. 分别双击配置相应的Transformation，选择之前已经配置保存好的转换任务，如下图所示。 
   图20配置transformation   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157929929.png "点击放大")
   
   
3. 右键Start组件，勾选Run Next Entries in Parallel组件，设置任务并发执行，如下图所示。 
   图21设置并发   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122649932.png "点击放大")
   设置成功后，Start组件和Transformation组件之间会多一个双斜杠，如下图所示。
   图22设置并发成功   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157971541.png "点击放大")
   
   
   
4. 单击Run，开始并发执行转换任务。 
   图23执行并发Run   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122491772.png "点击放大")
   
   
 
 #### 步骤五：优化迁移作业
1. 配置Kettle内存。 
   为了增加Kettle并发数及缓存数据量大小，可以设置Kettle的内存大小。
   用Notepad++打开Spoon.bat脚本，编辑内存相关内容，一般建议为主机内存的60%-80%，如下图所示。
   图24配置内存   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002157929941.png "点击放大")
   
   
2. 配置Job。 
   - 当表数据量小于千万时，Job调度的表个数建议配置在10个左右。
   
   - 对于相对大一点的表，例如1亿左右的数据，建议配置2\~3个即可，这样配置，即使其中一个任务中途失败，也可以打开相应的转换任务，单独调度，提高效率。
   
   - 对于数据量超过1亿以上的表，尤其是字段数特别多的表，Kettle抽取效率相对较慢，可以根据业务实际情况选择相应的迁移方式。
     图25配置Job   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002122649948.png "点击放大") 
   
   - 在配置任务的时候，尽量将表数据量大致相同的任务放到一个Job中，这样可以保证所有任务执行完成的时间大致相同，不会有拖尾任务，影响下一个job的执行。
   
   - 如果任务出错，可以查看相应的报错日志，一般情况下遇到的都是源端连接限制导致断开的问题。遇到该情况，可以重启Kettle软件，重试即可。
   
   
   
   
 
 #### 步骤六：表数据校验
迁移完成之后，可使用数据校验工具DataCheck校验源端、目标端的数据是否一致。
1. 准备一台ECS（安装系统可以选择Linux或Windows），且确保ECS配置弹性公网IP可以访问Redshift。
2. 下载软件包后，上传到ECS指定位置（用户可自定义），解压DataCheck-\*.zip包，进入DataCheck-\*目录，即可使用。目录下各文件的使用说明参见[表1]。
3. 配置工具包。 
   - **Windows环境下** ：
     打开DataCheck/conf文件夹中的dbinfo.properties文件，根据实际需要进行配置。Redshift源的配置参考下图：
     图26配置DataCheck   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002235013257.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
     文件中的密码src.passwd和dws.passwd可使用工具，执行以下命令生成密文。
     **encryption.bat** *password*
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002235019333.png "点击放大")
     运行成功后会在本地bin目录下生成加密文件，如下图。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002199899256.png "点击放大")
     
   
   - **Linux环境下** ：
     其他步骤相同。密文生成方法与上文中Window环境下的方法类似，命令为**sh encryption.sh** *\[password\]*。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002235139521.png "点击放大")
     
   
   
   
   
4. 执行数据校验。 
   **Windows环境下**：
   1. 打开check_input.xlsx文件，将要校验的Schema、数据库、源表、目标端表填入，Row Range可根据需要填写特定范围的数据查询语句。
      ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
      - 源端的库名在配置文件中配置后，check_input.xlsx文件中的源端会默认填写配置文件中的库名，若check_input.xlsx文件中填入其他库名，以check_input.xlsx文件中的优先级为高。
      
      - 校验级别Check Strategy支持high、middle、low三种，若未填写，默认为low。
      
      - 校验模式Check mode支持statistics，即统计值校验。
       
      下图为元数据对比的check_input.xlsx文件。
      图27check_input.xlsx   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002200059064.png "点击放大") 
   
   2. 在bin目录下使用命令datacheck.bat执行校验工具： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002235019345.png "点击放大")
      
   
   3. 查看已生成的校验结果 check_input_result.xlsx： 下图为源端元数据与目标端一致的结果。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002199899268.png "点击放大")
      下图为源端元数据与目标端不一致的结果。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002235139529.png "点击放大")
      统计值校验参考下图。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002200059072.png "点击放大")
      
   
   
   **Linux环境下**：
   1. 编辑check_input.xlsx文件并上传，参考Window环境下的第一步。
   
   2. 使用命令**sh datacheck.sh** 执行校验工具。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002235019353.png "点击放大")
      
   
   3. 查看校验结果check_input_result.xlsx（校验结果分析与Windows场景相同）。
   
   
   
   
 
#### 参考信息
更多参考信息可查看[工具指南-DataCheck](https://support.huaweicloud.com/tg-dws/dws_07_0200.html)。
 表1DataCheck目录说明 
| **文件或文件夹**                                                                     || **说明**                                                                                                                                                                                                                                                                                                           |
|:---|---|:---|
| DataCheck | bin                     | 保存校验工具入口脚本。 - Windows版本：datacheck.bat  - Linux版本：datacheck.sh   |
| DataCheck | conf                    | 配置文件，进行源数据库和目的数据库的连接配置和日志打印设置。                                                                                                                                                                                                                                                                                   |
| DataCheck | lib                     | 保存校验工具运行所需的相关jar包。                                                                                                                                                                                                                                                                                               |
| DataCheck | check_input.xlsx        | - 待校验的表信息，包括Schema名、表名、列名等。  - 记录用户的校验级别信息和校验规则。已支持3种级别校验，包括high、middle、low，默认为low。                      |
| DataCheck | logs                    | 压缩包中不包含该文件，校验工具执行后自动生成，记录工具运行过程日志。                                                                                                                                                                                                                                                                               |
| DataCheck | check_input_result.xlsx | 压缩包中不包含该文件，执行校验工具后会在check_input.xlsx相同路径下生成校验结果文件。                                                                                                                                                                                                                                                               |
   
表2数据校验工具基本功能介绍 
| DataCheck工具介绍                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|
| - 支持DWS，MySQL，PostgreSQL数据库的数据校验。  - 支持通用类型字段校验：数值、时间、字符类型。  - 支持校验级别设置：包括high、middle、low三种。  - 支持指定schema、表名、列名进行校验。  - 支持指定记录的校验范围，默认为校验所有记录。  - 校验方式涉及count(\*)、max、min、sum、avg以及抽样明细校验等方式。  - 输出校验结果和相关校验明细说明。   |
   
表3数据校验级别说明 
| 校验级别 | 校验说明                                                                                                                                                                                                                                                                                                                                                                                                              | 校验相关语法                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|:---|
| 低    | - 数据数量校验                                                                                                                                                                                                                                                                                                               | - 条数校验: COUNT(\*)                                                                                                                                                                                                                                                                                                                                                                          |
| 中    | - 数据数量校验  - 数值类型校验                                                                                                                                                                                                           | - 条数校验: COUNT(\*)  - 数值校验: MAX, MIN, SUM, AVG                                                                                                                                                                                                                                                    |
| 高    | - 数据数量校验  - 数值类型校验  - 日期类型校验  - 字符类型校验   | - 条数校验: COUNT(\*)  - 数值校验: MAX, MIN, SUM, AVG  - 日期校验: MAX, MIN  - 字符校验：order by limit 1000，读出数据并校验内容是否相同。   |
   
