Существует ли максимальный номер версии в hbase?

#hbase

#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
  

Я могу указать в оболочке hbase максимальное количество версий для получения из определенной строки, но когда я указываю, например, «100», он возвращает мне только 4 версии…
Существует ли какой-либо максимум?

Ответ №1:

Он возвращает только 4 версии, потому что семейство столбцов настроено на хранение максимум 4 версий.

Если вы хотите сохранить больше версий, вам нужно изменить CF. Использование оболочки hbase:

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

По умолчанию для максимальных версий равно 1*:

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

* Кажется, значение по умолчанию для максимальных версий было изменено с 3 на 1 в какой-то момент.

Ответ №2:

ответ отчасти правильный. Неверно: hbase ХРАНИТ три версии. Доказательство смотрите ниже. True: вы можете установить максимальное количество версий, которые hbase возвращает через

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

Но пока давайте предположим, что я не менял переменную version.

У меня есть десять записей в моей hbase с временными метками от 0 до 9. Самая текущая временная метка:

 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> 
  

Показаны значения от метки времени от 1 до 5:

 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>
  

… и когда я устанавливаю свою конечную временную метку на 10, она по-прежнему показывает только последние три версии ДО этой временной метки и подавляет предыдущие:

 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. подождите, так как же вы можете увидеть версии 4,3,2 и 9,8,7, если hbase хранит только 3 версии? Возможно, по какой-то причине оболочка возвращает только 3, но вы, похоже, «доказали», что существует больше версий. Реальный ответ также сложнее из-за того, как hbase удаляет версии: на самом деле это не так. Если вы явно удалите данные, это добавит надгробную плиту, и вы не увидите никаких данных перед надгробной плитой. Все остальные данные будут доступны (и все данные будут сохранены) до следующего крупного сжатия, которое перепишет файл хранилища и сохранит только правильное количество версий.

2. Привет, Дэвид, ты проголосовал против, основываясь на отредактированном ответе codingFoo.

3. Этот ответ все еще немного вводит в заблуждение. Чего вам не хватает, так это проблемы с уплотнением. Когда HBase сохраняет значение, оно просто добавляет его в файл. Он никогда не удаляет данные. Для реализации удаления они добавляют надгробную плиту, в которой, по сути, говорится, что значение следует игнорировать. Теперь, когда происходит сжатие, файл будет перезаписан заново, и ни старые версии, ни удаленные версии не будут перезаписаны в новый файл. Итак, существует временное окно, когда вы сможете увидеть старые версии, но это временное окно ограничено, и вам не следует полагаться на наличие старых версий.

Ответ №3:

Концепция версии строго поддерживается на уровне семейства столбцов . Это настраиваемый параметр.

             columnFamily.setMaxVersions(required version);
  

Чем больше версий, тем больше вероятность считывания данных из нескольких HF-файлов увеличивается.

Лучшим способом было бы поддерживать минимальную версию и инкапсулировать данные в один большой двоичный объект.