Понимание накладных расходов Кассандры

я читал в этом разделе из документов Кассандры и нашел следующее немного озадачивающим:

определить накладные расходы столбца:

regular_total_column_size = column_name_size + column_value_size + 15

counter-expiring_total_column_size = column_name_size + column_value_size + 23

каждый столбец в Ситонии приводит 15 байта. Поскольку каждая строка в таблице может быть разные имена столбцов, а также различное количество столбцов, метаданные хранятся для каждого столбца. Для столбцов счетчиков и истекающих столбцов следует добавить дополнительные 8 байтов (всего 23 байта).

я понимаю выше на CQL3 определенной схеме, например:

CREATE TABLE mykeyspace.mytable(
  id text,
  report_id text,
  subset_id text,
  report_date timestamp,
  start_date timestamp,
  end_date timestamp,
  subset_descr text,
  x int,
  y double,
  z int,
  PRIMARY KEY (id, report_id, subset_id)
);

заключается в том, что каждая строка будет содержать метаданные для имен столбцов, например, строки report_date, start_date, end_date, etc. и их тип вместе с данными. Однако, это не ясно для меня это означает, что каждая строка в таблице может иметь разные имена столбцов. Это звучит неправильно для меня, учитывая, что схема выше полностью static, то есть Кассандра 2.0 наверняка будет жаловаться, если я попытаюсь написать:

INSERT INTO mykeyspace.mytable (id, report_id , subset_id, x, y, z, w) 
VALUES ( 'asd','qwe','rty',100,1.234,12, 123.123);

Bad Request: Unknown identifier w

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

может кто-нибудь прояснить? Итог: должен ли я беспокоиться о длине имен моих столбцов или нет?

мы играли в нее безопасно и использовали одиночные имена символов, где это возможно (так что вышеуказанные столбцы на самом деле были бы i, r, s, dr, ds, de, sd, ...), но это настолько не человеческий нечитаемый и может быть запутанным для работы.

1 ответов


самый простой способ выяснить, что происходит в таких ситуациях, - проверить представление sstable2json (cassandra/bin) ваших данных. Это покажет вам, что на самом деле будет сохранено на диске.

вот пример для вашей ситуации

 [
 {"key": "4b6579","columns": [
       ["rid1:ssid1:","",1401469033325000],
       ["rid1:ssid1:end_date","2004-10-03 00:00:00-0700",1401469033325000],
       ["rid1:ssid1:report_date","2004-10-03 00:00:00-0700",1401469033325000],
       ["rid1:ssid1:start_date","2004-10-03 00:00:00-0700",1401469033325000], 
       ["rid1:ssid1:subset_descr","descr",1401469033325000],
       ["rid1:ssid1:x","1",1401469033325000], 
       ["rid1:ssid1:y","5.5",1401469033325000],
       ["rid1:ssid1:z","1",1401469033325000],
       ["rid2:ssid2:","",1401469938599000],
       ["rid2:ssid2:end_date", "2004-10-03 00:00:00-0700",1401469938599000],
       ["rid2:ssid2:report_date","2004-10-03 00:00:00-0700",1401469938599000],
       ["rid2:ssid2:start_date","2004-10-03 00:00:00-0700",1401469938599000], 
       ["rid2:ssid2:subset_descr","descr",1401469938599000],
       ["rid2:ssid2:x","1",1401469938599000],
       ["rid2:ssid2:y","5.5",1401469938599000],
       ["rid2:ssid2:z","1",1401469938599000]
 }
 ]

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

что осталось, хотя имеет имя столбца, это необходимо, если сделано частичное обновление строки, чтобы ее можно было сохранить без остальной информации о строке. Вы можете представить себе обновление одного поля столбца в строке, чтобы указать, какое поле это C* в настоящее время использует имя столбца, но есть билеты, чтобы изменить это на меньшее представление. https://issues.apache.org/jira/browse/CASSANDRA-4175

для создания этого

cqlsh
CREATE TABLE mykeyspace.mytable(   id text,   report_id text,   subset_id text,   report_date timestamp,   start_date timestamp,   end_date timestamp,   subset_descr text,   x int,   y double,   z int,   PRIMARY KEY (id, report_id, subset_id) );
INSERT INTO mykeyspace.mytable (id, report_id , subset_id , report_date , start_date , end_date , subset_descr ,x, y, z) VALUES ( 'Key', 'rid1','ssid1', '2004-10-03','2004-10-03','2004-10-03','descr',1,5.5,1);
INSERT INTO mykeyspace.mytable (id, report_id , subset_id , report_date , start_date , end_date , subset_descr ,x, y, z) VALUES ( 'Key', 'rid2','ssid2', '2004-10-03','2004-10-03','2004-10-03','descr',1,5.5,1);
exit;
nodetool flush
bin/sstable2json $DATA_DIR/mytable/mykeyspace-mytable-jb-1-Data.db