更新时间:2022-08-16 GMT+08:00

关于OBS并行导入

对象存储服务OBS(Object Storage Service)是云上提供的一个基于对象的海量存储服务,为客户提供安全、高可靠、低成本的数据存储能力。OBS为用户提供了超大存储容量的能力,适合存放任意类型的文件。

数据仓库服务GaussDB(DWS)使用OBS作为集群数据与外部数据互相转化的平台,实现安全、高可靠和低成本的存储需求。

GaussDB(DWS)支持将OBS上TXT、CSV、ORC、CARBONDATA格式的数据导入到集群进行查询,也支持远程读OBS上的数据。因此对于经常查询的热数据建议直接导入GaussDB(DWS)后再做查询。偶尔查询的冷数据可以存储在OBS上直接远程读以节省成本。

目前,导入数据有两种方式:

  • 方式一:无需用户创建server,使用默认server创建外表,支持TXT、CSV格式的数据,参见从OBS导入CSV,TXT数据
  • 方式二:需用户创建server,使用该server创建外表,支持ORC、CARBONDATA、TXT以及CSV格式的数据,参见从OBS导入ORC,CARBONDATA数据
  • OBS导入导出数据时,不支持中文路径。
  • OBS导入导出数据时,暂不支持跨Region进行OBS数据导入导出,必须确保OBS和DWS集群在同一个Region中。

概述

在数据迁移、ETL(Extract-Transform-Load)过程中,需要向GaussDB(DWS)并行导入海量数据,使用普通方式会耗费大量的时间。GaussDB(DWS)提供了OBS(Object Storage Service)及外表接口,通过OBS外表设置的导入URL路径、导入数据格式等信息来识别数据源文件,利用多DN(Datanode)并行的方式,实现了数据的快速并行导入。

优势:
  • CN只负责任务的规划及下发,把数据导入的工作交给了DN,释放了CN的资源,使其有能力处理外部请求。
  • 通过让各个DN都参与数据导入,充分利用各个设备的计算能力及网络带宽。
  • 支持导入过程中对数据做预处理。
  • 支持在导入过程中,针对数据格式错误设置导入容错性,并可在导入结束后根据错误信息定位错误数据。

劣势:

需要创建OBS外表,并且要在OBS服务器上存放导入数据。

适用场景:

高并发、大数据量导入。

相关概念

  • 数据源文件:存储有数据的TEXT、CSV、ORC、CARBONDATA文件。文件中保存的是待并行导入数据库的数据。
  • OBS:对象存储服务,是一种可存储文档、图片、影音视频等非结构化数据的云存储服务。向GaussDB(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外表并行导入数据

导入流程图

图2 并行导入流程
表1 流程说明

流程

说明

子任务

上传数据至OBS。

在OBS服务器上规划存储路径,并上传数据文件。

详细请参见上传数据到OBS

-

创建OBS外表。

创建外表用于识别OBS服务器上的数据源文件。在OBS外表中保存了数据源在OBS服务器上的桶名、对象名,文件格式、存放位置、编码格式、数据间的分隔符等信息。

详细请参见创建OBS外表

-

执行导入数据。

在创建好外表后,通过INSERT语句,将数据快速、高效地导入到目标表中。

详细请参见执行导入数据

-

处理错误表。

在数据并行导入发生错误时,请根据错误信息,处理错误表,以保证导入数据的完整性。

-

优化查询效率。

导入数据后,通过ANALYZE语句生成表统计信息。ANALYZE语句会将统计结果自动存储在系统表PG_STATISTIC中。执行计划生成器会使用这些统计数据,以生成最有效的查询执行计划。

-