
# 使用Kettle迁移BigQuery至DWS集群
本实践演示如何使用开源工具Kettle将BigQuery数据迁移到DWS。其中，元数据通过DSC进行语法转换后迁移，历史和增量数据采用Kettle工具迁移。
**了解Kettle** ，请参见[了解Kettle](https://support.huaweicloud.com/bestpractice-dws/dws_05_0020.html#ZH-CN_TOPIC_0000002121552138__section99166339111)。
本实践预计时长90分钟，演示迁移BigQuery的基本流程如下：
1. [迁移前准备](https://support.huaweicloud.com/bestpractice-dws/dws_05_0020.html#ZH-CN_TOPIC_0000002121552138__section152018294174)：准备迁移工具Kettle和相关套件包，并获取BigQuery的JSON key文件。
2. [步骤一：配置BigQuery和DWS的连接]：使用Kettle新建两个数据库连接，连通BigQuery和DWS。
3. [步骤二：迁移元数据]：使用DSC工具进行迁移。
4. [步骤三：迁移全量业务数据]：迁移全量历史数据。
5. [步骤四：迁移增量业务数据]：迁移增量数据。
6. [步骤五：并发执行迁移作业]：创建一个job，用于并发执行多个transformation任务，达到并发迁移多张表的目的。
7. [步骤六：表数据校验]：迁移后数据一致性验证。
#### 约束与限制
- 不支持整个数据库迁移。
- 支持单表迁移，如需多表同时迁移，可将多个转换配置在一个Job里进行。
 
#### 前提条件
安装JDK 11或以上版本，并配置相关环境变量。
#### 迁移前准备
1. 参见[使用开源Kettle导入数据](https://support.huaweicloud.com/migration-dws/dws_15_0112.html)完成Kettle安装和dws-client配置。
2. 安装和配置完Kettle后，进入Kettle文件夹data-integration\\lib目录下，删除guava-17.0文件，即可进行BigQuery连接。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002359974204.jpg "点击放大")
   
   
3. 获取谷歌云端JSON key文件，用于配置Kettle。
   
   以下操作仅供参考，具体请访问谷歌云官网。
   1. 登录谷歌云，在产品中选择IAM。
   
   2. 左侧导航选择"服务账号"，在服务账号列表中选择一个服务账号，单击右侧的![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002432971980.png "点击放大")，选择"管理密钥"。如果没有服务账号，请先创建一个。
   
   3. 选择"创建新密钥 \> JSON"，单击"创建"，将密钥保存在本地，拷贝本地存放路径。
    
   
   
 
 #### 步骤一：配置BigQuery和DWS的连接
1. 打开Kettle解压后的文件夹data-integration，双击Spoon.bat，启动Kettle。 
   如果运行失败，请检查JDK版本是否为JDK 11及以上。
   
   
2. 选择"File \> New \> Transformation"。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469159177.png "点击放大")
   
   
3. 在新创建的"Transformation xx"下面，选择"View"，双击"Database connections"。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435690168.png "点击放大")
   
   
4. 在弹出的Database Connection窗口中，左侧选项框选择"General"，按顺序填写以下信息。 
   - **Connection name**：Bigquery
   
   - **Connection type**：Google BigQuery
   
   - **Access**：Native(JDBC)
   
   - **Host Name**：https://www.googleapis.com/bigquery/v2
   
   - **Project ID** : 从[3]生成的json key中获取。
   
   - **Port Number**：443
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469164933.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002359974208.jpg "点击放大")
   
   
5. 左侧选项框，切换到"Options"，按顺序添加以下信息。 
   - **OAuthServiceAcctEmail**：谷歌云IAM中对应项目中服务账号生成JSON Key的邮箱地址。
   
   - **OAuthPvtKeyPath**：本地存放JSON Key的地址。
   
   - **OAuthType**：配置为0。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435776122.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002433018848.jpg "点击放大")
   
   
