Diseño de esquemas para datos de series temporales

En esta página, se describen los patrones de diseño de esquemas para almacenar datos de series temporales en Bigtable . En esta página, se amplía la información de Diseña tu esquema y se supone que estás familiarizado con los conceptos y las recomendaciones descritos en esa página.

Una serie temporal es una colección de datos que consta de mediciones y del momento en que se registran las mediciones. Estos son algunos ejemplos de series temporales:

  • El trazado del uso de memoria en tu computadora
  • La temperatura en el tiempo en un informe de las noticias
  • Los precios del mercado de valores durante un período

Un buen esquema genera un excelente rendimiento y escalabilidad, mientras que uno malo puede provocar un rendimiento deficiente del sistema. Sin embargo, ningún diseño de esquema proporciona la mejor opción para todos los casos de uso.

Los patrones que se describen en esta página proporcionan un punto de partida. Tu conjunto de datos único y las consultas que planeas usar son los aspectos más importantes que debes tener en cuenta cuando diseñas un esquema para tus datos de series temporales.

Los patrones de diseño básicos para almacenar datos de series temporales en Bigtable son los siguientes:

Ejemplos de datos

Para ilustrar las diferencias entre los patrones, en los ejemplos de esta página, se supone que almacenas datos para una app que registra las mediciones que capturan los globos meteorológicos una vez por minuto. Usamos evento para referirnos a una sola solicitud que escribe una o varias celdas a la vez. Los ID de ubicación corresponden a las regiones de Google Cloud.

Medida Ejemplo
  1. Las marcas de tiempo de esta página tienen el formato “tAAAA-MM-DD-HHMM” para facilitar la lectura. En una tabla de producción, las marcas de tiempo suelen expresarse como el número de microsegundos desde 1970-01-0100:00:00 UTC, como “1616264288050807”.
Presión (pascales) 94587
Temperatura (grados Celsius) 9.5
Humedad (porcentaje) 65
Altitud (metros) 601
Datos relacionados Ejemplo
ID del globo 3698
Ubicación asia-southeast1
Marca de tiempo1 t2021-03-05-1204

Buckets de tiempo

En un patrón de buckets de tiempo, cada fila de tu tabla representa un “bucket” de tiempo, como una hora, un día o un mes. Una clave de fila incluye un identificador que no es una marca de tiempo, como week49, para el período registrado en la fila, junto con otros datos de identificación.

El tamaño del bucket que usas, como los minutos, las horas o los días, depende de las consultas que planeas usar y de los límites de tamaño de los datos de Bigtable. Por ejemplo, si las filas que contienen una hora de datos superan el tamaño máximo recomendado por fila de 100 MB, probablemente sea mejor usar filas que representen media hora o un minuto.

Estas son algunas ventajas de los patrones de buckets de tiempo:

  • Verás un rendimiento mejor. Por ejemplo, si almacenas 100 mediciones, Bigtable escribe y lee esas mediciones más rápido si están en una fila que si están en 100 filas.

  • Los datos almacenados de esta forma se comprimen de manera más eficiente que los datos en tablas largas y angostas.

Las desventajas incluyen lo siguiente:

  • Los patrones de diseño de esquemas de depósitos de tiempo son más complicados que los patrones de marcas de tiempo únicas y pueden llevar más tiempo y esfuerzo en desarrollarse.

Agregar columnas nuevas para los eventos nuevos

En este patrón de buckets de tiempo, debes escribir una columna nueva en una fila para cada evento y almacenar los datos en el calificador de columna en lugar de como un valor de celda. Esto significa que, para cada celda, debes enviar la familia de columnas, el calificador de columna y la marca de tiempo, pero ningún valor.

Si usamos este patrón para los datos del globo meteorológico de ejemplo, cada fila contiene todas las mediciones de una sola métrica, como pressure, de un solo globo meteorológico, en el transcurso de una semana. Cada clave de fila contiene la ubicación, el ID del globo, la métrica que registras en la fila y un número de semana. Cada vez que un globo informa sus datos para una métrica, agregas una columna nueva a la fila. El calificador de columna contiene la medida, la presión en pascales, para el minuto identificado por la marca de tiempo de la celda.

En este ejemplo, después de tres minutos, una fila podría verse así:

Clave de fila 94558 94122 95992
us-west2#3698#pressure#week1 t2021-03-05-1200 t2021-03-05-1201 t2021-03-05-1202

Estos son algunos casos de uso de este patrón:

Agregar celdas nuevas para los eventos nuevos

En este patrón de buckets de tiempo, se agregan celdas nuevas a las columnas existentes cuando escribes un evento nuevo. Este patrón te permite aprovechar la capacidad de Bigtable para almacenar varias celdas con marca de tiempo en una fila y una columna determinadas. Es importante especificar reglas de recolección de elementos no utilizados cuando usas este patrón.

