2011-10-21 7 views
5

Si quiero insertar en una tabla:¿Hay un número de versión máximo en hbase?

row | fam:qualifier | timestamp | value 
1 | foo:bar | 12345 | 2 
1 | foo:bar | 12346 | 3 
1 | foo:bar | 12347 | 2 
1 | foo:bar | 12348 | 1 
. 
. 
. 
1 | foo:bar | 123410 | 2 

puedo especificar en el hbase pagar el máximo número de versión para obtener FOM una fila específica pero cuando lo especifique, por ejemplo, '100' sólo 4 Regrésame versiones ... ¿Hay un máximo?

Respuesta

11

Solo devuelve 4 versiones porque la familia de columnas está configurada para almacenar un máximo de 4 versiones.

Si desea almacenar más versiones, debe modificar el CF. Uso de la cáscara hbase:

hbase> alter 'table_foo', {NAME => 'column_fam_foo', VERSIONS => 100} 

El valor por defecto para las versiones Max es 1 *:

http://hbase.apache.org/book/schema.versions.html

* parece que el valor por defecto para las versiones max se cambió de 3 a 1 en algún momento.

2

la respuesta es parcialmente correcta. No es cierto: hbase almacena tres versiones. Prueba a continuación. Es cierto: puede establecer la cantidad máxima de versiones, que hbase devuelve a través

alter 'marketdata', NAME => 'field', VERSIONS => 100 

Pero por ahora vamos a suponer, no lo hice cambiar la variable de versión.

Tengo diez entradas en mi hbase, con marcas de tiempo de 0 a 9. La marca de tiempo más reciente es:

hbase(main):025:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask'}         
COLUMN        CELL                     
field:ask      timestamp=9,   value=0.9940174211042572             
1 row(s) in 0.0590 seconds 

hbase(main):026:0> 

Los valores de marca de tiempo de 1 a 5 que se muestran son:

hbase(main):027:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask', TIMERANGE => [0,5], VERSIONS=>5} 
COLUMN        CELL                     
field:ask      timestamp=4, value=0.530618878519702             
field:ask      timestamp=3, value=0.051028316270589014             
field:ask      timestamp=2,  value=0.11949750640509116             
3 row(s) in 0.0130 seconds 

hbase(main):028:0> 

... y cuando configuro mi marca de tiempo final en 10, todavía muestra solo las últimas tres versiones ANTES de esa marca de tiempo y suprime las anteriores:

hbase(main):028:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask', TIMERANGE => [0,10], VERSIONS=>5} 
COLUMN        CELL                     
field:ask      timestamp=9,  value=0.9940174211042572             
field:ask      timestamp=8,  value=0.6941263513176372             
field:ask      timestamp=7,  value=0.1814043435754933             
3 row(s) in 0.0400 seconds 

hbase(main):029:0> 
+1

espere, entonces, ¿cómo puede ver la versión 4,3,2 y 9,8,7 si hbase solo almacena 3 versiones? Tal vez el caparazón solo devuelve 3, por la razón que sea, pero parece que "demostró" que hay más versiones. La respuesta real también es más complicada debido a la forma en que hbase elimina las versiones: realmente no. Si elimina datos de manera explícita, agregará una lápida sepulcral y no verá ningún dato antes de la lápida sepulcral. Todos los otros datos estarán disponibles (y todos los datos serán almacenados) hasta la próxima compactación principal que reescribirá el archivo de la tienda y solo conservará el número correcto de versiones. – David

+0

Hola David, downvoted basado en una respuesta editada por codingFoo. – user1052080

+2

Esta respuesta aún es un poco engañosa. Lo que te estás perdiendo es el problema de la compactación. Cuando HBase almacena un valor, simplemente lo agrega al archivo. Nunca borra datos.Para implementar la eliminación, agregan una lápida sepulcral que básicamente dice que un valor debe ignorarse. Ahora, cuando aparece una compactación, el archivo se volverá a escribir, y ni las versiones antiguas ni las eliminadas se reescribirán en el nuevo archivo. Por lo tanto, hay una ventana de tiempo en la que podrá ver las versiones anteriores, pero esa ventana de tiempo es limitada y no debe confiar en que haya versiones antiguas allí. – David

0

El concepto de versión se mantiene estrictamente a nivel de columna familiar. Es un parámetro configurable.

  columnFamily.setMaxVersions(required version); 

Cuantas más versiones tenga, a la vez que aumenta la posibilidad de leer datos de múltiples HFiles.

La mejor manera sería mantener la versión mínima y encapsular los datos en un solo blob.

Cuestiones relacionadas