Garantizar un flujo fluido de datos es crucial para un análisis y una toma de decisiones eficaces. Hoy en día, con datos a menudo no estructurados y anidados, la elección de la base de datos desempeña un papel importante en la optimización de la eficiencia del procesamiento y el rendimiento de las consultas.
En esta entrada de blog, exploraremos el proceso de ingestión de datos desde MongoDB, una base de datos NoSQL, tanto en ClickHouse, una base de datos relacional, como en Couchbase Capella Columnaruna base de datos analítica NoSQL. Nos centraremos en el preprocesamiento necesario, la eficiencia de consulta para las uniones después de la ingestión, y cómo cada una maneja los cambios de datos en tiempo real. Mostraremos cómo Capella Columnar simplifica el trabajo con datos anidados, facilitando su almacenamiento y consulta en comparación con las complejidades de las bases de datos relacionales como ClickHouse.
TL;DR
ClickHouse requiere un amplio preprocesamiento para la ingestión de datos debido a la anidación de datos anidados, y la adición de nuevos campos puede requerir la creación de tablas adicionales. Los datos de una única colección de MongoDB deben dividirse en tablas separadas, lo que significa que se requieren uniones para realizar consultas, que pueden consumir muchos recursos. Además, añadir un nuevo campo anidado en tiempo real implica volver a crear tablas separadas y actualizar esquemas, lo que puede provocar interrupciones en el proceso y requerir intervención manual. Por el contrario, Capella Columnar simplifica el proceso al no requerir preprocesamiento para los datos anidados. Permite la ingesta directa desde colecciones MongoDB sin necesidad de tablas separadas o uniones, y refleja automáticamente los cambios en tiempo real como la adición de nuevos campos anidados sin procesamiento adicional.
¿Qué es Capella Columnar?
Antes de sumergirse en esta demostración de migración, puede que le interese ver nuestro vídeo sobre Capella Columnar o leer nuestro documento anuncio reciente que presentan esta nueva tecnología que hace converger las cargas de trabajo operativas y analíticas en tiempo real:
Muestra de datos MongoDB
Para el ámbito de esta demostración, hemos utilizado la colección MongoDB de ejemplo cines de la sample_mflix base de datos.
He aquí un ejemplo de documento de la colección teatros:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "_id": { "$oid": "59a47286cfa9a3a73e51e72c" }, "theaterId": 1000, "localización": { "dirección": { "calle1": "x1", "ciudad": "Bloomington", "estado": "MN", "código postal": "55425" }, "geo": { "tipo": "Punto", "coordenadas": [ -93.24565, 44.85466 ] } } } |
Ingesta de datos de MongoDB a Capella Columnar
Podemos utilizar Kafka Links en Capella Columnar para ingerir datos de temas Kafka, donde los datos de colecciones MongoDB ya han sido publicados. Para que esto suceda, los usuarios necesitan configurar su canalización Kafka, donde los datos MongoDB se canalizan en temas Kafka.
Paso 1 - conectar MongoDB a Kafka
-
- Descargar el Conector fuente Debezium MongoDB
- Ejecutar Kafka Connect - en modo autónomo o distribuido
- Enviar una solicitud POST con las propiedades de conexión necesarias para enlazar con
MongoDB
1 2 3 4 5 6 7 8 9 10 11 |
rizo -X POST -H "Content-Type: application/json" http://localhost:8083/conectores -d '{"nombre": "", "config": { "conector.class": "io.debezium.connector.mongodb.MongoDbConnector", "capture.mode": "change_streams_update_full", "mongodb.ssl.enabled": "true", "topic.prefix": "", "valor.convertidor": "org.apache.kafka.connect.json.JsonConverter", "valor.convertidor.esquemas.habilitar": "falso", "key.converter.schemas.enable": "falso", "key.converter": "org.apache.kafka.connect.json.JsonConverter", "colección.incluir.lista": "sample_mflix.theaters", "mongodb.connection.string":<mongo conexión cadena>}}'¯ |
Sustituya los marcadores de posición en la solicitud curl (indicados por los corchetes angulares, p. ej, <value>) con los valores apropiados para su caso de uso específico.
Después de eso, sus datos encontrarán su camino en el tema Kafka. Los datos estarán presentes en el tema Kafka de Confluent mongo_columnar_topic.sample_mflix.theaters:
Una vez que los datos están en el tema Kafka, ahora podemos utilizar Capella Columnar para extraer datos del tema Kafka en colecciones.
Paso 2 - crear un enlace en Capella Columnar
En este ejemplo estamos utilizando Confluent Kafka como el sabor de Kafka, Capella Columnar también soporta Amazon MSK también.
Paso 3: crear una colección vinculada
Después de crear un enlace, necesitamos crear una colección enlazada donde se almacenarán los datos:
Los campos son autoexplicativos, el campo primary key es la ruta de la clave primaria en el documento MongoDB que reside en el tema Kafka. En el ejemplo dado la clave primaria para el documento MongoDB es objectId:
1 |
_id`$oid`: Cadena |
Habilitar CDC crea un acuerdo sobre el formato del documento que el motor Capella Columnar entiende. Actualmente solo soportamos Debezium como conector fuente.
Paso 4 - Conectar el enlace
Después de crear la colección tenemos que conecte el enlace.
Una vez conectado el enlace, los datos deberían estar fluyendo, como podemos ver en la siguiente consulta.
La ingesta de datos de MongoDB a Capella Columnar fue fluida e intuitiva. Ahora, centrémonos en los retos a los que nos enfrentamos con las bases de datos relacionales como ClickHouse.
Migración de datos de MongoDB a ClickHouse
ClickHouse es una base de datos relacional, no podemos migrar datos directamente desde MongoDB debido a sus estructuras de datos anidadas y basadas en documentos. Esto requiere un paso adicional de transformación de datos. La complejidad de esta transformación aumenta si los datos de MongoDB están muy anidados o si se introducen campos adicionales, lo que requiere ajustes, como la creación de tablas adicionales para gestionar estos cambios.
Creación de una tabla en ClickHouse para colecciones MongoDB
Para crear una tabla en ClickHouse que se corresponda con una tabla MongoDB utilizamos la siguiente sintaxis:
1 2 3 4 5 6 |
CREAR CUADRO [SI NO EXISTE] [db.]nombre_tabla ( nombre1 [tipo1], nombre2 [tipo2], ... ) MOTOR = MongoDB(host:puerto, base de datos, colección, usuario, contraseña [, opciones]); |
La colección MongoDB a la que se hace referencia aquí debe ser sin anidar antes de señalarlo.
Tenemos un cines en MongoDB, y nuestro objetivo es representar estos datos en un formato estructurado y relacional en ClickHouse.
Como ClickHouse no admite campos anidados, tendremos que crear tres tablas para gestionar los campos cines datos con estos esquemas:
-
- cines: _id, theaterId
- cines_localizacion_direccion: Calle1, ciudad, estado, código postal
- cines_localizacion_geo: tipo, coordenadas
Preprocesamiento
Para preparar los datos, primero realizamos un preprocesamiento en el lado de MongoDB para anidar los campos necesarios. Esto implica crear canalizaciones de MongoDB para extraer y aplanar los campos anidados en colecciones separadas para Dirección y Geomientras que el Teatros puede crearse directamente.
Pipelines para MongoDB Dirección colección:
Tuberías para Geo colección:
Creación de tablas en ClickHouse
Una vez finalizado el preprocesamiento, creamos tres tablas correspondientes en ClickHouse:
Consulta para crear cines:
Consulta para crear cines_ubicación_dirección:
Consulta para crear cines_localizacion_geo:
Una vez completada la ingesta de datos de MongoDB a ClickHouse, vamos a explorar cómo se gestionan los cambios de datos en tiempo real en ambos sistemas. Examinaremos la facilidad de gestión de estos cambios en Capella Columnar en comparación con los retos a los que se enfrenta ClickHouse.
¿Cómo se gestionan los cambios en tiempo real?
Modificación en el lado MongoDB
Cambiemos un documento en MongoDB y añadamos un campo propietario anidado.
1 2 3 4 5 6 |
{ "Propietario": { "nombre": "John", "edad": 50 } } |
Cambios de CDC en vivo en Capella Columnar
No se requiere ningún paso adicional. Al consultar el documento en cuestión, podemos ver el cambio reflejado:
Configuración de ClickHouse
ClickHouse se enfrenta a retos para los cambios en tiempo real, ya que la canalización se rompe cuando se intenta introducir cambios directamente.
Para obtener los datos actualizados que contienen Propietario tendrá que crear otra tabla en ClickHouse. En primer lugar, cree una nueva colección MongoDB en la que el campo Propietario no está anidado y, a continuación, defina la tabla correspondiente en ClickHouse.
Pipeline en MongoDB para crear la colección de propietarios:
Creación de la propietario en ClickHouse:
Ahora que pasamos a la consulta de los datos, es importante señalar que en ClickHouse, la ejecución incluso de consultas sencillas requiere unir los datos, ya que creamos diferentes tablas para anidar los datos originales. Por el contrario, Capella Columnar maneja estas consultas sin esfuerzo, sin necesidad de pasos adicionales.
Consulta de datos en Capella Columnar frente a ClickHouse
Vamos a recuperar todos los theaterId y calle1 donde el geo tipo es Punto tanto en ClickHouse como en Capella Columnar.
Consulta para Capella Columnar:
1 |
seleccione theaterId, dirección.calle1 de columnar_th donde geo.tipo = Punto; |
Consulta para ClickHouse:
1 |
seleccione theaterId, calle1 de cines_localizacion_geo interior únase a cines_localizacion_direccion en cines_localizacion_geo.theaterId = cines_localizacion_direccion.theaterId donde `tipo` = Punto; |
Comparación de ClickHouse y Capella Columnar
Parámetro | ClickHouse | Capella Columnar |
Ingesta de datos | Se requiere un preprocesamiento exhaustivo debido a la anidación de datos anidados, y la adición de campos en columnas puede hacer necesaria la creación de tablas adicionales. | No es necesario preprocesar los datos anidados. |
Esquema y transformación de datos | Los datos de una única colección de MongoDB deben dividirse en tablas separadas, con uniones necesarias para la consulta, lo que puede resultar costoso. | Los datos pueden ser ingeridos directamente desde la colección MongoDB sin necesidad de tablas separadas o uniones. |
Cambios de datos en tiempo real | Añadir un nuevo campo anidado requiere volver a crear tablas separadas para anidar los datos, lo que requiere actualizaciones del esquema y transformaciones potencialmente complejas.
Esto provoca roturas en las tuberías y requiere intervención manual. |
Los cambios en tiempo real, como añadir un nuevo campo anidado, se reflejan automáticamente sin procesamiento adicional. |
Conclusión
En resumen, Couchbase Capella ofrece un enfoque más ágil para la ingesta y consulta de datos MongoDB anidados, minimizando el preprocesamiento y manejando cambios en tiempo real con facilidad. Por el contrario, ClickHouse requiere una amplia transformación de datos y ajustes de esquema, lo que lo hace menos eficiente para gestionar estructuras anidadas complejas. Para entornos que manejan datos en tiempo real y formatos anidados, Capella Columnar demuestra ser la opción más flexible y eficiente.