GDS實踐指南
更新時間 2025-07-01 17:59:08
最近更新時間: 2025-07-01 17:59:08
分享文章
本章節主要介紹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作為數據庫的字符集,不建議使用sql_ascii編碼,因為極易引起混合編碼問題。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 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;
對二進制表導入:
--創建表。
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導入導出,避免文件格式問題導致任務失敗。
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文件)。
-- 創建目標表。
CREATE TABLE pipegds_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));
-- 創建帶有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導入導出)”。