Todos os produtos
Search
Central de documentação

Hologres:Batch writing to Hologres

Última atualização: Jun 28, 2026

O Hologres é um mecanismo completo de data warehouse em tempo real compatível com o protocolo PostgreSQL. Ele permite escrever, atualizar e consultar grandes volumes de dados em cenários online e offline. Com base nos resultados de testes de desempenho de escritas em lote do Spark para o Hologres, este tópico ajuda a escolher o modo de escrita ideal para diferentes cenários.

Para escritas e atualizações de dados em tempo real, consulte Teste de estresse de escritas, atualizações e consultas pontuais de dados.

Comparação dos modos de escrita em lote

O Hologres oferece suporte a vários modos de escrita em lote, incluindo o modo COPY tradicional, o modo de importação por streaming FIXED COPY baseado no protocolo COPY e o modo INSERT INTO VALUES, que converte importações em lote em escritas por streaming.

A tabela a seguir compara os três modos de escrita em detalhes.

Recurso

COPY

FIXED COPY

INSERT INTO VALUES

Descrição

Importação em lote para tabelas sem chave primária

Importação em lote para tabelas com chave primária

Modo de importação por streaming baseado no protocolo COPY

Modo básico de importação por streaming

Casos de uso

  • Importação em lote do Spark

  • Importação em lote do Apache Flink

  • Importação do Flink

  • Importação do DataWorks Data Integration

  • Importação por streaming do Spark

  • Importação do Flink

  • Importação do DataWorks Data Integration

  • Importação por streaming do Spark

Granularidade de bloqueio

Bloqueio de linha

Bloqueio de tabela

Bloqueio de linha

Bloqueio de linha

Visibilidade dos dados

Visível após a conclusão da operação COPY

Visível após a conclusão da operação COPY

Visível em tempo real

Visível em tempo real

Desempenho

Alto

Alto

Médio

Médio

Consumo de recursos do Hologres

Baixo

Baixo

Alto

Alto

Consumo de recursos do cliente

Baixo

Alto

Baixo

Médio

Políticas de conflito de chave primária suportadas

Não aplicável

  • NONE

  • UPDATE: Suporta atualizações de linha completa na V3.0.4 ou posterior e atualizações parciais na V3.1.1 ou posterior.

  • IGNORE: Suportado na V3.0.4 ou posterior.

  • NONE (retorna um erro se ocorrer um conflito)

  • UPDATE

  • IGNORE

  • NONE (retorna um erro se ocorrer um conflito)

  • UPDATE

  • IGNORE

Seleção do modo de escrita em lote

Em cenários de escrita em lote, os três modos oferecem os seguintes recursos:

  • Modo COPY: O modo COPY tradicional oferece o melhor desempenho de escrita e consome menos recursos do Hologres.

  • Modo FIXED COPY: Modo de importação por streaming baseado no protocolo COPY. Gera apenas bloqueio de linha e fornece visibilidade de dados em tempo real.

  • Modo INSERT INTO VALUES: Converte importações em lote em escritas por streaming tradicionais e não apresenta vantagem significativa em cenários de escrita em lote.

    Nota

    O modo INSERT INTO VALUES só carece de vantagens distintas em cenários de escrita em lote. No entanto, é o único modo que suporta retração de dados (exclusão) e é obrigatório para casos de uso como a escrita de dados de log binário.

A menos que haja requisitos específicos de visibilidade de dados em tempo real, granularidade de bloqueio (um bloqueio de tabela impede tarefas de escrita simultâneas) ou carga da fonte de dados, recomenda-se o uso do modo COPY para escritas em lote.

  • Para escritas em lote do Spark: Atualize a instância do Hologres para a V2.2.25 ou posterior e defina o parâmetro de escrita write.mode do conector como auto (valor padrão). O sistema seleciona automaticamente o modo ideal de escrita em lote.

  • Para escritas em lote do Flink: Use a árvore de decisão abaixo para selecionar o modo COPY ou FIXED COPY. Em seguida, configure os seguintes parâmetros:

    • jdbccopywritemode: Defina como TRUE. Isso evita o uso do modo INSERT INTO VALUES.

    • bulkload: Defina como TRUE para o modo COPY ou FALSE para o modo FIXED COPY, conforme seus requisitos.

Utilize a seguinte árvore de decisão para selecionar o modo de escrita em lote adequado ao seu cenário.

