AnalyticDB for PostgreSQL では、OSS 外部テーブル機能 (`gpossext`) を使用して、並列処理により Object Storage Service (OSS) へデータを高速にエクスポートできます。`gpossext` は TEXT 形式および CSV 形式をサポートしており、ファイルサイズとストレージコストを削減するために、オプションで GZIP 圧縮も利用可能です。
この機能は AnalyticDB for PostgreSQL V6.0 インスタンスに適用されます。V7.0 の場合は、「OSS 外部テーブルを用いたデータのインポートおよびエクスポート」をご参照ください。
仕組み

各コンピュートノードは、ノード間でデータを再分配することなく、並列で直接 OSS にデータをエクスポートします。エクスポートは 3 ステップのパターンに従います。データベースごとに 1 回 oss_ext 拡張をインストールし、書き込み可能な外部テーブルを作成してから、INSERT INTO ... SELECT 文を実行します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
AnalyticDB for PostgreSQL V6.0 インスタンス
ご利用のインスタンスと同じリージョンにある OSS バケット
該当バケットへ書き込み権限を持つ AccessKey ID および AccessKey Secret。AccessKey ペアの作成については、「AccessKey ペアの作成」をご参照ください。
スループットの最大化およびクロスリージョン転送コストの回避のため、OSS バケットと AnalyticDB for PostgreSQL インスタンスは同一リージョンに配置してください。
拡張の設定
データをエクスポートする前に、以下の文をデータベースごとに 1 回実行して、oss_ext 拡張をインストールします。
CREATE EXTENSION IF NOT EXISTS oss_ext;この文は、データベースごとに 1 回のみ実行すれば十分であり、各エクスポートの直前には実行する必要はありません。
OSS へのデータエクスポート
ステップ 1:書き込み可能な外部テーブルの作成
CREATE WRITABLE EXTERNAL TABLE table_name
( column_name data_type [, ...] | LIKE other_table )
LOCATION ('ossprotocol')
FORMAT 'TEXT'
[( [DELIMITER [AS] 'delimiter']
[NULL [AS] 'null string']
[ESCAPE [AS] 'escape' | 'OFF'] )]
| 'CSV'
[([QUOTE [AS] 'quote']
[DELIMITER [AS] 'delimiter']
[NULL [AS] 'null string']
[FORCE QUOTE column [, ...]] ]
[ESCAPE [AS] 'escape'] )]
[ ENCODING 'encoding' ]
[ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ]
ossprotocol:
oss://oss_endpoint [prefix=prefix_name|dir=[folder/[folder/]...]/file_name]
id=userossid key=userosskey bucket=ossbucket compressiontype=[none|gzip] async=[true|false]WRITABLE キーワードは必須です。これは、データのエクスポート用の書き込み専用の外部テーブルを定義します。
接続およびパスパラメーター
| パラメーター | 説明 |
|---|---|
oss://oss_endpoint | OSS エンドポイント。形式は oss://oss_endpoint です。例: oss://oss-cn-hangzhou.aliyuncs.com。Alibaba Cloud サーバーからアクセスする場合は、インターネットトラフィックを回避するために、キーワード internal を含む内部エンドポイントを使用してください。 |
id | ご利用の AccessKey ID です。 |
key | ご利用の AccessKey Secret です。 |
bucket | 対象となる OSS バケットです。エクスポートを実行する前に、バケットを作成してください。 |
prefix | エクスポートファイルのパスプレフィックスです。正規表現はサポートされていません。エクスポートされたファイルは、このプレフィックスをファイル名の先頭に付与して保存されます。たとえば、prefix=osstest/exp/outfromhdb を指定すると、ファイルは osstest/exp/ パスに保存され、ファイル名は outfromhdb で始まります。dir パラメーターとは排他的です。 |
dir | 対象となる OSS ディレクトリです。パスは必ず / で終了する必要があります(例: test/mydir/)。エクスポートされたファイルは filename.x の形式で命名され、x は数値(連番である必要はありません)となります。prefix パラメーターとは排他的です。 |
フォーマットパラメーター
| パラメーター | 説明 |
|---|---|
FORMAT | ファイル形式です。サポートされる値は TEXT および CSV です。 |
ENCODING | ファイル内容の文字コードです(例:UTF-8)。 |
DISTRIBUTED BY | 各行をどのコンピュートノードが書き込むかを決定する分散キーです。 |
デフォルトのコントロール文字
すべてのコントロール文字は、単一バイト文字である必要があります。
| コントロール文字 | TEXT | CSV |
|---|---|---|
| DELIMITER | \t(タブ) | ,(カンマ) |
| QUOTE | "(ダブルクォーテーション) | "(ダブルクォーテーション) |
| ESCAPE | 該当なし | "(ダブルクォーテーション) |
| NULL | \N | 引用符なしの空文字列 |
フォーマットパラメーターに関するルール:
DELIMITERを指定する場合は、QUOTEも指定する必要があります。QUOTEおよびDELIMITERは、同じ文字にすることはできません。ユーザーデータに
QUOTE文字が含まれる場合は、ESCAPE文字を含めてユーザーデータと制御文字を区別します。
パフォーマンスおよび圧縮パラメーター
| パラメーター | デフォルト値 | 有効な値 | 説明 |
|---|---|---|---|
compressiontype | none | none、gzip | エクスポートファイルの圧縮形式。GZIP のみがサポートされています。 |
num_parallel_worker | 3 | 1~8 | セグメントあたりの並列圧縮スレッド数。 |
oss_flush_block_size | 32 MB | 1~128 MB | OSS へ書き込まれる各データブロックのサイズ。 |
oss_file_max_size | 1024 MB | 8~4000 MB | ファイルの最大サイズ。この制限に達した場合、以降のデータは新しいファイルに書き込まれます。 |
oss_connect_timeout | 10 s | — | 接続タイムアウト。 |
oss_dns_cache_timeout | 60 s | — | DNS 名前解決のタイムアウト。 |
oss_speed_limit | 1024 bytes/s | — | 最小許容転送レート。 oss_speed_time と共に設定する必要があります。 |
oss_speed_time | 15 s | — | タイムアウトがトリガーされる前に、転送レートが oss_speed_limit を下回り続けることができる最大持続時間。oss_speed_limit と共に設定する必要があります。 |
デフォルト値では、転送レートが15秒間連続して1 KB/s未満の場合にタイムアウトが発生します。詳細については、「エラー処理」をご参照ください。
ステップ 2:エクスポートの実行
INSERT INTO <external_table> SELECT * FROM <source_table>;各コンピュートノードが、自身のローカルデータを直接 OSS へエクスポートします。ノード間でのデータ再配布は発生しません。
サンプル
この例では、example という名前のローカルテーブルからデータをエクスポートし、OSS バケットにエクスポートします。
1. ソーステーブルの作成:
CREATE TABLE example
(date text, time text, open float,
high float, low float, volume int)
DISTRIBUTED BY (date);2. 書き込み可能な外部テーブルの作成。
prefix を使用して出力パスを指定します。
CREATE WRITABLE EXTERNAL TABLE ossexample_exp
(date text, time text, open float, high float,
low float, volume int)
LOCATION ('oss://oss-cn-hangzhou.aliyuncs.com
prefix=osstest/exp/outfromhdb id=<your-access-key-id>
key=<your-access-key-secret> bucket=testbucket')
FORMAT 'csv'
DISTRIBUTED BY (date);dir を使用して出力パスを指定する:
CREATE WRITABLE EXTERNAL TABLE ossexample_exp
(date text, time text, open float, high float,
low float, volume int)
LOCATION ('oss://oss-cn-hangzhou.aliyuncs.com
dir=osstest/exp/ id=<your-access-key-id>
key=<your-access-key-secret> bucket=testbucket')
FORMAT 'csv'
DISTRIBUTED BY (date);プレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 |
|---|---|
<your-access-key-id> | ご利用の AccessKey ID |
<your-access-key-secret> | ご利用の AccessKey Secret |
3. データのエクスポート:
INSERT INTO ossexample_exp SELECT * FROM example;4. エクスポートの確認:
EXPLAIN を実行して、各コンピュートノードがデータを直接 OSS にエクスポートしていることを確認します。
EXPLAIN INSERT INTO ossexample_exp SELECT * FROM example;期待される出力:
QUERY PLAN
---------------------------------------------------------------
Insert (slice0; segments: 3) (rows=1 width=92)
-> Seq Scan on example (cost=0.00..0.00 rows=1 width=92)
(2 rows)segments: 3 は、3つのコンピュートノードすべてがデータを並列でエクスポートすることを示します。エクスポートが完了したら、ファイルが指定されたパスのOSS コンソールに表示されることを確認してください。
パフォーマンスに関する考慮事項
エクスポートスループットを最大化するには、以下の点に注意してください。
ソーステーブルの作成時に、圧縮付きの列指向ストレージを使用してください。例:
WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576)詳細については、「CREATE TABLE」をご参照ください。
OSS バケットと AnalyticDB for PostgreSQL インスタンスを同一リージョンに配置してください。
データ量およびネットワーク環境に基づいて、
num_parallel_worker、oss_flush_block_size、およびoss_file_max_sizeを調整します。
制限事項
V6.0 インスタンスのみがサポートされています。V7.0 の場合は、OSS 外部テーブル を使用します。
TEXT 形式および CSV 形式のみがサポートされます。
GZIP 圧縮のみがサポートされています(
compressiontype=gzip)。prefixおよびdirは相互排他です。外部テーブルごとに 1 つだけ指定してください。prefixでは、正規表現はサポートされていません。すべてのフォーマットコントロール文字(`DELIMITER`、`QUOTE`、`ESCAPE`、`NULL`)は、単一バイト文字である必要があります。
外部テーブルの構文は Greenplum Database の規則に従いますが、ロケーション関連のパラメーターを除きます。
トラブルシューティング
エクスポートエラーが発生した場合、エラーログには以下のフィールドが含まれます。
| フィールド | 説明 |
|---|---|
code | 失敗したリクエストの HTTP ステータスコード。 |
error_code | OSS から返されたエラーコード。 |
error_msg | OSS から返されたエラーメッセージ。 |
req_id | 失敗したリクエストの UUID。問題が継続する場合は、この値を OSS テクニカルサポートへお知らせください。 |
エラーコードの完全なリストについては、「エラー応答」をご参照ください。タイムアウト関連のエラーを修正するには、oss_speed_limit パラメーターと oss_speed_time パラメーターを調整します。OSS API エラー応答OSS API エラー応答