Con los datos del globo meteorológico como ejemplo, cada fila contiene todas las mediciones de un solo globo meteorológico durante una semana. El prefijo de la clave de fila es un identificador de la semana, por lo que puedes leer los datos de una semana completa de varios globos con una sola consulta. Los otros segmentos de clave de fila son la ubicación donde opera el globo y el número de ID del globo. La tabla tiene una familia de columnas, measurements, y esa familia de columnas tiene una columna para cada tipo de medición: pressure, temperature, humidity y altitude.

Cada vez que un globo envía sus mediciones, la aplicación escribe valores nuevos en la fila que contiene los datos de la semana actual del globo y escribe celdas adicionales con marca de tiempo en cada columna. Al final de la semana, cada columna de cada fila tiene una medición por cada minuto de la semana, o 10,080 celdas (si tu política de recolección de elementos no utilizados lo permite).

Cada columna de cada fila contiene una medición por cada minuto de la semana. En este caso, después de tres minutos, las dos primeras columnas de una fila podrían verse así:

Clave de fila presión temp
asia-south2#3698#week1 94558 (t2021-03-05-1200) 9.5 (t2021-03-05-1200)
94122 (t2021-03-05-1201) 9.4 (t2021-03-05-1201)
95992 (t2021-03-05-1202) 9.2 (t2021-03-05-1202)

Estos son algunos casos de uso de este patrón:

  • Deseas medir los cambios en las mediciones en el tiempo.

Filas con marcas de tiempo únicas

En este patrón, creas una fila para cada medición o evento nuevo en lugar de agregar celdas a las columnas en filas existentes. El sufijo de la clave de fila es el valor de la marca de tiempo. Las tablas que siguen este patrón suelen ser largas y angostas, y cada columna de una fila contiene solo una celda.

Marca de tiempo única serializada

En este patrón, almacenas todos los datos de una fila en una sola columna en un formato serializado, como un búfer de protocolo (protobuf). Este enfoque se describe con más detalle en Diseña tu esquema.

Por ejemplo, si usas este patrón para almacenar los datos del globo meteorológico, la tabla podría verse así después de cuatro minutos:

Clave de fila measurements_blob
us-west2#3698#2021-03-05-1200 protobuf_1
us-west2#3698#2021-03-05-1201 protobuf_2
us-west2#3698#2021-03-05-1202 protobuf_3
us-west2#3698#2021-03-05-1203 protobuf_4

Estas son algunas ventajas de este patrón:

  • Eficiencia del almacenamiento

  • Velocidad

Las desventajas incluyen lo siguiente:

  • La incapacidad de recuperar solo ciertas columnas cuando lees los datos

  • La necesidad de deserializar los datos después de leerlos

Estos son algunos casos de uso de este patrón:

  • No estás seguro de cómo consultarás los datos o tus consultas podrían fluctuar.

  • Tu necesidad de mantener los costos bajos supera la necesidad de poder filtrar los datos antes de recuperarlos de Bigtable.

  • Cada evento contiene tantas medidas que puedes exceder el límite de 100 MB por fila si almacenas los datos en varias columnas.

Marca de tiempo única sin serializar

En este patrón, almacenas cada evento en su propia fila, incluso si solo registras una sola medición. Los datos de las columnas no están serializados.

Estas son algunas ventajas de este patrón:

  • Por lo general, es más fácil de implementar que un patrón de buckets de tiempo.

  • Es posible que dediques menos tiempo a definir mejor tu esquema antes de usarlo.

Las desventajas de este patrón suelen superar las ventajas:

  • Bigtable tiene un rendimiento menor con este patrón.

  • Los datos almacenados de esta manera no se comprimen de manera tan eficiente como los datos en columnas más amplias.

  • Incluso cuando la marca de tiempo está al final de la clave de fila, este patrón puede generar hotspots.

Estos son algunos casos de uso de este patrón:

  • Deseas recuperar siempre todas las columnas, pero solo un rango especificado de marcas de tiempo. Sin embargo, tienes un motivo para no almacenar los datos en una estructura serializada.

  • Deseas almacenar una cantidad ilimitada de eventos.

Con los datos del globo meteorológico de ejemplo, la familia de columnas y los calificadores de columna son los mismos que los del ejemplo con buckets de tiempo y celdas nuevas. Sin embargo, en este patrón, cada conjunto de medidas informadas de cada globo meteorológico se escribe en una fila nueva. En la siguiente tabla, se muestran cinco filas que se escriben mediante este patrón:

Clave de fila presión temperatura humedad Altitud
us-west2#3698#2021-03-05-1200 94558 9.6 61 612
us-west2#3698#2021-03-05-1201 94122 9.7 62 611
us-west2#3698#2021-03-05-1202 95992 9.5 58 602
us-west2#3698#2021-03-05-1203 96025 9.5 66 598
us-west2#3698#2021-03-05-1204 96021 9.6 63 624

Estrategias adicionales

Si necesitas enviar varias consultas diferentes para el mismo conjunto de datos, considera almacenar tus datos en varias tablas, cada una con una clave de fila diseñada para una de las consultas.

También puedes combinar patrones en algunos casos. Por ejemplo, puedes almacenar datos serializados en filas que representen buckets de tiempo, siempre que no permitas que las filas se vuelvan demasiado grandes.

¿Qué sigue?