6. 单击"Test"。
7. 显示连接成功后，单击"OK"。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   连接时可能会因为客户端无法找到jar包导致连接失败，需要[访问官网](https://cloud.google.com/bigquery/docs/reference/odbc-jdbc-drivers?hl=zh-cn)，选择最新JDBC驱动包下载，解压后放入data-integration\\lib文件夹中，再次删除guava-17.0文件，重启客户端再连接。
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002466423429.png "点击放大")
   
   
8. 继续右键"Transformation xx"下面的"Database connections"，单击"New"，配置目的端数据库连接。
9. 左侧选择"General"，配置如下参数： 
   - **Connection name**：DWS
   
   - **Connection type**：PostgreSQL
   
   - **Access**：Native(JDBC)
   
   - **Host Name**：填写DWS的IP地址。例如10.140.xx.xx。
   
   - **Database Nam**e：gaussdb
   
   - **Port Number**：8000
   
   - **Username**：dbadmin
   
   - **Password**：填写DWS的dbadmin用户的密码。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435625494.png "点击放大")
   
   
10. 左侧切换"Options"，添加以下参数。 
    stringtype：unspecified
    ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469318293.png "点击放大")
    
    
11. 确认参数后，单击"Test"，连通成功后，单击"OK"。
12. 双击"Transformation xx"名称，切换到"Monitoring"页签，配置**"Step performance measurement interval (ms)"** 为1000，优化Kettle处理性能。
    
    ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469200693.png "点击放大")
    
    
 #### 步骤二：迁移元数据
通过华为自研工具DSC进行迁移，将BigQuery源端导出的元数据的DDL语句转成DWS中可执行的SQL。
1. 导出元数据及增量元数据。 
   1. 执行以下SQL获取表信息。
      ```
      SELECT * FROM Information_schema.tables
      ```
      
   
   2. 再使用以下语句获取表的DDL。
      ```
      SELECT ddl FROM `project.dataset.INFORMATION_SCHEMA.TABLES` WHERE table_name = 'your_table_name'
      ```
      并将查询出的结果导出。
      
   
   3. 如果元数据有变动，可通过以下SQL查出最新改动的表。
      ```
      SELECT * FROM Information_schema.tables ORDER BY last_modified_time DESC；
      ```
      按照[1.b]的方式导出元数据，和DWS中的进行对比，通过DSC转换，删除现有表，执行新的DDL，再进行整表迁移。
      
   
   
   
   
2. 参见[DSC配置](https://support.huaweicloud.com/tg-dws/dws_16_0013.html)章节配置DSC工具。
3. 使用DSC完成DDL转换。 
   1. 在DSC工具的input文件夹下放入需要转换的SQL文件。
   
   2. 打开cmd命令行，进入DSC对应目录下。 ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002433362948.jpg "点击放大")
      
   
   3. 执行runDSC脚本（Linux环境执行runDSC.sh）。
      ```
      runDSC.bat -S mysql
      ```
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002466921477.jpg "点击放大")
      
   
   4. 在DSC工具的output目录下，查看转换结果及日志。 转换前DDL：
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002466841617.jpg "点击放大")
      转换后DDL：
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002433203096.jpg "点击放大")
      
   
   
   
   
4. 连接DWS数据库，执行转换后的DDL进行目标表创建。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002433362952.jpg "点击放大")
   
   
 #### 步骤三：迁移全量业务数据
1. Kettle左侧框内选择"Design \> Input \> Table input"。
2. 双击"Table input"，"Connection"选择[步骤一：配置BigQuery和DWS的连接]中配置的Bigquery连接名称，下方SQL编辑框内输入查询SQL即可。
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469214217.png "点击放大")
   
   
3. 单击"OK"，表输入信息创建成功。
4. 左侧框内选择"Design \> Output \> Table output"。
5. 双击"Table output"，填写以下信息。 
   - **Connection** ：选择[步骤一：配置BigQuery和DWS的连接]中配置的DWS连接名称。
   
   - **Target schema**：填写对应的schema。
   
   - **Target table**：填写对应的表名。
   
   - **Truncate table**：如果多次全量迁移同一张表，需要勾选，否则忽略。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469340405.png "点击放大")
   
   
