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 |
|
|
|
|
|
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 |
|
|
|
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.
NotaEl 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.modedel conector enauto(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
TRUEpara el modo COPY o enFALSEpara 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.
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:
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.xdesde 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
-
Prepare los datos de origen.
Inicie sesión en el nodo maestro del clúster EMR Spark. Para obtener más información, consulte Connect to an ECS instance.
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.-
Ejecute el siguiente comando en el directorio
dbgenpara generar un archivocustomer.tblcorrespondiente a un conjunto de datos de prueba de 1 TB../dbgen -s 1000 -T cLa 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
-
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.
-
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.
-
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.
NotaPuede ajustar el valor del parámetro
spark.sql.files.maxPartitionBytespara 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=644245094En el comando, path es el directorio que contiene el archivo
hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar. -
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.
NotaEn 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 |
|
|
Método de actualización de datos |
|
|
Modo de escritura |
|
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
|
|
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
La siguiente tabla describe los parámetros.
|
|
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:
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% |
Los modos de escritura corresponden a las siguientes operaciones:
insert: INSERT INTO VALUESstream: FIXED COPYbulk_load: importación COPY a una tabla sin clave principalbulk_load_on_conflict: importación COPY a una tabla con clave principal