Todos los productos
Search
Centro de documentos

Hologres:Prácticas recomendadas para la escritura por lotes en Hologres

Última actualización: Sep 05, 2026

Hologres es un motor de almacén de datos en tiempo real integral compatible con el protocolo PostgreSQL. Admite la escritura, actualización y consulta de grandes volúmenes de datos tanto en escenarios en tiempo real como sin conexión. Con base en los resultados de las pruebas de rendimiento de escrituras por lotes desde Spark hacia Hologres, este tema le ayuda a elegir el modo de escritura óptimo para diferentes escenarios.

Para escrituras y actualizaciones de datos en tiempo real, consulte Stress testing data writes, updates, and point queries.

Comparación de modos de escritura por lotes

Hologres admite varios modos de escritura por lotes, incluido el modo COPY tradicional, el modo de importación mediante streaming FIXED COPY basado en el protocolo COPY, y el modo INSERT INTO VALUES que convierte las importaciones por lotes en escrituras mediante streaming.

La siguiente tabla compara en detalle los tres modos de escritura.

Función

COPY

FIXED COPY

INSERT INTO VALUES

Descripción

Importación por lotes a tablas sin clave principal

Importación por lotes a tablas con clave principal

Modo de importación mediante streaming basado en el protocolo COPY

Modo básico de importación mediante streaming

Casos de uso

  • Importación por lotes desde Spark

  • Importación por lotes desde Apache Flink

  • Importación desde Flink

  • Importación desde DataWorks Data Integration

  • Importación mediante streaming desde Spark

  • Importación desde Flink

  • Importación desde DataWorks Data Integration

  • Importación mediante streaming desde Spark

Granularidad de bloqueo

bloqueo de fila

bloqueo de tabla

bloqueo de fila

bloqueo de fila

Visibilidad de datos

Visible después de completar la operación COPY

Visible después de completar la operación COPY

Visible en tiempo real

Visible en tiempo real

Rendimiento

Alto

Alto

Medio

Medio

Consumo de recursos de Hologres

Bajo

Bajo

Alto

Alto

Consumo de recursos del cliente

Bajo

Alto

Bajo

Medio

Directivas de conflicto de clave principal compatibles

No aplicable

  • NONE

  • UPDATE: Admite actualizaciones de fila completa en V3.0.4 o posterior, y actualizaciones parciales en V3.1.1 o posterior.

  • IGNORE: Compatible con V3.0.4 o posterior.

  • NONE (devuelve un error si ocurre un conflicto)

  • UPDATE

  • IGNORE

  • NONE (devuelve un error si ocurre un conflicto)

  • UPDATE

  • IGNORE

Selección del modo de escritura por lotes

En escenarios de escritura por lotes, los tres modos ofrecen las siguientes funciones:

  • Modo COPY: El modo COPY tradicional ofrece el mejor rendimiento de escritura y consume la menor cantidad de recursos de Hologres.

  • Modo FIXED COPY: Modo de importación mediante streaming basado en el protocolo COPY. Genera únicamente un bloqueo de fila y proporciona visibilidad de datos en tiempo real.

  • Modo INSERT INTO VALUES: Este modo convierte las importaciones por lotes en escrituras mediante streaming tradicionales y no ofrece ventajas significativas en escenarios de escritura por lotes.

    Nota

    El modo INSERT INTO VALUES carece de una ventaja distintiva solo en escenarios de escritura por lotes. Sin embargo, es el único modo que admite la retractación (eliminación) de datos y es obligatorio para casos de uso como la escritura de datos de registro binario.

A menos que tenga requisitos específicos de visibilidad de datos en tiempo real, granularidad de bloqueo (un bloqueo de tabla impide tareas de escritura simultáneas) o carga en el origen de datos, se recomienda utilizar el modo COPY para escrituras por lotes.

  • Para escrituras por lotes desde Spark: Se recomienda actualizar su instancia de Hologres a V2.2.25 o posterior y establecer el parámetro write parameter write.mode del conector en auto (valor predeterminado). De esta forma, el sistema selecciona automáticamente el modo de escritura por lotes óptimo.

  • Para batch writes from Flink: Primero, utilice el árbol de decisiones a continuación para seleccionar el modo COPY o el modo FIXED COPY. Luego, configure los siguientes parámetros:

    • jdbccopywritemode: Establézcalo en TRUE. Esto evita el uso del modo INSERT INTO VALUES.

    • bulkload: Establézcalo en TRUE para el modo COPY o en FALSE para el modo FIXED COPY, según sus necesidades.

Utilice el siguiente árbol de decisiones para seleccionar el modo de escritura por lotes adecuado para su escenario.

image

Prueba de rendimiento de escritura por lotes

Esta prueba utiliza el Hologres-Spark-Connector de código abierto de Hologres: open-source.

