將本地表并行導(dǎo)出至OSS引擎
將本地表并行導(dǎo)出至OSS引擎可以極大地提升數(shù)據(jù)導(dǎo)出效率。本文介紹了將本地表并行導(dǎo)出至OSS引擎的相關(guān)內(nèi)容。
使用限制
PolarDB MySQL版集群的產(chǎn)品版本需為企業(yè)版并滿足以下版本要求:
8.0.1版本:修訂版本需達(dá)到8.0.1.1.38或更高。
8.0.2版本:修訂版本需達(dá)到8.0.2.2.25或更高。
僅支持并行導(dǎo)出單表查詢的結(jié)果。不支持Join、Order By、Group By等多表查詢和復(fù)雜查詢的結(jié)果。
建議您在只讀節(jié)點(diǎn)執(zhí)行導(dǎo)出任務(wù)。您可以在SQL語(yǔ)句中添加HINT語(yǔ)法
/*FORCE_SALVE*/
或直接連接只讀節(jié)點(diǎn)進(jìn)行導(dǎo)出。
參數(shù)說(shuō)明
參數(shù)名稱 | 參數(shù)級(jí)別 | 參數(shù)說(shuō)明 |
loose_oss_outfile_buffer_size | Global | 單個(gè)oss outfile線程可以占用的內(nèi)存大小。一般情況下,占用的內(nèi)存越大,導(dǎo)出速度越快。 取值范圍:102400~536870912。默認(rèn)值為134217728。單位為字節(jié)。 |
使用說(shuō)明
語(yǔ)法
SELECT * FROM table_name INTO OSSOUTFILE 'outfile_path' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
COLUMNS TERMINATED BY
:表示每個(gè)字段之間的分隔符。OPTIONALLY ENCLOSED BY
:表示字段兩端的標(biāo)識(shí)符,加上OPTIONALLY后,只會(huì)在字符串類型的字段兩端加標(biāo)識(shí)符,否則會(huì)在所有類型的字段兩端加標(biāo)識(shí)符。NULL_MARKER BY
:表示NULL值輸出到文本的字符。NULL的輸出值有如下三種定義方式,優(yōu)先級(jí)從高到低:NULL_MARKER:直接定義NULL的輸出值,
NULL_MARKER
可以定義為任意值,優(yōu)先級(jí)最高。ESCAPED BY:只能寫單字符,NULL的輸出值為字符+N。例如,
ESCAPED BY '\'
,則NULL會(huì)被輸出為\N,優(yōu)先級(jí)第二。NULL(默認(rèn)):如果以上兩者都沒有,則默認(rèn)NULL的輸出值為字符串“NULL”,優(yōu)先級(jí)最低。NULL的兩端沒有
ENCLOSED
標(biāo)識(shí)符。
LINES TERMINATED BY:每一行之間的分隔符。
詳情請(qǐng)參見MySQL官方文檔。
參數(shù)說(shuō)明
參數(shù) | 說(shuō)明 |
outfile_path | 主要標(biāo)識(shí)輸出到OSS的文件位置,包含如下幾部分內(nèi)容:
上述三者之間用 |
table_name | 表名稱。 |
示例
您可以選擇在SQL語(yǔ)句前添加HINT語(yǔ)法來(lái)并行導(dǎo)出數(shù)據(jù)。或開啟彈性并行查詢功能后,直接執(zhí)行SQL語(yǔ)句來(lái)導(dǎo)出數(shù)據(jù)。開啟并行查詢功能的具體操作請(qǐng)參見概述。
此處以在SQL語(yǔ)句SELECT * FROM lineitem;
中添加HINT為例,介紹如何將本地表并行導(dǎo)出至OSS引擎。
執(zhí)行以下命令,查看當(dāng)前SQL語(yǔ)句是否可以并行執(zhí)行。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem;
執(zhí)行結(jié)果如下:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5392844 | 100.00 | NULL | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1348211 | 100.00 | Parallel scan (4 workers) | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+ 2 rows in set, 1 warning (0.05 sec)
若Extra列有Parallel scan,則表示當(dāng)前SQL語(yǔ)句可以并行執(zhí)行。
創(chuàng)建導(dǎo)出的OSS Server,此處以創(chuàng)建
outserver
為例。CREATE SERVER outserver FOREIGN DATA WRAPPER oss OPTIONS ( EXTRA_SERVER_INFO '{"oss_endpoint": "oss-cn-zhangjiakou.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "*******", "oss_access_key_secret": "********", "oss_prefix":"B_outfile"}');
執(zhí)行以下命令,查看并行導(dǎo)出的SQL語(yǔ)句的執(zhí)行計(jì)劃,以確定是否能將本地表并行導(dǎo)出至OSS引擎。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
執(zhí)行計(jì)劃如下:
+----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 5805759 | 100.00 | Parallel export OSS outfile | | 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 1451439 | 100.00 | Parallel scan (4 workers); Parallel export OSS outfile | +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+ 2 rows in set, 1 warning (0.03 sec)
若執(zhí)行計(jì)劃的Extra列中有
Parallel export OSS outfile
,則表示可以將本地表并行導(dǎo)出至OSS引擎。若執(zhí)行計(jì)劃中不支持并行導(dǎo)出。您可以通過(guò)以下方法查看原因:
將
OPTIMIZER_TRACE
參數(shù)設(shè)置為ON。SET optimizer_trace="enabled=on";
執(zhí)行以下命令,查看并行導(dǎo)出的SQL語(yǔ)句的執(zhí)行計(jì)劃。
EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem WHERE l_orderkey < 100 INTO OSSOUTFILE 'default_oss_server/t1' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
執(zhí)行結(jié)果如下:
+----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+ | 1 | SIMPLE | <gather1> | NULL | ALL | NULL | NULL | NULL | NULL | 105 | 100.00 | NULL | | 1 | SIMPLE | lineitem | NULL | range | PRIMARY,i_l_orderkey | PRIMARY | 4 | NULL | 26 | 100.00 | Parallel scan (4 workers); Using where | +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+ 2 rows in set, 1 warning (0.00 sec)
執(zhí)行以下命令,查看并行導(dǎo)出的SQL語(yǔ)句的Optimizer Trace。
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
執(zhí)行結(jié)果如下:
``` "considered_parallel_outfile": { "choose": false, "storage": "OSS", "format": "CSV", "mean_outfile_record_length": "79 B", "estimate_single_worker_outfile_size": "8 KB", "cause": "The data written by each worker should be greater than 1024 KB (pq_oss_min_worker_write_size)." } } ```
您可以在執(zhí)行結(jié)果的
cause
參數(shù)值中查看不能并行導(dǎo)出的原因。
執(zhí)行以下命令,將本地表并行導(dǎo)出至OSS引擎。
SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
導(dǎo)出過(guò)程中,您可以通過(guò)以下命令查看當(dāng)前導(dǎo)出任務(wù)實(shí)時(shí)占用的總內(nèi)存數(shù)和總線程數(shù)。
查看導(dǎo)出任務(wù)實(shí)時(shí)占用的總內(nèi)存數(shù),單位為字節(jié)。
SHOW STATUS LIKE "%Oss_outfile_memory_used%";
查看導(dǎo)出任務(wù)實(shí)時(shí)占用的總線程數(shù)。
SHOW STATUS LIKE "%Oss_outfile_threads_running%";
說(shuō)明當(dāng)您連接集群地址執(zhí)行導(dǎo)出任務(wù)時(shí),必須保證
SHOW STATUS
命令和導(dǎo)出命令在同一個(gè)節(jié)點(diǎn)執(zhí)行,才能查詢當(dāng)前節(jié)點(diǎn)中導(dǎo)出命令占用的內(nèi)存資源信息。