O AnalyticDB for PostgreSQL permite exportar dados para o Object Storage Service (OSS) em paralelo usando o recurso de tabela externa do OSS (gpossext). O gpossext oferece suporte aos formatos TEXT e CSV, com compressão GZIP opcional para reduzir o tamanho dos arquivos e os custos de armazenamento.
Este recurso aplica-se a instâncias do AnalyticDB for PostgreSQL V6.0. Para a versão V7.0, consulte Usar tabelas externas do OSS para importar e exportar dados.
Como funciona

Cada nó de computação exporta dados diretamente para o OSS em paralelo, sem redistribuição entre os nós. A exportação segue um padrão de três etapas: instale a extensão oss_ext uma vez por banco de dados, crie uma tabela externa gravável e execute uma instrução INSERT INTO ... SELECT.
Pré-requisitos
Antes de começar, verifique se você possui:
Uma instância do AnalyticDB for PostgreSQL V6.0
Um bucket do OSS na mesma região da sua instância
Um AccessKey ID e um AccessKey secret com permissão de gravação no bucket. Para criar um par de AccessKey, consulte Criar um par de AccessKey
Mantenha o bucket do OSS e a instância do AnalyticDB for PostgreSQL na mesma região para maximizar o throughput e evitar custos de transferência entre regiões.
Configurar a extensão
Execute a seguinte instrução uma vez por banco de dados para instalar a extensão oss_ext antes de exportar dados:
CREATE EXTENSION IF NOT EXISTS oss_ext;
Essa execução é necessária apenas uma vez por banco de dados, não sendo preciso repeti-la antes de cada exportação.
Exportar dados para o OSS
Etapa 1: Criar uma tabela externa gravável
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]
A palavra-chave WRITABLE é obrigatória. Ela define uma tabela externa somente de gravação para exportação de dados.
Parâmetros de conexão e caminho
|
Parâmetro |
Descrição |
|
|
Endpoint do OSS no formato |
|
|
Seu AccessKey ID. |
|
|
Seu AccessKey secret. |
|
|
Bucket do OSS de destino. Crie o bucket antes de executar a exportação. |
|
|
Prefixo de caminho para os arquivos exportados. Não há suporte para expressões regulares. Os arquivos exportados usam o prefixo como início do nome do arquivo. Por exemplo, definir |
|
|
Diretório do OSS de destino. O caminho deve terminar com |
Parâmetros de formato
|
Parâmetro |
Descrição |
|
|
Formato do arquivo. Valores suportados: |
|
|
Codificação de caracteres para o conteúdo do arquivo, como |
|
|
Chave de distribuição que determina qual nó de computação grava cada linha. |
Caracteres de controle padrão
Todos os caracteres de controle devem ser caracteres de byte único.
|
Caractere de controle |
TEXT |
CSV |
|
DELIMITER |
|
|
|
QUOTE |
|
|
|
ESCAPE |
N/A |
|
|
NULL |
|
String vazia sem aspas |
Regras para parâmetros de formato:
Ao especificar
DELIMITER, também especifiqueQUOTE.QUOTEeDELIMITERnão podem ser o mesmo caractere.Se os dados do usuário contiverem caracteres
QUOTE, inclua caracteresESCAPEpara distinguir os dados do usuário dos caracteres de controle.
Parâmetros de desempenho e compressão
|
Parâmetro |
Padrão |
Valores válidos |
Descrição |
|
|
|
|
Formato de compressão para arquivos exportados. Apenas GZIP é suportado. |
|
|
|
1–8 |
Número de threads de compressão paralelas por segmento. |
|
|
|
1–128 MB |
Tamanho de cada bloco de dados gravado no OSS. |
|
|
|
8–4000 MB |
Tamanho máximo do arquivo. Quando um arquivo atinge esse limite, os dados subsequentes são gravados em um novo arquivo. |
|
|
|
— |
Tempo limite de conexão. |
|
|
|
— |
Tempo limite para resolução de DNS. |
|
|
|
— |
Taxa mínima aceitável de transferência. Configure junto com |
|
|
|
— |
Duração máxima que a taxa de transferência pode ficar abaixo de |
Com os valores padrão, ocorre um tempo limite se a taxa de transferência permanecer abaixo de 1 KB/s por 15 segundos consecutivos. Para mais informações, consulte Tratamento de erros.
Etapa 2: Executar a exportação
INSERT INTO <external_table> SELECT * FROM <source_table>;
Cada nó de computação exporta seus dados locais diretamente para o OSS. Nenhuma redistribuição de dados ocorre entre os nós.
Exemplo
Este exemplo exporta dados de uma tabela local chamada example para um bucket do OSS.
1. Crie a tabela de origem:
CREATE TABLE example
(date text, time text, open float,
high float, low float, volume int)
DISTRIBUTED BY (date);
2. Crie a tabela externa gravável.
Usando prefix para especificar o caminho de saída:
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);
Usando dir para especificar o caminho de saída:
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);
Substitua os espaços reservados pelos seus valores reais:
|
Espaço reservado |
Descrição |
|
|
Seu AccessKey ID |
|
|
Seu AccessKey secret |
3. Exporte os dados:
INSERT INTO ossexample_exp SELECT * FROM example;
4. Verifique a exportação:
Execute EXPLAIN para confirmar que cada nó de computação exporta dados diretamente para o OSS:
EXPLAIN INSERT INTO ossexample_exp SELECT * FROM example;
Saída esperada:
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)
O valor segments: 3 indica que todos os três nós de computação exportam dados em paralelo. Após a conclusão da exportação, verifique se os arquivos aparecem no console do OSS no caminho especificado.
Considerações sobre desempenho
Para maximizar o throughput de exportação:
-
Utilize armazenamento orientado a colunas com compressão ao criar tabelas de origem. Exemplo:
WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576)Para mais informações, consulte CREATE TABLE.
Mantenha o bucket do OSS e a instância do AnalyticDB for PostgreSQL na mesma região.
Ajuste
num_parallel_worker,oss_flush_block_sizeeoss_file_max_sizecom base no volume de dados e nas condições de rede.
Limitações
Apenas instâncias V6.0 são suportadas. Para V7.0, use tabelas externas do OSS.
Somente os formatos TEXT e CSV são suportados.
Apenas a compressão GZIP é suportada (
compressiontype=gzip).prefixedirsão mutuamente exclusivos — especifique apenas um por tabela externa.Não há suporte para expressões regulares em
prefix.Todos os caracteres de controle de formato (DELIMITER, QUOTE, ESCAPE, NULL) devem ser caracteres de byte único.
A sintaxe da tabela externa segue as convenções do Greenplum Database, exceto pelos parâmetros relacionados à localização.
Solução de problemas
Quando ocorre um erro de exportação, o log de erros inclui:
|
Campo |
Descrição |
|
|
Código de status HTTP da solicitação com falha. |
|
|
Código de erro retornado pelo OSS. |
|
|
Mensagem de erro retornada pelo OSS. |
|
|
UUID da solicitação com falha. Forneça este ID ao suporte técnico do OSS se o problema persistir. |
Para obter uma lista completa de códigos de erro, consulte Respostas de erro. Para corrigir erros relacionados a tempo limite, ajuste os parâmetros oss_speed_limit e oss_speed_time.Respostas de erro da API do OSSRespostas de erro da API do OSS