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 |
|
|
|
|
|
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 |
|
|
|
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.
NotaO 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.modedo conector comoauto(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
TRUEpara o modo COPY ouFALSEpara 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.
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:
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.xno 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
-
Prepare os dados de origem.
Faça login no nó mestre do cluster EMR Spark. Para mais informações, consulte Conectar-se a uma instância ECS.
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.-
Execute o seguinte comando no diretório
dbgenpara gerar um arquivocustomer.tblpara um conjunto de dados de teste de 1 TB../dbgen -s 1000 -T cA 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
-
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.
-
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.
-
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.maxPartitionBytespara 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=644245094No comando, path é o diretório que contém o arquivo
hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar. -
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.
NotaNa 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 |
|
|
Método de atualização de dados |
|
|
Modo de escrita |
|
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
|
|
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
A tabela a seguir descreve os parâmetros.
|
|
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:
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% |
Os modos de escrita correspondem às seguintes operações:
insert: INSERT INTO VALUESstream: FIXED COPYbulk_load: Importação COPY para tabela sem chave primáriabulk_load_on_conflict: Importação COPY para tabela com chave primária