GaussDB(DWS)数据利器GDS探析

举报
常常要奋斗 发表于 2024/01/09 11:46:16 2024/01/09
【摘要】 GaussDB(DWS)数据利器GDS探析 GaussDB(DWS)数据利器GDS探析 1. 前言 2. GDS根基 2.1 GDS根基 2.2 GDS自定义FDW 3. 多角度缔造高性能 3.1 多线程工作模式 3.2 事件消息驱动机制 3.3 大文件导入优化 3.4 SMP特性支持导入场景 4. 全方位丰富功能 4.1 容错机制 4.2 编码解析 4.3 多字符字段/换行分割符 4.4...

GaussDB(DWS)数据利器GDS探析

1. 前言

  • 适用版本:【Gauss 200以上】

GDS是GaussDB(DWS)提供的一个数据导入导出工具,可在支持多种场景下的数据迁移业务,如异型数据库之间、两个集群之间等。GDS性能较高,单核处理能力上限约400MB/s,相比COPY、\COPY工具性能更优、运行更稳定、容错性更强。

2. GDS根基

GDS基于FDW,全称是Foreign Data Wrapper(外部数据包装器)。这个功能是PostgreSQL 9.1首次引入的,实现了部分SQL/MED的特性。

2.1 GDS根基

顾名思义,这个功能与数据库外部的数据有关系,对于外数据的具体描述是通过外部表来定义的。以GDS外部表创建语句为例说明外部表的结构:

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name
( [ { column_name type_name POSITION(offset,length) | LIKE source_table } [, ...] ] )
SERVER gsmpp_server
OPTIONS ( { option_name ' value ' } [, ...] )
[ { WRITE ONLY | READ ONLY }]
[ WITH error_table_name | LOG INTO error_table_name]
[REMOTE LOG 'name']
[PER NODE REJECT LIMIT 'value']
[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];

可以看出,外部表可以分为三部分:字段定义、server定义、options定义。其中:

(1)字段属性定义与本地表定义方式类似,甚至可以使用like L_TBL等语法进行定义;

(2)server定义,需要使用CREATE SERVER xxx_server创建;

(3)options选项,由与该外表相关的FDW实现决定。

在GDS使用过程中,安装自定义FDW、创建server等配置都是在initdb阶段执行,无须用户额外设置。Postgres现在有很多FDW扩展,其中postgres_fdw、file_fdw是由官方全球开发组维护,postgres_fdw可用于访问远程PostgreSQL服务器。

2.2 GDS自定义FDW

根据导入导出场景,GaussDB(DWS)实现了自定义的FDW扩展——dist_fdw。dist_fdw运行于GaussDB内核之中,在initdb时进行安装,所以一般情况下对用户是透明的。

3. 多角度缔造高性能

3.1 多线程工作模式

GDS使用多线程模式,由主线程负责接收请求,然后分配给工作线程进行具体的业务处理,可以并发处理导入导出业务。主线程与工作线程通过UnixSocket进行通信,通信内容包括:分派新任务、停止工作线程、工作线程状态上报等。

每个线程可承载多个导入导出业务,通过与事件消息驱动机制相结合,实现高速网络通信,确保业务执行高性能、高并发。

img_1.png

3.2 事件消息驱动机制

GDS采用事件驱动模型,选择当前系统可支持的最高效的多路复用机制(epoll、poll、select等)。

img_2.png

3.3 大文件导入优化

对于超大文件的导入,如果仍然与普通文件一样,继续采用串行方式导入,必然会成为业务瓶颈,导致数据迁移、备份等过程的无限延长,无法充分发挥多核机器、GDS多线程架构的优势。针对该场景,GDS引入分片导入机制,实现并行导入,充分发挥软硬件性能,减少业务阻塞,减少数据迁移耗时。

该功能针对本地文件的导入场景,需通过外表file_sequence参数进行相应设置。

该参数格式为file_sequence ‘文件被拆分的总数-当前分片’ 。例如:

file_sequence ‘3-1’ 表示导入的文件在逻辑上被拆分成3份,当前外表导入的数据为第一个分片上的数据。

file_sequence ‘3-2’ 表示导入的文件在逻辑上被拆分成3份,当前外表导入的数据为第二个分片上的数据。

