BigTable: 2 пишет в тот же ключ, но 3 версии - PullRequest
0 голосов
/ 20 марта 2019

Иногда, если я записываю несколько версий в один и тот же ключ строки и с несколькими семействами столбцов в нескольких пакетных мутациях (каждая версия объединяется вместе с несколькими записями).

enter image description here

Это ожидаемое поведение из-за сжатия данных?Будет ли лишняя версия удалена со временем?

1 Ответ

1 голос
/ 02 апреля 2019

Проблема в том, что вы помещаете два столбца в две отдельные записи в пакете, что означает, что даже если они имеют одинаковую строку, они не будут применяться атомарно.

Пакетные записи могут быть успешными или неудачными по отдельности, и тогда клиент будет повторять только неудачные записи. Если, например, одна запись завершается успешно, а другая - тайм-аут, но позже происходит молча, повторная попытка «сбойной» записи может привести к частичным результатам записи, которые вы видите.

Поэтому в python вы должны сделать что-то вроде следующего (адаптировано из cloud.google.com/bigtable/docs/samples-python-hello):

print('Writing some greetings to the table.')
greetings = ['Hello World!', 'Hello Cloud Bigtable!', 'Hello Python!']
rows = []
column1 = 'greeting1'.encode()
column1 = 'greeting2'.encode()
for i, value in enumerate(greetings):
    # Note: This example uses sequential numeric IDs for simplicity,
    # but this can result in poor performance in a production
    # application.  Since rows are stored in sorted order by key,
    # sequential keys can result in poor distribution of operations
    # across nodes.
    #
    # For more information about how to design a Bigtable schema for
    # the best performance, see the documentation:
    #
    #     https://cloud.google.com/bigtable/docs/schema-design
    row_key = 'greeting{}'.format(i).encode()
    row = table.row(row_key)

    # **Multiple calls to 'set_cell()' are allowed on the same batch
    # entry. Each entry will be applied atomically, but a separate
    # 'row' in the same batch will be applied separately even if it
    # shares its row key with another entry.**
    row.set_cell(column_family_id,
                 column1,
                 value,
                 timestamp=datetime.datetime.utcnow())
    row.set_cell(column_family_id,
                 column2,
                 value,
                 timestamp=datetime.datetime.utcnow())
    rows.append(row)
table.mutate_rows(rows)
...