
# 关于OBS并行导入
对象存储服务OBS（Object Storage Service）是云上提供的一个基于对象的海量存储服务，为客户提供安全、高可靠、低成本的数据存储能力。OBS为用户提供了超大存储容量的能力，适合存放任意类型的文件。
数据仓库服务DWS使用OBS作为集群数据与外部数据互相转化的平台，实现安全、高可靠和低成本的存储需求。
DWS支持将OBS上TXT、CSV、ORC、PARQUET、CARBONDATA以及JSON格式的数据导入到集群进行查询，也支持远程读OBS上的数据。因此对于经常查询的热数据建议直接导入DWS后再做查询。偶尔查询的冷数据可以存储在OBS上直接远程读以节省成本。
目前，导入数据有两种方式：
- 方式一：无需用户创建server，使用默认server创建外表，支持TXT、CSV格式的数据，参见[从OBS导入CSV、TXT数据](https://support.huaweicloud.com/migration-dws/dws_15_0006.html#ZH-CN_TOPIC_0000002219983964)。
- 方式二：需用户创建server，使用该server创建外表，支持ORC、CARBONDATA、TXT、CSV、PARQUET以及JSON格式的数据，参见[从OBS导入ORC、CARBONDATA、PARQUET和JSON数据](https://support.huaweicloud.com/migration-dws/dws_15_0013.html)。
![](https://support.huaweicloud.com/migration-dws/public_sys-resources/notice_3.0-zh-cn.png)
- OBS导入导出数据时，不支持中文路径。
- OBS导入导出数据时，暂不支持跨Region进行OBS数据导入导出，必须确保OBS和DWS集群在同一个Region中。
- 在执行OBS导入导出时，为了确保数据导入或导出的正确性，需要在相同的兼容模式下操作。 例如：在MySQL兼容模式下导入（导出）的数据，同样需要在MySQL兼容模式下才能正确导出（导入）。
  
 
#### 概述
在数据迁移、ETL（Extract-Transform-Load）过程中，需要向DWS并行导入海量数据，使用普通方式会耗费大量的时间。DWS提供了OBS（Object Storage Service）及外表接口，通过OBS外表设置的导入URL路径、导入数据格式等信息来识别数据源文件，利用多DN（Datanode）并行的方式，实现了数据的快速并行导入。
**优势：**
- CN只负责任务的规划及下发，把数据导入的工作交给了DN，释放了CN的资源，使其有能力处理外部请求。
- 通过让各个DN都参与数据导入，充分利用各个设备的计算能力及网络带宽。
- 支持导入过程中对数据做预处理。
- 支持在导入过程中，针对数据格式错误设置导入容错性，并可在导入结束后根据错误信息定位错误数据。
 
**劣势：**
需要创建OBS外表，并且要在OBS服务器上存放导入数据。
**适用场景：**
高并发、大数据量导入。
#### 相关概念
- **数据源文件**：存储有数据的TEXT、CSV、ORC、CARBONDATA、PARQUET、JSON文件。文件中保存的是待并行导入数据库的数据。
- **OBS**：对象存储服务，是一种可存储文档、图片、影音视频等非结构化数据的云存储服务。向DWS并行导入数据时，数据对象放置在OBS服务器上。
- **桶（Bucket）** ：对OBS中的一个存储空间的形象称呼，是存储对象的容器。
  - 对象存储是一种非常扁平化的存储方式，桶中存储的对象都在同一个逻辑层级，去除了文件系统中的多层级树形目录结构。
  
  - 在OBS中，桶名必须是全局唯一的且不能修改，即用户创建的桶不能与自己已创建的其他桶名称相同，也不能与其他用户创建的桶名称相同。每个桶在创建时都会生成默认的桶ACL（Access Control List），桶ACL列表的每项包含了对被授权用户授予的权限，如读取权限、写入权限、完全控制权限等。用户需要对桶有相应的权限，才可以对桶进行操作，如创建、删除、显示、设置桶ACL等。
  
  - 一个用户最多可创建100个桶，但每个桶中存放的总数据容量和对象/文件数量没有限制。
   
- **对象** ：是存储在OBS中的基本数据单位。用户上传的数据以对象的形式存储在OBS的桶中。对象的属性包括名称Key，Metadata，Data。
  通常，将对象等同于文件进行管理，但是由于OBS是一种对象存储服务，并没有文件系统中的文件和文件夹概念。为了使用户更方便进行管理数据，OBS提供了一种方式模拟文件夹。通过在对象的名称中增加"/"，如tpcds1000/stock.csv，tpcds1000可以等同于文件夹，stock.csv就可以等同于文件名，而对象名称（Key）仍然是tpcds1000/stock.csv、对象的内容就是stock.csv数据文件的内容。
  
- **Key**：对象的名称（键），是经过UTF-8编码的长度大于0且不超过1024的字符序列，一个桶里的每个对象必须拥有唯一的对象键值。用户可使用"桶名+对象名"来存储和获取对应的对象。
- **Metadata** ：对象元数据，用来描述对象的信息。元数据又可分为系统元数据和用户元数据。这些元数据以键值对（Key-Value）的形式随http头域一起上传到OBS系统。
  - 系统元数据由OBS系统产生，在处理对象数据时使用。系统元数据包括：Date、Content-length、last-modify、Content-MD5等。
  
  - 用户元数据由用户上传对象时指定，是用户自己对对象的一些描述信息。
   
- **Data**：对象的数据内容，OBS对于数据的内容是无感知的，即认为对象内的数据为无状态的二进制数据。
- **数据库普通表**：数据库中的普通表，数据源文件中的数据最终并行导入到这些表中存储，包括行存表、列存表。
- **外表**：用于识别数据源文件中的数据。外表中保存了数据源文件的位置、文件格式、编码格式、数据间的分隔符等信息。
 
#### 导入数据原理
OBS导入原理如[图1]所示，CN负责任务的规划及下发，它是按文件给每个DN节点分配任务的。
分配算法如下：
例如，[图1]中，总共有4个节点DN0\~DN3， OBS上有6个文件t1.data.0\~t1.data.5，那么分配方式如下：
t1.data.0 -\> DN0
t1.data.1 -\> DN1
t1.data.2 -\> DN2
t1.data.3 -\> DN3
t1.data.4 -\> DN0
t1.data.5 -\> DN1
其中DN0和DN1上分配了两个文件，其他DN分配了1个文件。
如果OBS上的文件大小都相同时，OBS上的文件数与DN节点数的比例为1:1时导入性能为最好，因为每个DN分配的任务都相同。因此建议将数据文件存储到OBS前，尽可能均匀地将文件切分成多个，文件的数量以DN的整数倍更适合。
图1通过OBS外表并行导入数据   
![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000002221491198.jpg "点击放大")
#### 导入流程图
图2并行导入流程   
![](https://support.huaweicloud.com/migration-dws/figure/zh-cn_image_0000002256410929.png "点击放大")
表1流程说明 
| 流程       | 说明                                                                                                                                                                                                                                                                                                                                                                         | 子任务 |
|:---|:---|:---|
| 上传数据至OBS | 在OBS服务器上规划存储路径，并上传数据文件。 详细请参见[上传数据到OBS](https://support.huaweicloud.com/migration-dws/dws_15_0008.html#ZH-CN_TOPIC_0000002220143832)。                                                      | -   |
| 创建OBS外表  | 创建外表用于识别OBS服务器上的数据源文件。在OBS外表中保存了数据源在OBS服务器上的桶名、对象名、文件格式、存放位置、编码格式、数据间的分隔符等信息。 详细请参见[创建OBS外表](https://support.huaweicloud.com/migration-dws/dws_15_0009.html#ZH-CN_TOPIC_0000002255063553)。 | -   |
| 执行导入数据   | 在创建好外表后，通过INSERT语句，将数据快速、高效地导入到目标表中。 详细请参见[执行导入数据](https://support.huaweicloud.com/migration-dws/dws_15_0010.html#ZH-CN_TOPIC_0000002219983972)。                                           | -   |
| 处理错误表    | 在数据并行导入发生错误时，请根据错误信息，[处理导入错误](https://support.huaweicloud.com/migration-dws/dws_15_0011.html#ZH-CN_TOPIC_0000002254983673)，以保证导入数据的完整性。                                                                                                                                                                                                                                    | -   |
| 优化查询效率   | 导入数据后，通过ANALYZE语句生成表统计信息。ANALYZE语句会将统计结果自动存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据，以生成最有效的查询执行计划。                                                                                                                                                                                                                                                                              | -   |
   
