2010-11-08 21 views
14

Estamos tratando de usar HBase para almacenar datos de series de tiempo. El modelo que tenemos actualmente almacena las series de tiempo como versiones dentro de una celda. Esto implica que la célula podría terminar almacenando millones de versiones, y las consultas en esta serie temporal recuperarían un rango de versiones utilizando el método setTimeRange disponible en la clase Obtener en HBase.Usando HBase para almacenar datos de series de tiempo

p. Ej.

{ 
    "row1" : { 
     "columnFamily1" : { 
      "column1" : { 
       1 : "1", 
       2 : "2" 
      }, 
      "column2" : { 
       1 : "1" 
      } 
     } 
    } 
} 

¿Es este un modelo razonable para almacenar datos de series temporales en HBase?

¿Es el modelo alternativo de almacenamiento de datos en varias columnas (es posible consultar entre columnas) o las filas más adecuadas?

Respuesta

17

No creo que deba usar el control de versiones para almacenar las series de tiempo aquí. No porque no funcione, sino porque no está diseñado para ese caso de uso particular y hay otras formas.


Sugiero que almacena la serie de tiempo que el paso de tiempo como calificador de la columna y el valor será los datos en sí. Algo así como:

{ 
    "row1" : { 
     "columnFamily1" : { 
      "col1-000001" : "1" 
      "col1-000002" : "2" 
      "col1-000003" : "91" 
      "col2-000001" : "31" 
      } 
     } 
    } 
} 

Una buena cosa aquí es que las tiendas HBase la fase de clasificación de las columnas en el orden establecido, por lo que cuando la lectura de la serie de tiempo de vuelta debería ver los artículos en orden.


Otra opción realista sería tener el identificador para el registro como la primera parte de la rowKey, pero luego tienen el paso de tiempo en el rowKey también. Algo como:

{ 
    "fooseries-00001" : { 
     "columnFamily1" : { 
      "val" : "1" 
      } 
     } 
    } 
    "fooseries-00002" : { 
     "columnFamily1" : { 
      "val" : "2" 
      } 
     } 
    } 

} 

Esto tiene la buena característica de que será bastante fácil hacer escaneos de rango en una serie en particular. Por ejemplo, sacar los pasos 104 a 199 de Fooseries va a ser bastante trivial para implementar y ser eficiente.

La desventaja de eliminar una serie completa va a requerir un poco más de administración y sincronización. Otro inconveniente es que los análisis de MapReduce van a tener dificultades para realizar cualquier tipo de análisis sobre estos datos. Con el enfoque anterior, toda la serie temporal se pasará a una llamada map(), mientras que aquí, se llamará a map() para cada cuadro.

+0

Ya sea que coloque el paso de tiempo en la clave de fila o en el calificador de columna probablemente esté mejor determinado por su patrón de acceso a datos. Si normalmente tiende a obtener todas las columnas en sus escaneos y la eliminación no es un escenario principal, entonces el diseño de la fila de teclas tiene mucho sentido. – Larsenal

6

Si tuviera que construir una solución de serie temporal en HBase, definitivamente tendría un vistazo a http://opentsdb.net/, un lanzamiento de código abierto de StumbleUpon, ya que es utilizado internamente por la SU, lo consideraría estable y obtendría soporte continuo.

0

+1 para openTSDB Hace muchos trucos para simplificar las consultas de resumen basadas en el tiempo.

En cuanto a la pregunta original, puede tener tantas versiones de celda como desee (no hay límite).No hay penalización de rendimiento, 'Get' se implementa como Scan de todos modos en HBase y setTimeRange es un filtro bastante efectivo.

Cuestiones relacionadas