Este informe técnico describe cómo utilizar la herramienta de benchmark Nexmark para evaluar el rendimiento del procesamiento de flujos en Realtime Compute for Apache Flink.
Resumen de rendimiento
Nexmark es un benchmark de rendimiento estándar en la industria para motores de procesamiento de flujos. Incluye 19 consultas estándar que cubren escenarios típicos como filtrado, agregación, joins y ventanas. Este documento utiliza la herramienta de pruebas Nexmark para llevar a cabo una evaluación completa del rendimiento de Realtime Compute for Apache Flink con una configuración de 8 CU y una línea base de 100 millones de registros de entrada por consulta. Los resultados muestran que:
Las consultas simples, como q0, q1 y q2, alcanzan un RPS de entre 4 y 6.5 millones de registros por segundo.
Las consultas complejas de agregación y ventanas, como q4, q5 y q16, logran un RPS de entre 150,000 y 630,000 registros por segundo.
En términos generales, Realtime Compute for Apache Flink ofrece un rendimiento en Nexmark 3.24 veces superior al de Flink open source.
Herramienta de pruebas
Nexmark es una suite estándar de pruebas de benchmark para motores de procesamiento de flujos. El modelo de prueba es el siguiente:
Tabla de origen Nexmark: genera datos de prueba (eventos Person, Auction y Bid) a un TPS especificado.
Transformaciones: 19 consultas estándar de Nexmark que abarcan escenarios típicos como filtrado, transformación, agregación, joins y ventanas.
Tabla de destino Blackhole: los datos se escriben en un destino blackhole para eliminar la interferencia de rendimiento del almacenamiento externo, lo que permite que la evaluación se centre en la capacidad de procesamiento del propio motor Flink.
La herramienta de pruebas Nexmark utilizada en este documento se implementó con base en la OpenAPI de Realtime Compute for Apache Flink. Automatiza todo el flujo de trabajo, incluida la creación de jobs, el despliegue, el monitoreo y la recopilación de resultados. No es necesario escribir SQL manualmente ni crear jobs en la consola.
Entorno de pruebas
Los jobs de Flink en esta prueba utilizaron las siguientes configuraciones de optimización:
|
Parámetro |
Valor |
Descripción |
|
table.exec.mini-batch.enabled |
true |
Habilita la agregación Mini-Batch. |
|
table.exec.mini-batch.allow-latency |
2s |
Intervalo de almacenamiento en búfer de Mini-Batch. |
|
table.optimizer.distinct-agg.split.enabled |
true |
Habilita la optimización de división para la agregación Distinct. |
|
execution.checkpointing.interval |
3min |
Intervalo de checkpoint. |
Requisitos previos
Tener instalado Java Development Kit (JDK) 1.8.x o posterior.
Haber activado Realtime Compute for Apache Flink y creado un workspace. Para obtener más información, consulte Activate Realtime Compute for Apache Flink.
Haber obtenido el AccessKey ID y el AccessKey Secret de su cuenta de Alibaba Cloud.
Procedimiento
Paso 1: Descargar la herramienta de pruebas
Descargue y extraiga el paquete de la herramienta de pruebas Nexmark nexmark-flink.tar.gz.
La estructura de directorios después de la extracción es la siguiente:
nexmark-flink/
├── run_nexmark.sh # Test entry script
├── nexmark_env.sh # Environment variable configuration file (requires editing)
├── bin/ # Runtime scripts
├── conf/ # Flink job configurations
├── lib/ # JAR files (to be uploaded to the console)
└── queries-vvp/ # Nexmark Query SQL files
Paso 2: Cargar el JAR de Nexmark
Inicie sesión en la Realtime Compute for Apache Flink console.
Haga clic en el project space deseado. En la barra de navegación izquierda, seleccione .
Seleccione y cargue el archivo
nexmark-flink-0.2-SNAPSHOT.jar. El archivo se encuentra en el directorionexmark-flink/libde la herramienta de pruebas.-
Una vez completada la carga, haga clic en el nombre del archivo para copiar su dirección de OSS. Necesitará esta dirección para un paso de configuración posterior. El formato de la ruta del archivo varía según el tipo de almacenamiento:
-
Almacenamiento en bucket de OSS:
oss://<OSS Bucket name>/artifacts/namespaces/<project space name>/<file name>Ejemplo:
oss://oss-test/artifacts/namespaces/flink-default/nexmark-flink-0.2-SNAPSHOT.jar -
Almacenamiento totalmente administrado:
oss://flink-fullymanaged-<workspace ID>/artifacts/namespaces/<project space name>/<file name>Ejemplo: oss://flink-fullymanaged-e6a123456789/artifacts/namespaces/flink-default/nexmark-flink-0.2-SNAPSHOT.jar
Para consultar el tipo de almacenamiento de su workspace, vaya a la consola de administración de Realtime Compute for Apache Flink, busque el workspace correspondiente y haga clic en Actions en la columna Details.
-
Paso 3: Configurar los parámetros de ejecución
Edite el archivo nexmark-flink/nexmark_env.sh y establezca los siguientes parámetros.
|
Parámetro |
Descripción |
Ejemplo |
|
END_POINT |
El endpoint de Realtime Compute for Apache Flink. Seleccione el endpoint correspondiente a su región. Para obtener más información, consulte Endpoints. |
ververica.cn-hangzhou.aliyuncs.com |
|
AK |
El AccessKey ID de su cuenta de Alibaba Cloud. |
- |
|
SK |
El AccessKey Secret de su cuenta de Alibaba Cloud. |
- |
|
WORK_SPACE |
El ID de su workspace. |
e6a123456789 |
|
NAMESPACE |
El nombre de su project space. |
flink-default |
|
NEXMARK_JAR |
La dirección de OSS del archivo JAR que cargó en el Paso 2. |
oss://flink-fullymanaged-e6a123456789/artifacts/namespaces/flink-default/nexmark-flink-0.2-SNAPSHOT.jar |
|
FLINK_VERSION |
La versión del motor Flink que se va a probar. |
vvr-11.5-jdk11-flink-1.20 |
|
QUERIES |
Especifique las consultas que desea ejecutar. Separe varias consultas con comas; por ejemplo, |
all |
Ejecutar todas las consultas consume mucho tiempo. Cada consulta debe pasar por etapas como la creación del job, la generación de datos y la ejecución de cálculos. Se recomienda ejecutar primero una sola consulta (por ejemplo, establecer QUERIES en q0) para comprobar que la configuración del entorno y los parámetros son correctos antes de realizar una prueba a gran escala.
Paso 4: Ejecutar la prueba
-
En el directorio
nexmark-flink, ejecute el siguiente comando../run_nexmark.sh La herramienta de pruebas crea y ejecuta automáticamente los jobs de Nexmark mediante OpenAPI.
-
Al finalizar la prueba, se muestra la duración de cada consulta en milisegundos. El siguiente ejemplo muestra una salida de muestra:
INFO com.github.nexmark.flink.vvp.Nexmark - q0 13078 ============================================================================ ✓ Benchmark execution completed successfully ============================================================================
Resultados de rendimiento
La siguiente tabla compara el rendimiento en Nexmark entre Flink open source (1.20.4) y Realtime Compute for Apache Flink (vvr-11.5-jdk11-flink-1.20) con una configuración de 8 CU. Cada consulta procesa una entrada de 100 millones de registros. RPS = Número de registros de entrada ÷ Duración.
Los siguientes datos de prueba se recopilaron en un entorno de hardware específico y con versiones específicas del motor. El rendimiento real puede variar debido a actualizaciones de hardware y del motor. Estos resultados son solo de referencia.
|
Consulta |
Flink open source en ECS Versión: 1.20.4 |
Realtime Compute for Apache Flink Versión: vvr-11.5-jdk11-flink-1.20 |
|||
|
Duración (ms) |
RPS |
Duración (ms) |
RPS |
RPS vs. open source (×) |
|
|
q0 |
58848 |
1,699,293 |
23450 |
4,264,392 |
2.51 |
|
q1 |
57045 |
1,753,002 |
22824 |
4,381,353 |
2.50 |
|
q2 |
51890 |
1,927,154 |
15224 |
6,568,576 |
3.41 |
|
q3 |
84986 |
1,176,664 |
21558 |
4,638,649 |
3.94 |
|
q4 |
553426 |
180,693 |
157117 |
636,468 |
3.52 |
|
q5 |
365636 |
273,496 |
357547 |
279,684 |
1.02 |
|
q7 |
1257452 |
79,526 |
333837 |
299,547 |
3.77 |
|
q8 |
79788 |
1,253,321 |
29939 |
3,340,125 |
2.67 |
|
q9 |
2324518 |
43,020 |
266563 |
375,146 |
8.72 |
|
q10 |
189985 |
526,357 |
51202 |
1,953,049 |
3.71 |
|
q11 |
408384 |
244,868 |
145983 |
685,011 |
2.80 |
|
q12 |
121554 |
822,680 |
36991 |
2,703,360 |
3.29 |
|
q14 |
68903 |
1,451,316 |
20012 |
4,997,002 |
3.44 |
|
q15 |
183709 |
544,339 |
42734 |
2,340,057 |
4.30 |
|
q16 |
917597 |
108,980 |
337293 |
296,478 |
2.72 |
|
q17 |
102847 |
972,318 |
27076 |
3,693,308 |
3.80 |
|
q18 |
574949 |
173,928 |
96335 |
1,038,044 |
5.97 |
|
q19 |
586287 |
170,565 |
95121 |
1,051,293 |
6.16 |
|
q20 |
1340638 |
74,591 |
231482 |
431,999 |
5.79 |
|
q21 |
127089 |
786,850 |
39693 |
2,519,336 |
3.20 |
|
q22 |
94830 |
1,054,519 |
31228 |
3,202,254 |
3.04 |
|
Total |
2383209 |
49,695,131 |
9550361 |
15,317,480 |
3.24 |
Procedimiento de prueba para Flink open source
Para reproducir los resultados en Flink open source sobre ECS, siga este procedimiento.
Preparación del entorno
Cree un clúster de Flink mediante EMR en ECS con la siguiente configuración:
Versión de EMR: EMR-5.21.0
Especificación de hardware: tres instancias ecs.g6a.xlarge (4 vCPU / 16 GiB), incluido un nodo maestro y dos nodos core.
Habilite los servicios Hadoop y HDFS.
-
Configure el inicio de sesión sin contraseña entre todos los nodos. Por ejemplo, cargue su archivo de clave privada (como
key.pem) en el nodo maestro. Luego, agregue la siguiente configuración al archivo~/.ssh/configdel nodo maestro. Reemplace las direcciones IP y la ruta del archivo con sus valores reales.Host 192.168.0.0 HostName 192.168.0.0 User root IdentityFile /path/to/key.pem StrictHostKeyChecking no Host 192.168.0.1 HostName 192.168.0.1 User root IdentityFile /path/to/key.pem StrictHostKeyChecking no Host 192.168.0.2 HostName 192.168.0.2 User root IdentityFile /path/to/key.pem StrictHostKeyChecking noUse ssh para comprobar que el inicio de sesión sin contraseña entre los nodos funciona correctamente. Si ocurre un error de "bad permissions", ejecute
chmod 600 /path/to/key.pempara corregir los permisos.
Preparación del software
-
Descargue el paquete de Flink deseado (Apache Flink Downloads) y el paquete de pruebas Nexmark (nexmark-flink.tgz). Cargue los paquetes en el nodo maestro y extráigalos.
tar -zxvf flink-1.20.4-bin-scala_2.12.tgz tar -zxvf nexmark-flink.tgz mv flink-1.20.4 flink mv nexmark-flink nexmark
-
Copie los archivos JAR del directorio
nexmark/libaflink/lib. Estos JAR contienen el generador de datos de Nexmark.cp nexmark/lib/* flink/lib/
-
Establezca las variables de entorno. Edite
~/.bashrc, agregue la siguiente configuración y luego ejecutesource ~/.bashrcpara que los cambios surtan efecto.Configure las rutas según su entorno real.
export JAVA_HOME=/etc/alternatives/java_sdk_11 export PATH=$JAVA_HOME/bin:$PATHexport FLINK_HOME=/mnt/disk1/flink export HADOOP_CLASSPATH=$(/opt/apps/HADOOP-COMMON/hadoop-common-current/bin/hadoop classpath)
Configuración e inicio del clúster
-
Configure los workers de Flink. Esta prueba utiliza ocho TaskManagers, distribuidos de la siguiente manera: dos en el nodo maestro y tres en cada nodo core.
Edite
flink/conf/workersy asegúrese de reemplazar la dirección IP con el valor real.192.168.0.0 192.168.0.0 192.168.0.1 192.168.0.1 192.168.0.1 192.168.0.2 192.168.0.2 192.168.0.2
-
Reemplace
flink/conf/config.yamlpornexmark/conf/config.yamly actualice los siguientes elementos de configuración:jobmanager.rpc.address: la dirección IP del nodo maestro, por ejemplo,192.168.0.0.state.checkpoints.dir: la ruta de HDFS, por ejemplo,hdfs:///checkpointstaskmanager.memory.process.size:4G
Edite
nexmark/conf/nexmark.yamly establezcanexmark.metric.reporter.hosten la dirección IP del nodo maestro.-
Distribuya los directorios
flinkynexmark, así como las configuraciones de variables de entorno, a cada nodo core.Reemplace las direcciones IP con sus valores reales.
scp -r flink 192.168.0.1:/mnt/disk1/ scp -r flink 192.168.0.2:/mnt/disk1/ scp -r nexmark 192.168.0.1:/mnt/disk1/ scp -r nexmark 192.168.0.2:/mnt/disk1/ scp ~/.bashrc 192.168.0.1:~/ scp ~/.bashrc 192.168.0.2:~/Una vez completada la distribución, ejecute
source ~/.bashrcen cada nodo core para que las variables de entorno surtan efecto.
-
En el nodo maestro, inicie el clúster de Flink.
flink/bin/start-cluster.sh
-
Inicialice el entorno de pruebas de Nexmark. Este script configura el Metric Reporter necesario en cada nodo.
nexmark/bin/setup_cluster.sh
Establecer límites de recursos
Después de iniciar el clúster de Flink, debe usar cgroups para limitar el uso de CPU de cada proceso TaskManager al 75%. Esto evita que los TaskManagers pierdan la conexión debido a tiempos de espera de heartbeat causados por contención de recursos.
Ejecute los siguientes comandos en todos los nodos donde se ejecuten TaskManagers, incluido el nodo maestro:
yum install -y libcgroup libcgroup-tools
cgcreate -t root:root -a root:root -g cpu,memory:mygroup
echo 100000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_period_us
echo 300000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
echo $((12 * 1024 * 1024 * 1024)) > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
jps | grep TaskManagerRunner | awk '{print $1}' | xargs cgclassify -g cpu,memory:mygroup
Aquí, cpu.cfs_quota_us / cpu.cfs_period_us = 300000 / 100000 = 3, lo que significa que el cgroup puede usar un máximo de 3 núcleos de CPU (75% de 4 vCPU).
En el entorno totalmente administrado de Realtime Compute for Apache Flink, no es necesario establecer manualmente un límite de uso de recursos. El servicio aprovecha por completo los recursos de cómputo adquiridos.
Ejecutar Nexmark
En el nodo maestro, ejecute el siguiente comando y espere a que finalice para ver los resultados:
nexmark/bin/run_query.sh q0,q1,q2,q3,q4,q5,q7,q8,q9,q10,q11,q12,q14,q15,q16,q17,q18,q19,q20,q21,q22