6. 单击"OK"，表输出信息创建成功。
7. 在右侧面板中，鼠标悬停在"Table input"，拖拽箭头指向"Table output"。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469224629.png "点击放大")
   
   
8. 单击![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002466841453.png "点击放大")，开始运行作业。
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469344961.png "点击放大")
   
   
 #### 步骤四：迁移增量业务数据
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
增量迁移和全量迁移的步骤大致相同，区别在于源端SQL中增加了where条件。
1. 配置BigQuery源端，在右侧面板中，右键"Table input"，数据库选择源端数据库连接，SQL语句中增加where条件查询增量数据。 
   **注意** ：此种方法适用于表中带有明确区分时间的字段，如果没有区分时间字段但是有分区请按照分区导入，没有分区请删除所有数据并全量导入。
   图1编辑"表输入"
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469349365.png "点击放大")
   
   
2. 配置目标端，右键"Table output"进行编辑。 
   图2编辑"表输出"
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435834628.png "点击放大")
   
   
   
3. 配置好后单击![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435835232.png "点击放大")，开始执行迁移任务。
 
 #### 步骤五：并发执行迁移作业
Job任务配置，就是将上面配置好的多张表的Transformation放到一个任务里面执行，达到多并发执行的目的，从而提高执行效率。
1. 选择"File \> New \> Job"，拖拽相应的组件到面板，用连接线连接到一起，如下图所示。 
   图3新建job   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469353701.png "点击放大")
   
   
2. 分别双击配置相应的Transformation，选择之前已经配置保存好的转换任务，如下图所示。 
   图4配置transformation   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469233849.png "点击放大")
   
   
3. 右键Start组件，勾选Run Next Entries in Parallel组件，设置任务并发执行，如下图所示。 
   图5设置并发   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435675400.png "点击放大")
   设置成功后，Start组件和Transformation组件之间会多一个双斜杠，如下图所示。
   图6设置并发成功   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435835244.png "点击放大")
   
   
   
4. 单击Run，开始并发执行转换任务。 
   图7执行并发Run   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469353713.png "点击放大")
   
   
 
 #### 步骤六：表数据校验
迁移完成之后，可使用数据校验工具DataCheck校验源端、目标端的数据是否一致。
1. 准备一台ECS（安装系统可以选择Linux或Windows），且确保ECS配置弹性公网IP可以访问BigQuery。
2. 下载软件包后，上传到ECS指定位置（用户可自定义），解压DataCheck-\*.zip包，进入DataCheck-\*目录，即可使用。目录下各文件的使用说明参见[表1](https://support.huaweicloud.com/bestpractice-dws/dws_05_0020.html#ZH-CN_TOPIC_0000002121552138__table346mcpsimp)。
3. 配置工具包。 
   - **Windows环境下** ：
     打开DataCheck/conf文件夹中的dbinfo.properties文件，根据实际需要进行配置。BigQuery源的配置参考下图：
     图8配置DataCheck   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469233861.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_0000002435675412.png "点击放大")
     运行成功后会在本地bin目录下生成加密文件，如下图。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435835252.png "点击放大")
     
   
   - **Linux环境下** ：
     解压DataCheck包后，进入到properties所在路径：
     ```
     cd /DataCheck/conf
     cat dbinfo.properties
     ```
     配置properties文件如下：
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469353737.png "点击放大")
     密文生成方法与上文中Window环境下的方法类似，命令为**sh encryption.sh** *\[password\]*。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002469233877.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 Strategy支持high、middle、low三种，若未填写，默认为low。
      
      - 校验模式Check mode支持statistics，即统计值校验。
       
      下图为元数据对比的check_input.xlsx文件。
      图9check_input.xlsx   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435421984.png "点击放大") 
   
   2. 在bin目录下使用命令datacheck.bat执行校验工具： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435675428.png "点击放大")
      
   
   3. 查看已生成的校验结果 check_input_result.xlsx： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435424176.png "点击放大")
      校验结果分析：
      - Status结果为No Pass代表校验未通过。
      
      - Check Result Diff列显示数值校验中的avg不同，DWS为61.5125，源数据库为61.5000。
      
      - Check SQL中显示具体执行的校验命令。
       
   
   
   **Linux环境下**：
   1. 编辑check_input.xlsx文件并上传，参考Window环境下的第一步。
   
   2. 使用命令**sh datacheck.sh** 执行校验工具。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002435835268.png "点击放大")
      
   
   3. 查看校验结果check_input_result.xlsx（校验结果分析与Windows场景相同）。
   
   
   
   
