Как установить TTL на Hbase Row и Bigtable Row - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь оценить, возможно ли установить TTL для отдельной строки в HBase или Bigtable.

Я знаю, что Кассандра позволяет использовать TTL при вставке. Я хочу узнать, возможно ли то же самое в HBase и в Google Cloud Bigtable.

INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

В Bigtable нет встроенной поддержки мелкозернистых TTL. Но есть два распространенных способа их моделирования с различными компромиссами:

  • Если вы настраиваете новую пустую таблицу и планируете установить TTL с каждой записью , вы можете установить max_age для ваших семейств столбцов на что-то очень маленькое, скажем, 1с и явно установите метку времени записи для каждого нового значения в то время, когда вы хотите, чтобы оно истекло.
    • Pro: этот подход облегчает понимание, поскольку временная метка имеет очевидное семантическое значение и не требует манипулирования.
    • Con: Если вы когда-нибудь забудете установить TTL и вместо этого будете использовать временную метку сервера по умолчанию, эти данные будут сразу считаться устаревшими и будут сброшены при следующем сжатии.
    • Con: То же самое верно и в том случае, если вы попытаетесь применить это к уже существующей таблице: любые существующие данные, использующие метки реального времени, будут удалены.
    • Con: невозможно иметь несколько значений для любой заданной ячейки, срок действия которой истекает в одно и то же время.
  • Если вы хотите использовать TTL по умолчанию X, который затем может быть переопределен, установите его для ваших семейств столбцов как обычно. Записи могут затем настроить свой TTL на Y, установив свою метку времени в (real_timestamp - X + Y).
    • Pro: этот подход можно смело применять к уже существующей таблице.
    • Pro: ловушек нет, если вы забыли установить TTL.
    • Con: временные метки вообще не могут быть интерпретированы, поскольку любая конкретная ячейка может иметь реальную временную метку или имитированную временную метку отмены TTL.
    • Con: В связи с вышеизложенным могут возникать неожиданные конфликты меток времени между значениями по умолчанию и переопределенными TTL, которые записываются (Y-X) друг от друга.

Помните, как всегда, сборщик мусора Bigtable является асинхронным, поэтому значения не исчезают сразу после их TTL. Если вы не хотите читать значения TTL, вам нужно отправить соответствующий интервал времени с вашими запросами на чтение. При первом подходе это будет что-нибудь позже, чем сейчас. Во втором случае это будет что-то позднее, чем (сейчас - X).

Оба этих подхода также приносят в жертву все полезные свойства наличия реальной отметки времени, привязанной к значениям, включая возможность отладки и простое управление версиями. Вы можете восстановить некоторые из них, записав реальную метку времени в отдельный столбец, но в целом это означает, что они лучше всего работают, когда вы сохраняете только самое последнее значение.

0 голосов
/ 30 октября 2018

Я не использовал / не тестировал нижеприведенное, так как никогда не нуждался, но взгляните на следующее:

На отдельном уровне мутации (то есть создании отдельной строки) попробуйте использовать:

Put.setTTL(long)

Чтобы применить это на уровне семейства столбцов для данной таблицы, попробуйте следующее при создании таблицы:

ColumnFamilyDescriptorBuilder.setTimeToLive(int)

Основываясь на моем опыте работы с другими функциями HBase с такой же настройкой, я бы предположил, что вы можете использовать время создания таблицы, чтобы установить какой-то глобальный TTL / значение по умолчанию для данного семейства столбцов, но затем настроить его для отдельного пользователя. При необходимости установите уровень, как показано выше.

Выше приведено в Java, но вы можете сделать это и из оболочки HBase, вставляя строки или создавая новую таблицу вручную.

...