
# 关于GDS并行导入
INSERT和COPY方式执行数据导入时，是一个串行执行的过程，导入性能低，因此适用于小数据量的导入。对于大数据量的导入，DWS支持使用GDS工具通过外表并行导入数据到集群。
当前版本的GDS已经支持从管道文件导入数据库，该功能使GDS的导入更加灵活多变。
- 当GDS用户的本地磁盘空间不足时，可直接将hdfs上的数据写入到管道文件而不需要占用额外的磁盘空间。
- 当用户导入前需要清洗数据时，用户可以根据自己的需求编写程序，将需要处理的数据流式实时的写入管道文件，完成导入的数据清洗工作。
  ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
  - 当前版本暂不支持SSL模式下GDS导入，请勿以SSL方式使用GDS。
  
  - 本章涉及的所有管道文件都是指Linux上的命名管道。
  
  - 在执行GDS导入导出时，为了确保数据导入或导出的正确性，需要在相同的兼容模式下操作。 例如：在MySQL兼容模式下导入（导出）的数据，同样需要在MySQL兼容模式下才能正确导出（导入）。
    
    
#### 概述
并行导入将存储在服务器普通文件系统中的数据导入到DWS数据库中。暂时不支持将存储在HDFS文件系统上的数据导入DWS。
并行导入功能通过外表设置的导入策略、导入数据格式等信息来识别数据源文件，利用多DN并行的方式，将数据从数据源文件导入到数据库中，从而提高整体导入性能。如[图1]所示：
- CN只负责任务的规划及下发，把数据导入的工作交给了DN，释放了CN的资源，使其有能力处理其他外部请求。
- 所有DN都参与数据导入，这样可以充分利用各设备的计算能力及网络带宽，提升导入效率。
外表灵活的OPTION设置，有利于在数据入库前对数据做预处理，例如非法字符替换、容错处理等。
图1数据并行导入示意图   
![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000001799299941.png "点击放大")
上图中所涉及的相关概念说明如下：
- **CN** **（Coordinator）**：DWS协调节点。在导入场景下，接收到应用或客户端的导入SQL指令后，负责任务的规划及下发到DN。
- **DN（Datanode）**：DWS数据节点。接收CN下发的导入任务，将数据源文件中的数据通过外表写入数据库目标表中。
- **数据源文件**：存有数据的文件。文件中保存的是待导入数据库的数据。
- **数据服务器**：数据源文件所在的服务器称为数据服务器。基于安全考虑，建议数据服务器和DWS集群处于同一内网。
- **外表Foreign Table**：用于识别数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息。是关联数据文件与数据库实表（目标表）的对象。
- **目标表**：数据库中的实表。数据源文件中的数据最终导入到这些表中存储，包括行存表和列存表。
 
#### GDS并发导入
- 数据量大，数据存储在多个服务器上时，在每个数据服务器上安装配置、启动GDS后，各服务器上的数据可以并行入库。如[图2]所示。
  图2多数据服务器并行导入   
  ![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000001188163822.png "点击放大")
  ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/notice_3.0-zh-cn.png)
  GDS进程数目不能超过DN数目。如果超过，会出现一个DN连接多个GDS进程的情形，可能会导致部分GDS异常运行。
  
- 数据存储在一台数据服务器上时，如果DWS及数据服务器上的I/O资源均还有可利用空间时，可以采用GDS多线程来支持并发导入。 GDS是根据导入事务并发数来决定服务运行线程数的，也就是说即使启动GDS时设置了多线程，也并不会加速单个导入事务。未做过人为事务处理时，一条INSERT语句就是一个导入事务。
  
综上，多线程的使用场景如下：
- 多表并发导入时，采用多线程充分利用资源及提升并发导入效率。
- 对数据量大的某一事实表的导入进行提速。 将该事实表对应的数据拆分为多个数据文件，通过多外表同时入库的方式实现多线程并发导入。注意需确保每个外表所能读取的数据文件不重复。
  
 
#### 导入流程
图3GDS并行导入流程   
![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000001188482352.png "点击放大")
表1流程说明 
| 流程      | 说明                                                                                                                                                                                                                                                                                                     |
|:---|:---|
| 准备源数据。  | 准备需要导入数据库的源数据文件，并上传至数据服务器。 详细内容请参见[准备源数据](https://support.huaweicloud.com/migration-dws/dws_15_0022.html#ZH-CN_TOPIC_0000002219983984)。                                    |
| 启动GDS。  | 在数据服务器上安装配置并启动GDS。 详细内容请参见[安装配置和启动GDS](https://support.huaweicloud.com/migration-dws/dws_15_0023.html)。                                                                    |
| 创建外表。   | 创建外表用于识别数据源文件中的数据。外表中保存了数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息。 详细内容请参见[创建GDS外表](https://support.huaweicloud.com/migration-dws/dws_15_0024.html#ZH-CN_TOPIC_0000002220143848)。 |
| 执行导入数据。 | 在创建好外表后，通过INSERT语句，将数据快速、高效地导入到目标表中。详细内容请参见[执行导入数据](https://support.huaweicloud.com/migration-dws/dws_15_0025.html#ZH-CN_TOPIC_0000002255063569)。                                                                                                                                                      |
| 处理错误表。  | 在数据并行导入发生错误时，请根据具体的错误信息进行处理，以保证导入数据的完整性。 详细内容请参见[处理导入错误](https://support.huaweicloud.com/migration-dws/dws_15_0026.html#ZH-CN_TOPIC_0000002219983988)。                     |
| 优化查询效率。 | 导入数据后，通过ANALYZE语句生成表统计信息。ANALYZE语句会将统计结果自动存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据，以生成最有效的查询执行计划。                                                                                                                                                                                                          |
| 停止GDS   | 待数据导入完成后，登录每台数据服务器，分别停止GDS。 GDS的停止请参见[停止GDS](https://support.huaweicloud.com/migration-dws/dws_15_0027.html#ZH-CN_TOPIC_0000002254983689)。                                 |
   
