#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-файлов увеличивается.
Лучшим способом было бы поддерживать минимальную версию и инкапсулировать данные в один большой двоичный объект.