Requisitos previos

Configuración del entorno

Antes de empezar, asegúrese de contar con el siguiente entorno configurado:

Importante

La instancia de Hologres y el clúster EMR Spark deben estar en la misma región y utilizar la misma VPC.

  • Aprovisione una instancia de Hologres V2.2.25 o posterior y create a database.

  • Cree un clúster EMR Spark que ejecute Spark 3.3.0 o posterior. Para obtener más información, consulte Create a cluster.

  • Descargue el paquete Spark-Connector.

    Para permitir que Spark lea y escriba en Hologres, descargue el archivo JAR hologres-connector-spark-3.x desde el repositorio central de Maven.

La siguiente tabla describe el entorno utilizado para la prueba de rendimiento.

Servicio

Versión

Especificaciones

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 nodo maestro, 7 nodos principales)

Importante

Debe activar el servicio OSS-HDFS.

Spark-Connector

1.5.2

N/A

Preparación de datos de prueba

  1. Prepare los datos de origen.

    1. Inicie sesión en el nodo maestro del clúster EMR Spark. Para obtener más información, consulte Connect to an ECS instance.

    2. Descargue el paquete de herramientas TPC-H TPC-H_Tools_v3.0.0.zip. A continuación, copie el paquete en la instancia ECS del nodo maestro, extráigalo y vaya al directorio TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgen.

    3. Ejecute el siguiente comando en el directorio dbgen para generar un archivo customer.tbl correspondiente a un conjunto de datos de prueba de 1 TB.

      ./dbgen -s 1000 -T c

      La siguiente tabla describe la tabla customer en el conjunto de datos TPC-H de 1 TB.

      Elemento

      Descripción

      Número de campos

      8

      Tipos de campo

      INT, BIGINT, TEXT, DECIMAL

      Número de filas

      150,000,000

      Número de shards

      40

  2. Importe los datos de prueba a Spark.

    Ejecute el siguiente comando para cargar el archivo customer.tbl en el clúster Spark.

    hadoop fs -put customer.tbl <spark_resource>

    En el comando, spark_resource hace referencia al Root Storage Directory of Cluster que estableció al crear el clúster EMR Spark.

  3. Almacenamiento híbrido de filas y columnas

    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'
    );

    Almacenamiento orientado a columnas (con clave principal)

    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'
    );

    Almacenamiento orientado a columnas (sin clave principal)

    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'
    );

    Almacenamiento orientado a filas (con clave principal)

    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'
    );

    Almacenamiento orientado a filas (sin clave principal)

    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'
    );

Prueba de rendimiento

Configuración de la prueba

Este tema evalúa el rendimiento de importación de los diferentes modos.

  1. Inicie sesión en el nodo maestro del clúster EMR Spark. Para obtener más información, consulte Connect to an ECS instance. Cargue el paquete Spark-Connector descargado y ejecute el siguiente comando para ingresar al shell interactivo de Spark SQL.

    Nota

    Puede ajustar el valor del parámetro spark.sql.files.maxPartitionBytes para controlar la concurrencia en la lectura de archivos HDFS desde Spark. En este ejemplo, la concurrencia se establece en 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

    En el comando, path es el directorio que contiene el archivo hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar.

  2. En el shell interactivo de Spark SQL, ejecute las siguientes sentencias SQL para crear vistas temporales y escribir datos.

    En esta prueba se utiliza una tabla temporal para facilitar el ajuste de parámetros al evaluar el rendimiento de escritura de los distintos modos.

    Nota

    En la práctica, también puede utilizar catalog para cargar tablas de Hologres directamente.

    -- 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;

    La siguiente tabla describe los parámetros.

    Parámetro

    Descripción

    spark_resources

    La cluster root storage path que configura al crear el clúster EMR Spark.

    Puede encontrar esta ruta en la sección Cluster Information, dentro de la página Basic Information de su clúster en la consola EMR on ECS.

    hologres_vpc_endpoint

    El Domain Name de VPC de la instancia de Hologres.

    Inicie sesión en la consola de Hologres, haga clic en el ID de la instancia objetivo y busque el endpoint de la VPC especificada en la sección de información de red de la página de detalles de la instancia. Por ejemplo, un endpoint de VPC en la región China (Hangzhou) tiene el formato <Instance ID>-cn-hangzhou-vpc-st.hologres.aliyuncs.com:80.

    database_name

    El nombre de la base de datos en la instancia de Hologres.

    accesskey_id

    El AccessKey ID con permisos de lectura en la base de datos de Hologres especificada.

    accesskey_secret

    El AccessKey secret con permisos de lectura en la base de datos de Hologres especificada.

    table_name

    El nombre de la Hologres table de destino.

    write.mode

    El modo de escritura. Valores válidos:

    • auto: Valor predeterminado. El conector selecciona automáticamente el modo óptimo.

    • insert: Escribe datos mediante sentencias INSERT INTO VALUES.

    • stream: Realiza escrituras mediante streaming utilizando FIXED COPY.

    • bulk_load: Realiza una importación por lotes a una tabla sin clave principal mediante COPY.

    • bulk_load_on_conflict: Realiza una importación por lotes a una tabla con clave principal mediante COPY.

    write.insert.thread_size

    La concurrencia de escritura. Este parámetro aplica únicamente al modo insert.

    write.insert.batch_size

    El tamaño del lote de escritura. Este parámetro aplica únicamente al modo insert.

    write.on_conflict_action

    INSERT_OR_REPLACE (predeterminado): Si ocurre un conflicto de clave principal, los datos se actualizan.

    INSERT_OR_IGNORE: Si ocurre un conflicto de clave principal, los datos se ignoran.

    Para obtener más información sobre los parámetros, consulte Parameters.

