GDS实践指南 本章节主要介绍GDS最佳实践。 安装GDS前必需确认GDS所在服务器环境的系统参数是否和数据库集群的系统参数一致。 GDS与DWS通信要求物理网络畅通,尽量使用万兆网。因为千兆网无法承载高速的数据传输压力,极易出现断连,使用千兆网时DWS无法提供通信保障。满足万兆网的同时,要求数据磁盘组I/O性能大于GDS单核处理能力上限(约400MB/s),才能保证单文件导入速率最大化。 提前做好服务部署规划,数据服务器上,建议一个Raid只布1~2个GDS。GDS跟DN的数据比例建议在1:3至1:6之间。一台加载机的GDS进程不宜部署太多,千兆网卡部署1个GDS进程即可,万兆网卡机器建议部署不大于4个进程。 提前对GDS导入导出的数据目录做好层次划分,避免一个数据目录包含过多的文件,并及时清理过期文件。 合理规划目标数据库的字符集,强烈建议使用UTF8作为数据库的字符集,不建议使用sqlascii编码,因为极易引起混合编码问题。GDS导出时保证外表的字符集和客户端字符集一致即可,导入时保证客户端编码,数据文件内容编码和客户端一致。 如果存在无法变更数据库,客户端,外表字符集时,可以尝试使用iconv命令进行手动转换。 注意 f 表示源文件的字符集,t为目标字符集 iconv f utf8 t gbk utf8.txt o gbk.txt 关于GDS导入实践可参考“导入数据最佳实践”章节中的“使用GDS导入数据”。 GDS支持CSV、TEXT、FIXED三种格式,缺省为TEXT格式。不支持二进制格式,但是可以使用encode/decode函数处理二进制类型。例如: 对二进制表导出: 创建表。 CREATE TABLE blobtypet1 ( BTCOL BYTEA ) DISTRIBUTE BY REPLICATION; 创建外表 CREATE FOREIGN TABLE fblobtypet1( BTCOL text ) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:7789/', FORMAT 'text', DELIMITER E'x08', NULL '', EOL '0x0a' ) WRITE ONLY; INSERT INTO blobtypet1 VALUES(E'xDEADBEEF'); INSERT INTO blobtypet1 VALUES(E'xDEADBEEF'); INSERT INTO blobtypet1 VALUES(E'xDEADBEEF'); INSERT INTO blobtypet1 VALUES(E'xDEADBEEF'); INSERT INTO fblobtypet1 select encode(BTCOL,'base64') from blobtypet1; 对二进制表导入: 创建表。 CREATE TABLE blobtypet2 ( BTCOL BYTEA ) DISTRIBUTE BY REPLICATION; 创建外表 CREATE FOREIGN TABLE fblobtypet2( BTCOL text ) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:7789/fblobtypet1.dat.0', FORMAT 'text', DELIMITER E'x08', NULL '', EOL '0x0a' ); insert into blobtypet2 select decode(BTCOL,'base64') from fblobtypet2; SELECT FROM blobtypet2; btcol xdeadbeef xdeadbeef xdeadbeef xdeadbeef (4 rows) 对同一张外表重复导出会覆盖之前的文件,因此不要对同一个外表重复导出。 若不确定文件是否为标准的csv格式,推荐将quote参数设置为0x07,0x08或0x1b等不可见字符来进行GDS导入导出,避免文件格式问题导致任务失败。 CREATE FOREIGN TABLE foreignHRstaffSft1 ( MANAGERID NUMBER(6), sectionID NUMBER(4) ) SERVER gsmppserver OPTIONS (location 'file:///inputdata/', format 'csv', mode 'private', quote '0x07', delimiter ',') WITH errHRstaffSft1; GDS支持并发导入导出,gds t参数用于设置gds的工作线程池大小,控制并发场景下同时工作的工作线程数且不会加速单个sql任务。gds t缺省值为8,上限值为200。在使用管道功能进行导入导出时,t参数应不低于业务并发数。 GDS外表参数delimiter是多字符时,建议TEXT格式下字符不要完全相同,例如不建议使用delimiter ''。 GDS多表并行导入同一个文件提升导入性能(仅支持text和csv文件)。 创建目标表。 CREATE TABLE pipegdswidetb1 (city integer, telnum varchar(16), cardcode varchar(15), phonecode vcreate table pipegdswidetb3 (city integer, telnum varchar(16), cardcode varchar(15), phonecode varchar(16), regioncode varchar(6), stationid varchar(10), tmsi varchar(20), recdate integer(6), rectime integer(6), rectype numeric(2), switchid varchar(15), attachcity varchar(6), opc varchar(20), dpc varchar(20)); 创建带有filesequence字段的外表。 CREATE FOREIGN TABLE gdspipcsvr1( like pipegdswidetb1) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/widetb.txt', FORMAT 'text', DELIMITER E'+', NULL '', filesequence '51'); CREATE FOREIGN TABLE gdspipcsvr2( like pipegdswidetb1) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/widetb.txt', FORMAT 'text', DELIMITER E'+', NULL '', filesequence '52'); CREATE FOREIGN TABLE gdspipcsvr3( like pipegdswidetb1) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/widetb.txt', FORMAT 'text', DELIMITER E'+', NULL '', filesequence '53'); CREATE FOREIGN TABLE gdspipcsvr4( like pipegdswidetb1) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/widetb.txt', FORMAT 'text', DELIMITER E'+', NULL '', filesequence '54'); CREATE FOREIGN TABLE gdspipcsvr5( like pipegdswidetb1) SERVER gsmppserver OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/widetb.txt', FORMAT 'text', DELIMITER E'+', NULL '', filesequence '55'); 将widetb.txt并发导入到pipegdswidetb1。 parallel on INSERT INTO pipegdswidetb1 SELECT FROM gdspipcsvr1; INSERT INTO pipegdswidetb1 SELECT FROM gdspipcsvr2; INSERT INTO pipegdswidetb1 SELECT FROM gdspipcsvr3; INSERT INTO pipegdswidetb1 SELECT FROM gdspipcsvr4; INSERT INTO pipegdswidetb1 SELECT FROM gdspipcsvr5; parallel off filesequence参数详细内容,可参考《开发指南》中的“CREATE FOREIGN TABLE (GDS导入导出)”。