GDS实践指南
- 安装GDS前必须确认GDS所在服务器环境的系统参数是否和数据库集群的系统参数一致。
- GDS与GaussDB(DWS)通信要求物理网络畅通,尽量使用万兆网。因为千兆网无法承载高速的数据传输压力,极易出现断连,使用千兆网时GaussDB(DWS)无法提供通信保障。满足万兆网的同时,要求数据磁盘组I/O性能大于GDS单核处理能力上限(约400MB/s),才能保证单文件导入速率最大化。
- 提前做好服务部署规划,数据服务器上,建议一个Raid只布1~2个GDS。GDS跟DN的数据比例建议在1:3至1:6之间。一台加载机的GDS进程不宜部署太多,千兆网卡部署1个GDS进程即可,万兆网卡机器建议部署不大于4个进程。
- 提前对GDS导入导出的数据目录做好层次划分,避免一个数据目录包含过多的文件,并及时清理过期文件。
- 合理规划目标数据库的字符集,强烈建议使用UTF8作为数据库的字符集,不建议使用sql_ascii编码,因为极易引起混合编码问题。GDS导出时保证外表的字符集和客户端字符集一致即可,导入时保证客户端编码,数据文件内容编码和客户端一致。
- 如果存在无法变更数据库,客户端,外表字符集时,可以尝试使用iconv命令进行手动转换。
1 2
#注意 -f 表示源文件的字符集,-t为目标字符集 iconv -f utf8 -t gbk utf8.txt -o gbk.txt
-
关于GDS导入实践可参考使用GDS导入数据。
-
GDS支持CSV、TEXT、FIXED三种格式,缺省为TEXT格式。不支持二进制格式,但是可以使用encode/decode函数处理二进制类型。例如:
对二进制表导出:1 2 3 4 5 6 7 8 9 10 11 12
--创建表。 CREATE TABLE blob_type_t1 ( BT_COL BYTEA ) DISTRIBUTE BY REPLICATION; -- 创建外表 CREATE FOREIGN TABLE f_blob_type_t1( BT_COL text ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:7789/', FORMAT 'text', DELIMITER E'\x08', NULL '', EOL '0x0a' ) WRITE ONLY; INSERT INTO blob_type_t1 VALUES(E'\\xDEADBEEF'); INSERT INTO blob_type_t1 VALUES(E'\\xDEADBEEF'); INSERT INTO blob_type_t1 VALUES(E'\\xDEADBEEF'); INSERT INTO blob_type_t1 VALUES(E'\\xDEADBEEF'); INSERT INTO f_blob_type_t1 select encode(BT_COL,'base64') from blob_type_t1;
对二进制表导入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
--创建表。 CREATE TABLE blob_type_t2 ( BT_COL BYTEA ) DISTRIBUTE BY REPLICATION; -- 创建外表 CREATE FOREIGN TABLE f_blob_type_t2( BT_COL text ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:7789/f_blob_type_t1.dat.0', FORMAT 'text', DELIMITER E'\x08', NULL '', EOL '0x0a' ); insert into blob_type_t2 select decode(BT_COL,'base64') from f_blob_type_t2; SELECT * FROM blob_type_t2; bt_col ------------ \xdeadbeef \xdeadbeef \xdeadbeef \xdeadbeef (4 rows)
-
若不确定文件是否为标准的csv格式,推荐将quote参数设置为0x07,0x08或0x1b等不可见字符来进行GDS导入导出,避免文件格式问题导致任务失败。
1 2 3 4 5
CREATE FOREIGN TABLE foreign_HR_staffS_ft1 ( MANAGER_ID NUMBER(6), section_ID NUMBER(4) ) SERVER gsmpp_server OPTIONS (location 'file:///input_data/*', format 'csv', mode 'private', quote '0x07', delimiter ',') WITH err_HR_staffS_ft1;
-
GDS支持并发导入导出,gds -t参数用于设置gds的工作线程池大小,控制并发场景下同时工作的工作线程数且不会加速单个sql任务。gds -t缺省值为8,上限值为200。在使用管道功能进行导入导出时,-t参数应不低于业务并发数。
- GDS外表参数delimiter是多字符时,建议TEXT格式下字符不要完全相同。例如,不建议使用delimiter '---'。
- GDS多表并行导入同一个文件提升导入性能(仅支持text和csv文件)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
-- 创建目标表。 CREATE TABLE pipegds_widetb_1 (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)); -- 创建带有file_sequence字段的外表。 CREATE FOREIGN TABLE gds_pip_csv_r_1( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '5-1'); CREATE FOREIGN TABLE gds_pip_csv_r_2( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '5-2'); CREATE FOREIGN TABLE gds_pip_csv_r_3( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '5-3'); CREATE FOREIGN TABLE gds_pip_csv_r_4( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '5-4'); CREATE FOREIGN TABLE gds_pip_csv_r_5( like pipegds_widetb_1) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://127.0.0.1:8781/wide_tb.txt', FORMAT 'text', DELIMITER E'|+|', NULL '', file_sequence '5-5'); --将wide_tb.txt并发导入到pipegds_widetb_1。 \parallel on INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_1; INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_2; INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_3; INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_4; INSERT INTO pipegds_widetb_1 SELECT * FROM gds_pip_csv_r_5; \parallel off
file_sequence参数详细内容,可参考CREATE FOREIGN TABLE (GDS导入导出)章节。