file_sequence ‘3-3’ 表示导入的文件在逻辑上被拆分成3份,当前外表导入的数据为第三个分片上的数据。

这里给出一个使用示例:

– step1. 创建目标表

CREATE TABLE gds_widetb_1 (city integer, tel_num varchar(16), card_code varchar(15), phone_code vcreate table pipegds_widetb_3 (city integer, tel_num varchar(16), card_code varchar(15), phone_code varchar(16), region_code varchar(6), station_id varchar(10), tmsi varchar(20), rec_date integer(6), rec_time integer(6), rec_type numeric(2), switch_id varchar(15), attach_city varchar(6), opc varchar(20), dpc varchar(20));

–step2. 创建带有file_sequence字段的外表。

CREATE FOREIGN TABLE gds_csv_r_1( like gds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '3-1');
CREATE FOREIGN TABLE gds_csv_r_2( like gds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '3-2');
CREATE FOREIGN TABLE gds_csv_r_3( like gds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '3-3');

–step3. 将wide_tb.txt并发导入到gds_widetb_1。

\parallel on
INSERT INTO gds_widetb_1 SELECT * FROM gds_csv_r_1;
INSERT INTO gds_widetb_1 SELECT * FROM gds_csv_r_2;
INSERT INTO gds_widetb_1 SELECT * FROM gds_csv_r_3;
\parallel off

3.4 SMP特性支持导入场景

SMP特性通过算子并行来提升性能,本质上是一种利用富余资源来换取时间的方案,计划并行之后会占用更多的系统资源,包括CPU、内存、网络、I/O等等。在合适的场景以及资源充足的情况下,能够起到较好的性能提升效果。SMP支持自适应特性,该特性会根据当前资源和查询特征,动态选取最优的并行度。SMP特性支持支持GDS导入的外表扫描并行,当集群资源充足时,可以发挥各节点性能,加速导入执行效率。

4. 全方位丰富功能

4.1 容错机制

提供了强大的容错机制,包括错误默认处理、错误表、错误日志等多种方式,减少数据导入导出异常中止的情况,方便用户事后查询分析。

4.2 编码解析

支持多种类型的字符编码,包括UTF-8、GBK、ASCII、LATIN1等。

4.3 多字符字段/换行分割符

对于外表属性,分隔符delimiter、行分隔符eol,既兼容原有的逗号、\n等默认方式,还支持用户自定义多字符分隔符,最多可支持10个字节。在场景复杂、噪声较多、数据量很大的场景下,单字符分隔符很容易与数据本身冲突,而使用多字符分隔符,可以减少这种冲突,且可以轻容兼容异构数据库,方便用户进行数据处理。

4.4 数据不落地

此前GDS只支持本地文件的导入导出,因此无论是数据加工清洗或者是远端数据的导入导出都需要在GDS本地生成一份中间数据,这对用户来说不仅消耗磁盘空间并且很不方便。据此,开发人员对不落地导入导出特性进行了规划和实现,提供了另外一种导入导出方式,不仅节省了用户的磁盘空间而且让GDS的使用变得更加灵活多变。具体使用方式参见用户手册。

5. 展望

随着数据仓库业务的发展,GDS使用场景日益增多,这就要求GDS仍要不断迭代,充分深入挖掘用户需求,提高产品化程度。继往开来,GDS一批新特性已展开规划,如自动化工具、过程监控工具、云化等等。未来可期,作为GaussDB(DWS)的强有力数据迁移工具,GDS会继续强化,丰富产品生态。

6. GDS导入示例

6.1 GDS导入简介

数据并行导入过程中,需要通过创建外表时设置的导入模式和数据源文件位置等参数,来定位数据源文件。LibrA支持的导入模式有Normal(推荐使用)SharedPrivate。请从支持的导入模式的扩展性、可操作性、支持的数据格式等维度分析,规划适合的并行导入模式。并根据所规划的导入模式,配置相应的数据服务器,存放数据源文件,文档采用Noremal模式详情请查阅:产品文档-开发者指南-导入数据-创建外表-规划导入模式)。

通过GDS外表设置的导入模式、导入数据格式等信息来识别数据源文件,利用多DN并行的方式,将数据从数据源文件导入到数据库中,从而提高整体导入性能。数据源文件存放在普通文件系统中,不支持在HDFS文件系统直接指定数据源

