DWS并行导入导出的使用
GDS是DWS的并行加载工具。原理是通过gds与dn建立连接、发送数据到dn端,然后dn端再通过hash算法对数据进行redistribute,从而实现数据入库,核心思想是充分利用所有节点的计算能力和I/O能力,以提升性能。
GaussDB(DWS)的数据并行导入实现了对指定格式(支持CSV/TEXT格式)的外部数据高速、并行入库。所谓高速、并行入库是和传统的使用INSERT语句逐条插入的方式相比较。
首先讲一下最简单也是最常用的使用方法:
上传gds可执行文件到数据服务器上,启动gds服务,执行gds –p port –d dir –l log –r –D
在数据库中创建foreign table,Pg本身支持foreign table通过fdw访问本地文件,方法请参考:http://blog.csdn.net/hantiannan/article/details/7553804
create foreign table test_ft(id int)
SERVER gsmpp_server
OPTIONS(location
'gsfs://10.X.X.X:9527/test/test_20200530_*|gsfs://10.X.X.X:9527/test/test_20200530_*',
format 'text',
delimiter '&',
encoding 'utf8',
mode 'Normal'
);
执行导入,如此简单,数据就入库了
Insert into test select * from test_ft;
以上是最简单的用法,然后我们来展开讲一下各个接口
gds工具接口:
gds [options]:
-d dir Set data directory.
-p port Set GDS listening port.
ip:port Set GDS listening ip address and port.
-l log_file Set log file.
-H secure_ip_range Set secure IP checklist in CIDR notation. Required for GDS to start.
-e dir Set error log directory.
-E size Set size of per error log segment.(0 < size < 1TB)
-S size Set size of data segment.(1MB < size < 100TB)
-R size Set size of log rotate.(1MB < size < 1TB) default 16M
-t worker_num Set number of worker thread in multi-thread mode, the upper limit is 200. If without setting, the default value is 8.
--enable-ssl Set GDS connection with SSL security.
--ssl-dir Set the directory holding certificate files.
--debug-level Set the debug level, which decides how much debug information we print in log. Default value is 0.
0: OFF. Keep the minimum amount of log. Only contains session descriptions.
1: NORMAL. Log the basic "connnect" and "disconnect" information. Useful for identify issues with network traffics.
2: ON. Keep detailed log about node connections, package sent and received, status information.
--pipe-timeout Set the pipe timeout for no landing export/import (>1s). Default 1h/60m/3600s.
-s status_file Enable GDS status report.
-D Run the GDS as a daemon process.
-r Read the working directory recursively.
-V Show the compiled version information.
-h Display usage.
-d是数据目录,目录中可以嵌套目录,指定-r参数可以递归查找数据文件,-p是gds服务启动的端口号,-l是指定日志文件,-H是指定监听IP,-e是指定错误日志目录,-E是指定错误日志文件大小,-S是指定导出文件大小,-s是指定gds状态报告文件,-D是指定gds后台运行
Foreign table:
以如下外表为例
create foreign table test_ft(id int)
SERVER gsmpp_server
OPTIONS(location
'gsfs://10.X.X.X:9527/test/test_20200530_*|gsfs://10.X.X.X:9527/test/test_20200530_*',
format 'text',
delimiter '&',
encoding 'utf8',
mode 'Normal'
) READ ONLY
LOG INTO ft_1_error PER NODE REJECT LIMIT 'unlimited';
(1)首先需要foreign table与需要入库的普通表一样的表结构,或者在执行导入的时候通过select选取与普通表同结构的列;
(2)location字段是gds地址,同一个外表可填写多个gds地址,需要用竖线隔开,可以在地址中添加目录结构和文件名前缀和后缀等正则,此处的gds地址ip:port不能重复;
(3)format指定数据文件格式,支持csv、text、fixed格式,csv格式可以指定quote把列引起来,适用于数据列中有换行符、数据中有分隔符重复的字符等数据比较复杂的场景,text没有什么特别的地方,fixed是定长格式,所谓定长格式是指每一行的长度已知是固定的;csv格式文件需要指定quote,列被quote包括起来,常用于字段中有换行场景,fixed格式文件需要指定列的offset和length,举例如下:
CREATE foreign TABLE test_ft
(
R_REGIONKEY INT POSITION(0,10) NOT NULL
, R_NAME CHAR(25) POSITION(20,30) NOT NULL
, R_COMMENT VARCHAR(152) POSITION(60,200)
)
SERVER gsmpp_server
OPTIONS (location 'gsfs://10.X.X.X:10000/test.txt', format 'fixed',encoding 'utf8', mode 'normal') ;
POSITION(0,10)表示从0位置开始,列长度为10,POSITION的先后顺序可以不按照列顺序,但是列与列之间不可有重叠;
(4)delimiter和quote,
delimiter指定分隔符,目前支持多字节分隔符,分隔符可以选用符号、不可见字符等,保证数据中没有与分隔符重复的字符;不可见字符的举例如下:
客户场景常用0x1b作为分隔符,
create foreign table test_ft(id int)
SERVER gsmpp_server
OPTIONS(location 'gsfs://10.X.X.X:9527 ',
format 'csv', encoding 'latin1',delimiter E'\x1B') ;
quote指定引号,目前支持单字节引号,引号可以选用符号、不可见字符等,保证数据中没有与引号重复的字符;不可见字符的举例如下:
create foreign table test_ft(id int)
SERVER gsmpp_server
OPTIONS(location 'gsfs://100.X.X.X:9527 ',
format 'csv', encoding 'latin1',delimiter E'\x1B',quote E’\x08’) ;
(5)encoding指定入库时候的编码格式,有中文字符时必须指定,默认是client_encoding;
例如数据文件编码为ISO-8859,建议server_encoding为latin1或者sql_ascii,设置外表的encoding为GBK,保证入库时数据文件不被转换编码,查询时,设置clent_encoding为GBK,即可正常显示中文;
(6)mode指定导入模式,支持normal、shared、private模式,一般常用normal模式,shared模式需要使用nfs,很少使用,private模式需要把数据文件放置在各个dn本机规划好的目录里,在单物理机dn比较多的情况也能取得不错的导入性能;
private模式举例如下:
create foreign table test_ft(id int)
SERVER gsmpp_server OPTIONS (location 'file:///input_data/*', format 'CSV', mode 'private', delimiter E'\x08', quote E'\x1b', null '');
上述外表,需要在每台物理机上创建/input_data目录,然后在该目录下创建跟各dn的pgxc_node_name对应的目录,例如/input_data/dn_6001_6002,将待导入的数据文件放在目录里;
(7)错误数据处理,可以指定导出错误数据到错误表或者gds端;
错误表举例:LOG INTO ft_1_error PER NODE REJECT LIMIT '10'
创建外表时会创建一个round robin分布的错误表ft_1_error,单dn容错条数上限10个,这里是指在某个dn上
导出错误数据到gds举例:REMOTE LOG PER NODE REJECT LIMIT '10'
错误数据会以文件形式保存在gds启动时-e指定的目录中
可容错的类型主要是多列少列等,如果违反not null约束这种是无法容错的,会导致导入报错退出;
(8)忽略转义
如果数据中有\反斜杠,反斜杠在分隔符和引号会造成转义,导致错位;
忽略转义选项举例如下:
CREATE FOREIGN TABLE test_ft(id int)
SERVER gsmpp_server
OPTIONS (location 'gsfs://10.X.X.X:10000/test/*', format 'text',delimiter '^',
noescaping 'true');
(9)忽略多余列
如果数据文件一行数据比表结构多,可以使用忽略多余列功能;
忽略多余列举例如下:
CREATE FOREIGN TABLE test_ft(id int)
SERVER gsmpp_server
OPTIONS (format 'text', location 'gsfs://10.X.X.X:6001/*',ignore_extra_data 'true');
执行导入:
导入语句可以是简单的insert into test select * from test_ft,这种情况要求foreign table与普通表表结构完全一致,另外可以选择性的导入,例如insert into test select id from test_ft where id>100;另外也可以使用系统函数,例如insert into test select sysdate,id from test_ft;事实上,按照设计,只要是能下推的查询语句都可以用于gds导入。
以如下导出外表为例:
create foreign table test_ft(id int)
SERVER gsmpp_server
OPTIONS(location
'gsfs://10.X.X.X:40006/| gsfs://10.X.X.X:40007/',
format 'text',
delimiter '&',
encoding 'gbk',
EOL ‘0x0A’
)write only;
(1)行结束符
EOL选项可选值为0x0D0A和0x0A,分别为windows和unix的换行符;
(2)导出到DN本地
导出到本地外表举例如下:
create foreign table test_ft(id int)
SERVER gsmpp_server
OPTIONS (location '/home/pgdba/', format 'text', encoding 'latin1',eol '0x0D0A',delimiter E'\x1B') WRITE ONLY;
执行导出,会在指定的/home/pgdba目录下自动创建dn编号命名的目录,将单个DN的数据导出到对应目录中;
(3)导出到数据服务器
将业务数据导出到集群之外的主机上,这是最常用的导出方式,可以在导出外表中指定多个gds地址,数据会均匀导出到各个gds对应的目录,不可将多个gds起在同一个目录上,导出时会覆盖。
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技~
- 点赞
- 收藏
- 关注作者
评论(0)