image

Teste de desempenho de escrita em lote

Este teste utiliza o Hologres-Spark-Connector open-source do Hologres.

Pré-requisitos

Configuração do ambiente

Antes de começar, certifique-se de ter o seguinte ambiente configurado:

Importante

A instância do Hologres e o cluster EMR Spark devem estar na mesma região e usar a mesma VPC.

  • Provisione uma instância do Hologres V2.2.25 ou posterior e crie um banco de dados.

  • Crie um cluster EMR Spark que execute o Spark 3.3.0 ou posterior. Para mais informações, consulte Criar um cluster.

  • Baixe o pacote do Spark-Connector.

    Para permitir que o Spark leia e escreva no Hologres, baixe o arquivo JAR hologres-connector-spark-3.x no Repositório Central Maven.

A tabela a seguir descreve o ambiente utilizado para o teste de desempenho.

Serviço

Versão

Especificações

Hologres

V3.0.30

64 núcleos, 256 GB (1 CU = 1 núcleo, 4 GB)

EMR Spark

EMR-5.18.1, Spark-3.5.3

8 núcleos, 32 GB × 8 (1 nó mestre, 7 nós principais)

Importante

Ative o serviço OSS-HDFS.

Spark-Connector

1.5.2

N/A

Preparação dos dados de teste

  1. Prepare os dados de origem.

    1. Faça login no nó mestre do cluster EMR Spark. Para mais informações, consulte Conectar-se a uma instância ECS.

    2. Baixe o pacote de ferramentas TPC-H TPC-H_Tools_v3.0.0.zip. Copie o pacote para a instância ECS do nó mestre, extraia-o e navegue até o diretório TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgen.

    3. Execute o seguinte comando no diretório dbgen para gerar um arquivo customer.tbl para um conjunto de dados de teste de 1 TB.

      ./dbgen -s 1000 -T c

      A tabela a seguir descreve a tabela customer no conjunto de dados TPC-H de 1 TB.

      Item

      Descrição

      Número de campos

      8

      Tipos de campo

      INT, BIGINT, TEXT, DECIMAL

      Número de linhas

      150.000.000

      Número de shards

      40

  2. Importe os dados de teste para o Spark.

    Execute o seguinte comando para carregar o arquivo customer.tbl no cluster Spark.

    hadoop fs -put customer.tbl <spark_resource>

    No comando, spark_resource refere-se ao Root Storage Directory of Cluster definido durante a criação do cluster EMR Spark.

  3. Armazenamento híbrido linha-coluna

    CREATE TABLE test_table_mixed (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column,row'
    );

    Armazenamento orientado a colunas (com chave primária)

    CREATE TABLE test_table_column (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column'
    );

    Armazenamento orientado a colunas (sem chave primária)

    CREATE TABLE test_table_column_no_pk (
        C_CUSTKEY BIGINT,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column'
    );

    Armazenamento orientado a linhas (com chave primária)

    CREATE TABLE test_table_row (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'row'
    );

    Armazenamento orientado a linhas (sem chave primária)

    CREATE TABLE test_table_row_no_pk (
        C_CUSTKEY BIGINT,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'row'
    );

Teste de desempenho

Configuração do teste