优势:

  1. CN只负责任务的规划及下发,把数据导入的工作交给了DN,释放了CN的资源,使其有能力处理外部请求。

  2. 通过使各DN都参与数据导入,充分利用各设备的计算能力及网络带宽。

  3. 支持导入过程中对数据做预处理。

  4. 支持在导入过程中,针对数据格式错误设置导入容错性,并可在导入结束后根据错误信息定位错误数据。

劣势:

需要创建外表,并且对于NORMAL模式需要启动GDS服务。

适用场景:

高并发、大数据量导入。

通过外表并行导入数据:

img_3.png

相关概念:

  • 数据源文件:存储有数据的TEXT、CSV或FIXED结尾的文件。文件中保存的是待导入数据库的数据。

  • 外表:用于存放数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息,关联数据文件与数据库实表的对象。

  • GDS:数据服务工具。向LibrA导入数据时,需要将此工具部署到数据源文件所在的服务器上,使DN可以通过该工具获取数据。

  • 数据库普通表:数据库中的表,数据源文件中的数据最终导入到这些表中存储,包括行存表和列存表。

  • 数据服务器:数据源文件所在的服务器称为数据服务器。由于使用GDS工具导入时,GDS需要安装在数据服务器上(可以理解为客户端),因此数据服务器也是GDS服务器。

6.2 GDS导入流程

img_4.png

6.3 操作步骤

此处引用text格式作为数据源文件,CSV格式和FIXED 格式详见产品文档-开发者指南-导入数据-创建外表-识别导入数据格式章节

关于数据容错性 请见产品文档-开发者指南-导入数据-创建外表-规划导入容错性

  1. 以root用户登录用于存放数据源文件的服务器(又称数据服务器或GDS服务器);确认libra到gds客户端的网络链路是通的,ip白名单已添加客户端IP。

  2. 创建数据文件存放目录“/input_data”。

    mkdir -p /input_data
    

    将数据源文件上传至上一步所创建的目录中。

  3. 在数据服务器上安装配置并启动GDS,

    gds -d /input_data/ -p client_ip:5000 -H 0.0.0.0/0 -l /log/gds_log.txt -D -t 2
    
    with error_t1_foreign;
    

    -d 待导入数据文件目录;

    -p 设置GDSIP和端口。未指定时,IP的默认值为127.0.0.1,端口的默认值为8098(请确认网关和端口是开放的);**

    -H 设置允许连接到GDS的主机(参数为CIDR格式,仅支持linux系统);

    -l 设置GDS日志文件;

    -D 设置GDS后台运行,一般都指定该选项;

  4. 添加用户和用户组 groupadd wheel(数据库用户及所属用户组已存在,可跳过本步骤)。

    useradd -g wheel omm若出现以下提示,

    useradd: Account 'omm' already exists.
    
    groupadd: Group 'wheel' already exists.
    
  5. 修改数据源文件目录属主为omm

    chown -R omm:wheel /input_data 
    

    通过URL方式设置外表创建时的参数“location”,用于指定数据源文件。

    URL末尾必须指定文件的匹配模式或者文件名。多个URL之间使用‘|’间隔。

    URL个数应小于DN个数,且不能使用多个地址相同的URL。

  6. 创建外表

    create foreign table t1_foreign(a1 varchar2(10), a2 int)
    
    SERVER gsmpp_server OPTIONS (location 'gsfs:// client_ip:5000/t1.txt',
    
    format ‘text’, encoding ‘utf8’, delimiter ‘^, null ‘’)per node reject limit ‘value’
    
  7. 参数介绍

    with error_t1_foreign;
    

    gsfs:该外表对应的文件或者路径,可以指定多个文件或目录并行导入;

    format:数据源文件的格式,有三种text、csv、fixed(定长),默认是text;

    encoding:数据源文件编码格式,默认是数据库编码格式;

    delimiter:数据源文件行数据的字段分隔符,支持多字符;如果csv格式,还要指定quote选项;

    null:数据源文件中把什么字符识别为null;

    per node reject_limit:指定本次数据导入过程中每个DN实例上允许出现的数据格式错误的数量,如果有一个DN实例上错误数量大于设定值,本次导入失败,报错退出。

    with 数据导入过程中出现的数据格式错误信息将被写入error_table_name指定的错误信息表中。

    示例:

    GDS数据服务器IP为192.168.0.90,假定启动GDS时设置的**端口为5000,设置的数据文件存放目录为“/input_data”,实际的数据文件存放目录为“/input_data/import/”。

    根据以上情况,在创建外表时,指定参数“location”为“gsfs://192.168.0.90:5000/import/”。如有多个gds服务location可以“|” 为分隔符连接多个gds,location gsfs://192.168.0.90:5000/| gsfs://192.168.0.91:5000/*’,

  8. 导入数据

    1. 验证数据源是否能正常查询出数据,
    Select * from  foreign_table_name limit 10;
    
    1. 通过查询外表将数据插入内表
    Insert into inner_tablename_select * from   foreign_table_name;
    
    1. 查询错误信息表err_tpcds_reasonS,处理数据加载错误。
    SELECT * FROM err_tpcds_reasonS
    
    1. 处理错误表详见:产品文档-开发者指南-导入数据-创建外表-处理错误表

