Paso a paso: cómo ClickHouse paraleliza una consulta de agregación
Distribución del trabajo entre lanes de procesamiento
n lanes de procesamiento en paralelo, que transfieren y procesan los datos block a block hasta obtener el resultado final:
La cantidad de
n lanes de procesamiento en paralelo está controlada por la configuración max_threads, que de forma predeterminada coincide con la cantidad de núcleos (threads) de una sola CPU disponibles para ClickHouse en el servidor. En el ejemplo anterior, asumimos 4 núcleos.
En una máquina con 8 núcleos, el rendimiento del procesamiento de consultas aproximadamente se duplicaría (aunque el uso de memoria también aumentaría en consecuencia), ya que más lanes procesan datos en paralelo:
Una distribución eficiente de los lanes es clave para maximizar el uso de la CPU y reducir el tiempo total de consulta.
Procesamiento de consultas en tablas segmentadas
El servidor que recibe inicialmente la consulta recopila todos los subresultados de los segmentos y los combina para obtener el resultado global final. Distribuir la carga de consultas entre segmentos permite escalar horizontalmente el paralelismo, especialmente en entornos de alto rendimiento.
ClickHouse Cloud usa réplicas paralelas en lugar de segmentosEn ClickHouse Cloud, este mismo paralelismo se logra mediante réplicas paralelas, que funcionan de forma similar a los segmentos en clústeres shared-nothing. Cada réplica de ClickHouse Cloud —un nodo de cómputo sin estado— procesa una parte de los datos en paralelo y contribuye al resultado final, igual que lo haría un segmento independiente.
Monitorización del paralelismo de las consultas
- ① ClickHouse necesita leer 3.609 gránulos (indicados como marks en los logs de traza) a lo largo de 3 rangos de datos.
- ② Con 59 núcleos de CPU, distribuye este trabajo en 59 flujos de procesamiento paralelos, uno por cada lane.
× 59 se ejecutan de forma concurrente sobre regiones de datos no superpuestas a través de 59 lane de procesamiento paralelas. Esto refleja el valor de max_threads e ilustra cómo se paraleliza cada etapa de la consulta entre los núcleos de CPU.
La web UI integrada de ClickHouse (disponible en el endpoint /play) puede representar el plan físico anterior como una visualización gráfica. En este ejemplo, establecemos max_threads en 4 para mantener la visualización compacta y mostrar solo 4 lane de procesamiento paralelas:
Nota: Lea la visualización de izquierda a derecha. Cada fila representa una lane de procesamiento paralelo que transmite datos bloque por bloque, aplicando transformaciones como filtrado, agregación y etapas finales de procesamiento. En este ejemplo, puede ver cuatro lane paralelas correspondientes a la configuración max_threads = 4.
Balanceo de carga entre lanes de procesamiento
Resize del plan físico anterior reparticionan y redistribuyen los flujos de bloques de datos entre lanes de procesamiento para mantener un uso equilibrado. Este reequilibrio es especialmente importante cuando los rangos de datos varían en la cantidad de filas que coinciden con los predicados de la consulta; de lo contrario, algunas lanes pueden sobrecargarse mientras otras permanecen inactivas. Al redistribuir el trabajo, las lanes más rápidas ayudan en la práctica a las más lentas, lo que optimiza el tiempo de ejecución general de la consulta.
Por qué no siempre se respeta max_threads
n lanes de procesamiento en paralelo está determinado por la configuración max_threads, que de forma predeterminada coincide con el número de núcleos de CPU disponibles para ClickHouse en el servidor:
max_threads puede ignorarse en función de la cantidad de datos seleccionados para su procesamiento:
max_threads está establecido en 59, ClickHouse usa solo 30 streams concurrentes para escanear los datos.
Ahora ejecutemos la consulta:
max_threads, ClickHouse solo asigna lanes adicionales de procesamiento en paralelo cuando hay suficientes datos para justificarlo. El “max” de max_threads se refiere a un límite superior, no a una cantidad garantizada de hilos en uso.
Lo que significa “suficientes datos” lo determinan principalmente dos ajustes, que definen el número mínimo de filas (163,840 de forma predeterminada) y el número mínimo de bytes (2,097,152 de forma predeterminada) que debe manejar cada lane de procesamiento:
Para clústeres shared-nothing:
Para clústeres con almacenamiento compartido (p. ej., ClickHouse Cloud):
- merge_tree_min_rows_for_concurrent_read_for_remote_filesystem
- merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem
max_threads.
Esto demuestra que, para consultas sobre conjuntos de datos pequeños, ClickHouse limita intencionalmente la concurrencia. Use las sobrescrituras de configuración solo para pruebas, no en producción, ya que pueden provocar una ejecución ineficiente o contención de recursos.
Puntos clave
- ClickHouse paraleliza las consultas mediante lanes de procesamiento vinculados a
max_threads. - El número real de lanes depende del volumen de datos seleccionado para su procesamiento.
- Usa
EXPLAIN PIPELINEy los logs de nivel trace para analizar el uso de lanes.
Dónde encontrar más información
- Capa de procesamiento de consultas – artículo de VLDB 2024 (edición web) - Un desglose detallado del modelo de ejecución interno de ClickHouse, incluida la planificación, la canalización y el diseño de operadores.
- Estados de agregación parciales, explicados - Un análisis técnico en profundidad de cómo los estados de agregación parciales permiten una ejecución eficiente en paralelo entre lanes de procesamiento.
- Un tutorial en video que recorre en detalle todos los pasos del procesamiento de consultas de ClickHouse: