¿Por qué usar ClickHouse Cloud en lugar de BigQuery?
Carga de datos desde BigQuery a ClickHouse Cloud
Conjunto de datos
post, vote, user, comment y badge de Stack Overflow desde 2008 hasta abril de 2024. El esquema de BigQuery para estos datos se muestra a continuación:
Para los usuarios que deseen cargar este conjunto de datos en una instancia de BigQuery para probar los pasos de migración, hemos proporcionado los datos de estas tablas en formato Parquet en un bucket de GCS, y los comandos DDL para crear y cargar las tablas en BigQuery están disponibles aquí.
Migración de datos
- Carga masiva inicial con actualizaciones periódicas: se debe migrar un conjunto de datos inicial junto con actualizaciones periódicas en intervalos definidos, por ejemplo, diariamente. Aquí, las actualizaciones se gestionan reenviando las filas que han cambiado, identificadas mediante una columna que pueda usarse para comparaciones (p. ej., una fecha). Las eliminaciones se gestionan mediante una recarga periódica completa del conjunto de datos.
- Replicación en tiempo real o CDC: se debe migrar un conjunto de datos inicial. Los cambios en este conjunto de datos deben reflejarse en ClickHouse casi en tiempo real, con un retraso aceptable de solo unos segundos. En la práctica, se trata de un proceso de captura de datos modificados (CDC), en el que las tablas de BigQuery deben sincronizarse con ClickHouse; es decir, las inserciones, actualizaciones y eliminaciones en la tabla de BigQuery deben aplicarse a una tabla equivalente en ClickHouse.
Carga masiva mediante Google Cloud Storage (GCS)
- Exporte las 7 tablas a GCS. Los comandos para hacerlo están disponibles aquí.
-
Importe los datos a ClickHouse Cloud. Para ello, podemos usar la función de tabla gcs. El DDL y las consultas de importación están disponibles aquí. Tenga en cuenta que, como una instancia de ClickHouse Cloud consta de varios nodos de compute, en lugar de la
función de tablagcs, usamos la función de tabla s3Cluster. Esta función también funciona con buckets de GCS y utiliza todos los nodos de un servicio de ClickHouse Cloud para cargar los datos en paralelo.
- La funcionalidad de exportación de BigQuery admite un filtro para exportar un subconjunto de los datos.
- BigQuery permite exportar en formatos Parquet, Avro, JSON y CSV, así como con varios tipos de compresión, todos ellos compatibles con ClickHouse.
- GCS admite la gestión del ciclo de vida de objetos, lo que permite eliminar, después de un período especificado, los datos que ya se hayan exportado e importado en ClickHouse.
- Google permite exportar hasta 50 TB por día a GCS de forma gratuita. Los usuarios solo pagan por el almacenamiento en GCS.
- Las exportaciones generan varios archivos automáticamente, y limitan cada uno a un máximo de 1 GB de datos de tabla. Esto beneficia a ClickHouse, ya que permite paralelizar las importaciones.
Replicación en tiempo real o CDC mediante consultas programadas
Diseño de esquemas
posts. A continuación se muestra el esquema de BigQuery correspondiente:
Optimización de los tipos
INSERT INTO SELECT, leyendo los datos exportados desde gcs mediante la función de tabla gcs. Ten en cuenta que, en ClickHouse Cloud, también puedes usar la función de tabla s3Cluster compatible con gcs para paralelizar la carga entre varios nodos:
¿En qué se diferencian las claves primarias de ClickHouse?
- La eficiencia de la memoria y del disco es fundamental a la escala a la que suele utilizarse ClickHouse. Los datos se escriben en las tablas de ClickHouse en fragmentos conocidos como partes, y se aplican reglas para fusionar esas partes en segundo plano. En ClickHouse, cada parte tiene su propio índice primario. Cuando las partes se fusionan, los índices primarios de la parte fusionada también se fusionan. Cabe señalar que estos índices no se construyen para cada fila. En su lugar, el índice primario de una parte tiene una entrada de índice por grupo de filas; esta técnica se denomina indexación dispersa.
- La indexación dispersa es posible porque ClickHouse almacena en disco las filas de una parte ordenadas por una clave especificada. En lugar de localizar directamente filas individuales (como un índice basado en B-Tree), el índice primario disperso le permite identificar rápidamente (mediante una búsqueda binaria sobre las entradas del índice) grupos de filas que podrían coincidir con la consulta. Los grupos localizados de filas potencialmente coincidentes se transmiten después, en paralelo, al motor de ClickHouse para encontrar las coincidencias. Este diseño de índices permite que el índice primario sea pequeño (cabe por completo en la memoria principal) y, aun así, acelere significativamente los tiempos de ejecución de las consultas, especialmente en las consultas de rango típicas de los casos de uso de análisis de datos. Para más detalles, recomendamos esta guía detallada.
Todas las columnas de una tabla se ordenarán según el valor de la clave de ordenación especificada, independientemente de si están incluidas en la propia clave. Por ejemplo, siCreationDatese usa como clave, el orden de los valores en todas las demás columnas corresponderá al orden de los valores de la columnaCreationDate. Se pueden especificar varias claves de ordenación; esto ordenará con la misma semántica que una cláusulaORDER BYen una consultaSELECT.
Elegir una clave de ordenación
Técnicas de modelado de datos
Particiones
PARTITION BY. Esta cláusula puede contener una expresión SQL sobre cualquier columna, y sus resultados definirán a qué partición se envía una fila.
Las partes de datos se asocian lógicamente con cada partición en disco y pueden consultarse de forma aislada. En el ejemplo siguiente, particionamos la tabla posts por año usando la expresión toYear(CreationDate). A medida que se insertan filas en ClickHouse, esta expresión se evaluará para cada fila; después, las filas se dirigirán a la partición resultante en forma de nuevas partes de datos pertenecientes a esa partición.
Aplicaciones
- Gestión de datos: en ClickHouse, conviene considerar el particionado principalmente como una característica de gestión de datos, no como una técnica de optimización de consultas. Al separar los datos lógicamente según una clave, cada partición puede gestionarse de forma independiente; por ejemplo, puede eliminarse. Esto permite mover particiones y, por tanto, subconjuntos entre niveles de almacenamiento de forma eficiente en función del tiempo o hacer que los datos caduquen/eliminarlos eficientemente del clúster. En el ejemplo siguiente, eliminamos posts de 2008:
- Optimización de consultas - Aunque las particiones pueden ayudar a mejorar el rendimiento de las consultas, esto depende en gran medida de los patrones de acceso. Si las consultas se dirigen solo a unas pocas particiones (idealmente, una sola), el rendimiento puede mejorar. Normalmente, esto solo es útil si la clave de partición no forma parte de la clave primaria y se está filtrando por ella. Sin embargo, las consultas que necesitan abarcar muchas particiones pueden tener peor rendimiento que si no se usara particionado (ya que el particionado puede dar lugar a un mayor número de partes). La ventaja de dirigirse a una sola partición será aún menos apreciable, o incluso inexistente, si la clave de partición ya aparece entre las primeras entradas de la clave primaria. El particionado también puede usarse para optimizar consultas
GROUP BYsi los valores de cada partición son únicos. Sin embargo, en general, debes asegurarte de que la clave primaria esté optimizada y considerar el particionado como una técnica de optimización de consultas solo en casos excepcionales en los que los patrones de acceso se limiten a un subconjunto específico y predecible del tiempo, por ejemplo, particionar por día cuando la mayoría de las consultas se centran en el último día.
Recomendaciones
ORDER BY.
Internamente, ClickHouse crea partes para los datos insertados. A medida que se insertan más datos, el número de partes aumenta. Para evitar un número excesivamente alto de partes, lo que degradará el rendimiento de las consultas (porque habrá más archivos que leer), las partes se fusionan en un proceso asíncrono en segundo plano. Si el número de partes supera un límite preconfigurado, ClickHouse lanzará una excepción durante la inserción con el error “too many parts”. Esto no debería ocurrir en condiciones normales de funcionamiento y solo sucede si ClickHouse está mal configurado o se utiliza incorrectamente; por ejemplo, con muchas inserciones pequeñas. Dado que las partes se crean por partición de forma aislada, aumentar el número de particiones hace que aumente el número de partes; es decir, el total es un múltiplo del número de particiones. Por lo tanto, las claves de partición de alta cardinalidad pueden provocar este error y deben evitarse.
Vistas materializadas vs proyecciones
ORDER BY para una tabla.
En el modelado de datos de ClickHouse, exploramos cómo se pueden usar las vistas materializadas
en ClickHouse para precalcular agregaciones, transformar filas y optimizar consultas
para distintos patrones de acceso. En este último caso, proporcionamos un ejemplo en el que
la vista materializada envía filas a una tabla de destino con una clave de ordenación distinta
de la de la tabla original en la que se insertan las filas.
Por ejemplo, considere la siguiente consulta:
UserId
no es la clave de ordenación. Anteriormente, resolvimos esto usando una vista materializada
que servía para localizar el PostId. El mismo problema puede resolverse con una proyección.
El comando siguiente añade una proyección con ORDER BY user_id.
ALTER, la creación se realiza de forma asíncrona
cuando se ejecuta el comando MATERIALIZE PROJECTION. Puede comprobar el progreso
de esta operación con la siguiente consulta, esperando a que is_done=1.
EXPLAIN, también confirmamos que se utilizó la proyección para ejecutar esta consulta:
Cuándo usar proyecciones
- Se requiere una reordenación completa de los datos. Aunque la expresión de la proyección puede, en teoría, usar un
GROUP BY,las vistas materializadas son más eficaces para mantener agregados. También es más probable que el optimizador de consultas aproveche las proyecciones que usan una reordenación simple; es decir,SELECT * ORDER BY x. Puede seleccionar un subconjunto de columnas en esta expresión para reducir el espacio de almacenamiento. - Los usuarios aceptan el aumento correspondiente en el espacio de almacenamiento y la sobrecarga que supone escribir los datos dos veces. Pruebe el impacto en la velocidad de inserción y evalúe la sobrecarga de almacenamiento.
Reescritura de consultas de BigQuery en ClickHouse
ClickHouse
Funciones de agregación
argMax para calcular la pregunta más vista de cada año.
BigQuery
ClickHouse
Condicionales y arrays
HAVING y SELECT.
BigQuery
ClickHouse