6.4 注意事项

  1. 导入数据时源数据不能放在dn节点,否则会出现数据倾斜,造成gds性能不佳;(dn数据离源数据越近 越容易获取数据(数据的亲源性),而其他的数据节点会出现负载严重偏离的情况,可以1.top 查看gds 进程号 2.gstack pid查看进程 3.iostat -x 1 10 查看Io速率)

  2. 导入数据时 可以将源数据放在相同服务器的不同磁盘下面 并且保证数据文件的唯一性(有重复的文件会导致 导入表数据的冗余,目前Gds还无法识别相同文件数据

  3. 保证表的数据列哈希值得唯一性 (如果数值不唯一则会形成数据被存储到单个dn 造成数据倾斜

  4. 一台服务器可以启动3个gds服务 分不同端口 性能最佳

6.5 GDS数据导出

规划数据服务器与集群处于同一内网,数据服务器和数据节点不在同一集群,数据源文件格式为CSV,所以规划的并行导出模式为Remote模式。

  1. 客户端创建数据接收目录

    mkdir -p /out_date
    
  2. 添加用户和组

    groupadd wheel;useradd -g wheel omm
    
  3. 修改数据源文件目录属主为omm

    chown -R omm:wheel /output_data
    
  4. 启动GDS服务

    /opt/bin/gds/gds -d /output_data -p  192.168.0.90:5005 -H 10.10.0.1/24D
    
  5. 在数据库中创建外表foreign_tpcds_reasonS用于接收数据服务器上的数据。

    由于启动GDS时,设置的导出数据文件存放目录为“/output_data/”,GDS**端口为5005。创建的导出数据文件存放目录为“/output_data/”。所以设置参数“location”为“gsfs://192.168.0.90:5005/”。

  6. 相关参数说明

    数据文件格式(format)为CSV。

    编码格式(encoding)为UTF-8。

    字段分隔符(delimiter)为E’\x08’。

    引号字符(quote)为0x1b。

    数据文件中空值(null)为没有引号的空字符串。

    逃逸字符(escape)为默认值双引号。

    数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。

  7. 创建的外表

    CREATE FOREIGN TABLE foreign_tpcds_reasonS
    (
      r_reason_sk    integer        not null,
      r_reason_id    char(16)       not null,
      r_reason_desc  char(100)
    ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5005/', format 'CSV',encoding 'utf8',delimiter E'\x08', quote E'\x1b', null '') WRITE ONLY;在数据库上,通过外表foreign_tpcds_reasonS,将数据导出到数据文件中。
    
    INSERT INTO foreign_tpcds_reasonS SELECT * FROM reasonS;
    
  8. 以omm用户登录数据服务器,停止GDS。

    ps -ef|grep gds
    
    omm 128954      1  0 15:03 ?        00:00:00 gds -d /output_data -p 192.168.0.90:5005 -D
    
    omm 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    
    kill -9 128954
    

7. 参考文档

  1. 《GaussDB for DWS数据融合系列第六期:GDS导入数据》 https://bbs.huaweicloud.com/blogs/259233
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。