Este tópico testa o desempenho de importação de diferentes modos.

  1. Faça login no nó mestre do cluster EMR Spark. Para mais informações, consulte Conectar-se a uma instância ECS. Carregue o pacote baixado do Spark-Connector e execute o seguinte comando para entrar no shell interativo do Spark SQL.

    Nota

    É possível ajustar o valor do parâmetro spark.sql.files.maxPartitionBytes para controlar a concorrência de leitura de arquivos HDFS no Spark. Neste exemplo, a concorrência está definida como 40.

    # Enter the Spark SQL interactive shell.
    spark-sql --jars <path>/hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \
    --conf spark.executor.instances=40 \
    --conf spark.executor.cores=1 \
    --conf spark.executor.memory=4g \
    --conf spark.sql.files.maxPartitionBytes=644245094

    No comando, path é o diretório que contém o arquivo hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar.

  2. No shell interativo do Spark SQL, execute as seguintes instruções SQL para criar visualizações temporárias e escrever dados.

    Uma tabela temporária é usada neste teste para facilitar o ajuste de parâmetros ao avaliar o desempenho de escrita de diferentes modos.

    Nota

    Na prática, também é possível usar um catálogo para carregar tabelas do Hologres diretamente.

    -- Create a temporary table in CSV format.
    CREATE TEMPORARY VIEW csvtable (
      c_custkey BIGINT,
      c_name STRING,
      c_address STRING,
      c_nationkey INT,
      c_phone STRING,
      c_acctbal DECIMAL(15, 2),
      c_mktsegment STRING,
      c_comment STRING)
    USING csv OPTIONS (
      path "<spark_resources>/customer.tbl", sep "|"
    );
    CREATE TEMPORARY VIEW hologresTable (
      c_custkey BIGINT,
      c_name STRING,
      c_address STRING,
      c_nationkey INT,
      c_phone STRING,
      c_acctbal DECIMAL(15, 2),
      c_mktsegment STRING,
      c_comment STRING)
    USING hologres OPTIONS (
      jdbcurl "jdbc:postgresql://<hologres_vpc_endpoint>/<database_name>",
      username "<accesskey_id>", 
      password "<accesskey_secret>", 
      table "<table_name>",
      direct_connect "false",
      write.mode "auto",
      write.insert.thread_size "3",
      write.insert.batch_size "2048"
    );
    INSERT INTO hologresTable SELECT * FROM csvTable;

    A tabela a seguir descreve os parâmetros.

    Parâmetro

    Descrição

    spark_resources

    O cluster root storage path configurado ao criar o cluster EMR Spark.

    Esse caminho encontra-se na seção Cluster Information, na página Basic Information do seu cluster, no console EMR on ECS.

    hologres_vpc_endpoint

    O Domain Name da VPC da instância do Hologres.

    Faça login no console do Hologres, clique em ID da instância desejada e localize o endpoint da VPC especificada na seção de informações de rede da página de detalhes da instância. Por exemplo, um endpoint de VPC na região China (Hangzhou) tem o formato <Instance ID>-cn-hangzhou-vpc-st.hologres.aliyuncs.com:80.

    database_name

    Nome do banco de dados na instância do Hologres.

    accesskey_id

    AccessKey ID com permissões de leitura no banco de dados especificado do Hologres.

    accesskey_secret

    AccessKey secret com permissões de leitura no banco de dados especificado do Hologres.

    table_name

    Nome da tabela do Hologres de destino.

    write.mode

    Modo de escrita. Valores válidos:

    • auto: Valor padrão. O conector seleciona automaticamente o modo ideal.

    • insert: Escreve dados usando instruções INSERT INTO VALUES.

    • stream: Realiza escritas por streaming usando FIXED COPY.

    • bulk_load: Realiza uma importação em lote para uma tabela sem chave primária usando COPY.

    • bulk_load_on_conflict: Realiza uma importação em lote para uma tabela com chave primária usando COPY.

    write.insert.thread_size

    Concorrência de escrita. Aplica-se apenas ao modo insert.

    write.insert.batch_size

    Tamanho do lote de escrita. Aplica-se apenas ao modo insert.

    write.on_conflict_action

    INSERT_OR_REPLACE (padrão): Se ocorrer um conflito de chave primária, os dados serão atualizados.

    INSERT_OR_IGNORE: Se ocorrer um conflito de chave primária, os dados serão ignorados.

    Para mais informações sobre os parâmetros, consulte Parâmetros.

Cenários de teste

Cenário de teste

Opções

Formato de armazenamento da tabela

  • Armazenamento orientado a linhas

  • Armazenamento orientado a colunas

  • Armazenamento híbrido linha-coluna

Método de atualização de dados

  • Escritas apenas de acréscimo em tabela sem chave primária

  • Escritas iniciais em tabela vazia com chave primária

  • Atualizações de linha completa em tabela com chave primária

Modo de escrita

  • insert (INSERT INTO VALUES)

  • stream (FIXED COPY)

  • bulk_load (importação COPY para tabela sem chave primária)

  • bulk_load_on_conflict (importação COPY para tabela com chave primária)

Resultados do teste

Os resultados do teste incluem os seguintes campos:

Campo

Descrição

Duração total do job

Tempo total de execução do job Spark.

Este valor representa o tempo necessário para executar a operação INSERT no shell interativo do Spark SQL em um nó do cluster EMR Spark. Essa duração aparece na linha Time taken da saída do shell:

spark-sql (default)> insert into hologresTable select * from csvTable;
25/04/11 15:05:51 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:05:52 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:05:52 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:02 WARN [main] PGStream: create socket to
25/04/11 15:06:02 WARN [main] JDBCUtil$: could not connect directly
25/04/11 15:06:03 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:04 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:04 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:05 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:05 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:06 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:06 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:07 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:07 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:09 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:09 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:10 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:10 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:11 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:11 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:12 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:12 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
25/04/11 15:06:13 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]
Time taken: 228.901 seconds

Duração média da escrita de dados

Duração média do próprio job de escrita, excluindo o tempo gasto com agendamento do cluster Spark, leitura de dados ou reorganização de dados.

Na página HoloWeb do console do Hologres, execute a seguinte instrução SQL para obter a concorrência de shards (valor de COUNT(*)) e a duração média da escrita de dados (avg_duration_ms) em milissegundos:

SELECT
        COUNT(*), AVG(duration) AS avg_duration_ms
    FROM
        hologres.hg_query_log
    WHERE
        query_start >= '<start_time>' AND query_start <= '<end_time>'
        AND query LIKE '%<hologres_table_name>%' AND command_tag = 'COPY';

A tabela a seguir descreve os parâmetros.

  • start_time: Hora de início da operação de escrita de dados, como 2024-04-11 15:00:00.

  • end_time: Hora de término da operação de escrita de dados, como 2024-04-11 15:10:00.

  • hologres_table_name: Nome da tabela de destino do Hologres, como your_table_name.

Carga do Hologres

Utilização da CPU da instância do Hologres.

Obtenha a utilização da CPU na página Monitoring Information da instância no console do Hologres.

Carga do Spark

Carga nos nós do EMR.

No console EMR on ECS, acesse a aba Monitoring and Diagnostics > Metric Monitoring do seu cluster e defina as seguintes configurações:

  • Dashboard: Selecione HOST.

  • nodeGroupId: Selecione o ID do grupo de nós principais do cluster.

  • hostname: Selecione os nós principais.

  • Select Time: Selecione o período que abrange a operação de escrita de dados do Spark.

Em seguida, consulte a métrica CPU utilization para visualizar a carga do Spark.

A tabela a seguir mostra os resultados detalhados do teste.

Formato de armazenamento

Chave primária

Modo de escrita

Duração total do job

Duração média de escrita

Carga do Hologres

Carga do Spark

Armazenamento orientado a colunas

Sem chave primária

insert

241,61s

232,70s

92%

15%

stream

228,11s

222,34s

100%

36%

bulk_load

88,72s

57,16s

97%

47%

Com chave primária

ignore

insert

190,96s

172,60s

90%

14%

stream

149,60s

142,16s

100%

14%

bulk_load_on_conflict

115,96s

42,92s

60%

75%

Com chave primária

replace

insert

600,40s

574,31s

91%

5%

stream

550,29s

540,32s

100%

5%

bulk_load_on_conflict

188,05s

109,77s

93%

78%

Armazenamento orientado a linhas

Sem chave primária

insert

132,38s

123,79s

94%

22%

stream

114,41s

103,81s

100%

17%

bulk_load

68,20s

41,22s

98%

32%

Com chave primária

ignore

insert

190,48s

170,49s

89%

15%

stream

185,46s

172,48s

85%

14%

bulk_load_on_conflict

117,81s

47,69s

58%

75%

Com chave primária

replace

insert

177,97s

170,78s

93%

15%

stream

142,44s

130,16s

100%

20%

bulk_load_on_conflict

137,69s

65,18s

92%

78%

Armazenamento híbrido linha-coluna

Com chave primária

ignore

insert

172,19s

158,74s

86%

16%

stream

150,63s

149,76s

100%

12%

bulk_load_on_conflict

128,83s

42,09s

59%

79%

Com chave primária

replace

insert

690,37s

662,00s

92%

5%

stream

625,84s

623,08s

100%

4%

bulk_load_on_conflict

202,07s

121,58s

93%

80%

Nota

Os modos de escrita correspondem às seguintes operações:

  • insert: INSERT INTO VALUES

  • stream: FIXED COPY

  • bulk_load: Importação COPY para tabela sem chave primária

  • bulk_load_on_conflict: Importação COPY para tabela com chave primária