Escenarios de prueba

Escenario de prueba

Opciones

Formato de almacenamiento de tabla

  • Almacenamiento orientado a filas

  • Almacenamiento orientado a columnas

  • Almacenamiento híbrido de filas y columnas

Método de actualización de datos

  • Escrituras de solo anexado a una tabla sin clave principal

  • Escrituras iniciales a una tabla vacía con clave principal

  • Actualizaciones de fila completa a una tabla con clave principal

Modo de escritura

  • insert (INSERT INTO VALUES)

  • stream (FIXED COPY)

  • bulk_load (importación COPY a una tabla sin clave principal)

  • bulk_load_on_conflict (importación COPY a una tabla con clave principal)

Resultados de las pruebas

Los resultados de las pruebas incluyen los siguientes campos:

Campo

Descripción

Duración total del trabajo

Tiempo total de ejecución del trabajo de Spark.

Este valor representa el tiempo necesario para ejecutar la operación INSERT en el shell interactivo de Spark SQL sobre un nodo del clúster EMR Spark. Esta duración aparece en la línea Time taken de la salida del 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

Duración promedio de escritura de datos

Duración promedio del trabajo de escritura en sí, sin incluir el tiempo dedicado a la programación del clúster de Spark, la lectura de datos ni la redistribución de datos.

En la página HoloWeb de la consola de Hologres, ejecute la siguiente sentencia SQL para obtener la concurrencia de shards (valor de COUNT(*)) y la duración promedio de escritura de datos (avg_duration_ms) en milisegundos:

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';

La siguiente tabla describe los parámetros.

  • start_time: hora de inicio de la operación de escritura de datos, por ejemplo, 2024-04-11 15:00:00.

  • end_time: hora de finalización de la operación de escritura de datos, por ejemplo, 2024-04-11 15:10:00.

  • hologres_table_name: nombre de la tabla de destino en Hologres, por ejemplo, your_table_name.

Carga de Hologres

Utilización de CPU de la instancia de Hologres.

Puede consultar la utilización de CPU en la página Monitoring Information de la instancia dentro de la consola de Hologres.

Carga de Spark

Carga en los nodos de EMR.

En la consola de EMR on ECS, vaya a la pestaña Monitoring and Diagnostics > Metric Monitoring de su clúster y configure los siguientes ajustes:

  • Dashboard: seleccione HOST.

  • nodeGroupId: seleccione el ID del grupo de nodos principales del clúster.

  • hostname: seleccione los nodos principales.

  • Select Time: seleccione el periodo que abarque la operación de escritura de datos de Spark.

A continuación, consulte la métrica CPU utilization para ver la carga de Spark.

La siguiente tabla muestra los resultados detallados de las pruebas.

Formato de almacenamiento

Clave principal

Modo de escritura

Duración total del trabajo

Duración promedio de escritura

Carga de Hologres

Carga de Spark

Almacenamiento orientado a columnas

Sin clave principal

insert

241.61s

232.70s

92%

15%

stream

228.11s

222.34s

100%

36%

bulk_load

88.72s

57.16s

97%

47%

Con clave principal

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%

Con clave principal

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%

Almacenamiento orientado a filas

Sin clave principal

insert

132.38s

123.79s

94%

22%

stream

114.41s

103.81s

100%

17%

bulk_load

68.20s

41.22s

98%

32%

Con clave principal

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%

Con clave principal

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%

Almacenamiento híbrido fila-columna

Con clave principal

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%

Con clave principal

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

Los modos de escritura corresponden a las siguientes operaciones:

  • insert: INSERT INTO VALUES

  • stream: FIXED COPY

  • bulk_load: importación COPY a una tabla sin clave principal

  • bulk_load_on_conflict: importación COPY a una tabla con clave principal