Создать таблицу со многими столбцами Cassandra 2

Мне нужна таблица на Cassandra2 с 56 КБ столбцов по 1 байту каждый, для целей тестирования.

Я пытаюсь создать "usertable" с этим требованием следующим образом:

create table usertable (
    y_id varchar primary key,
    field0 varchar,
    field1 varchar,
    field2 varchar,
     ...
     ...
    field55999 varchar,
    field56000 varchar);

Когда я пытаюсь выполнить это из файла с помощью CQLSH, он работает вечно без ответа и выделяя много памяти.

Есть ли лучший способ сделать это?


person vschettino    schedule 04.04.2016    source источник


Ответы (1)


Попробуйте поместить свой оператор CREATE TABLE в плоский файл (например, schema.cql), а затем выполнить cqlsh -f schema.cql

Кстати, 56 000 столбцов — это ОГРОМНО, и ни один здравомыслящий разработчик никогда не создаст таблицу с более чем 1 000 столбцов... Что вы пытаетесь проверить и подтвердить в этом сценарии?

---- Ответ на 1-й комментарий --

Схема полностью посвящена метаданным, потому что необработанные данные в любом случае записываются на диск как byte[]. Чем больше у вас столбцов в таблице, тем больше метаданных будет в памяти.

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

Это не так просто. Все столбцы размером 56 КБ хранятся на диске непрерывно. При чтении данных у Cassandra есть структуры индексов, позволяющие пропускать ключи секций и столбцы кластеризации. Для обычных столбцов, как и в вашем случае, нет индекса для получения точного столбца, запрошенного клиентом, поэтому, например, если вы делаете SELECT field1293 FROM usertable WHERE y_id = xxx, Cassandra нужно будет сканировать весь блок от field1 до field56000 в памяти, прежде чем выбирать правый столбец, и это очень-очень ужасно неэффективно

--- Ответ на N-й комментарий --

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

Я рекомендую попробовать и протестировать эту схему:

create table usertable (
    y_id varchar,
    field_index int,
    field_value varchard, 
    PRIMARY KEY(y_id, field_index)
);

//INSERT/UPDATE data into field N
INSERT INTO usertable(y_id, field_index, field_value)
VALUES('xxx', N, 'fieldN value');

//DELETE field N
DELETE FROM usertable WHERE y_id='xxx' AND field_index=N;

// Read EXACTLY field N
SELECT field_value FROM usertable WHERE y_id='xxx' AND field_index=N;

// Read field N to M, N <= M
SELECT field_value FROM usertable WHERE y_id='xxx' 
AND field_index >=N 
AND field_index <= M;

Вы увидите, что это работает намного лучше

person doanduyhai    schedule 05.04.2016
comment
Каковы штрафы, если я это сделаю? Так как cassandra поддерживает 2 миллиарда ячеек на раздел. Итак, при извлечении я передам конкретное имя столбца в запросе выбора (с учетом производительности), чтобы он не извлекал все столбцы. Итак, каковы будут последствия или симптомы для этого типа уродливой схемы или Другими словами, каковы удары для слишком широкого ряда? - person Jaya Ananthram; 05.04.2016
comment
Итак, давайте рассмотрим запрос SELECT field56000 FROM usertable WHERE y_id = xxx. Если я попытаюсь выполнить вышеуказанный запрос, то в память будет загружен столбец 56000, а затем будет выполнено последовательное сканирование, пока не будет достигнуто имя столбца field56000. Вы именно это имеете в виду, верно? Поправьте меня, если я ошибаюсь. - person Jaya Ananthram; 05.04.2016
comment
Да, это так. Чтобы быть более точным, Cassandra будет извлекать ваши данные строки CQL блоками по 64 КБ в память и выполнять итерацию по всем последовательным блокам, пока не будет найден field56000. В вашем примере он должен сканировать весь раздел. Если запрашивается field00001, это будет намного быстрее - person doanduyhai; 05.04.2016
comment
Если вы использовали кластеризацию столбцов в своей схеме, Cassandra будет использовать индекс раздела, чтобы пропускать блоки данных и достигать ближайшего блока из запрошенного столбца, а также начинать последовательное сканирование с этого ближайшего блока, т.е. гораздо более оптимизированный - person doanduyhai; 05.04.2016
comment
Я попробовал cqlsh -f schema.cql, но получил тот же результат. Я согласен, что это станет очень медленным/неэффективным, но мне нужно реализовать этот сценарий для имитации данных генотипа. - person vschettino; 05.04.2016
comment
@doanduyhai, такой подход не позволил бы мне использовать YCSB. - person vschettino; 06.04.2016
comment
Проблема YCSB заключается в том, что он не может работать с такой базовой моделью данных, а не в моделировании данных Cassandra. Вы не навязываете модель данных, чтобы она могла работать с инструментом. Вы берете правильную модель данных для работы, и если инструменты не могут с ней справиться, меняйте инструмент. - person doanduyhai; 06.04.2016
comment
Если вам нужен лучший инструмент для сравнительного анализа, который работает со всеми моделями данных Cassandra, я рекомендую Gatling (gatling.io/#) с бесплатным подключаемым модулем CQL (github.com/Mishail/GatlingCql) - person doanduyhai; 06.04.2016