2013-07-24 2 views
0

Я работаю с Cassandra, и я ударил немного камнем преткновения. Для того, как мне нужно искать данные, я обнаружил, что первичный ключ Composite отлично работает для того, что мне нужно, но время вставки для записи в этой семействе колонок идет к собакам с этим, и я не совсем уверен, почему.Медленное время вставки с композитным основным ключом в Cassandra

Таблица Определение:

CREATE TABLE exampletable (
clientid int, 
filledday int, 
filledtime bigint, 
id uuid, 
...etc... 
PRIMARY KEY (clientid, filledday, filledtime, id) 
); 

ClientID = Внутренний идентификатор клиента. fullday = количество дней с 01.01.1900. filltime = количество тиков того дня, когда была получена запись. id = A Guid.

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

Я знаю, что магазины Cassandra Column Families с составными первичными ключами совершенно по-разному. Насколько я понимаю, он сохранит все как новые столбцы от базовой строки основного компонента первичного ключа. Это причина, по которой вставки будут медленными? Когда я говорю «медленно», я имею в виду, что если у меня только первичный ключ на id, то вставка займет ~ 200 миллисекунд, а с составным первичным ключом (или любым его подмножеством, я попробовал просто clientid и id с тем же эффектом), это займет до 32 секунд для 1000 записей. Время выбора быстрее из таблицы составных клавиш, так как я должен применять вторичные индексы и использовать «ALLOW FILTERING», чтобы вернуть правильные записи со стандартной таблицей ключей (я знаю, что могу сделать это в коде, но проблема что я имею дело с некоторыми массивными наборами данных, и это не всегда будет практичным или возможным).

Я объявляю семейство колонок или первичный ключ неправильными в отношении того, что я пытаюсь сделать? Со всеми незарегистрированными, непервичными ключевыми столбцами таблица имеет ширину 37 столбцов, будет ли это проблемой? На данный момент я совершенно в тупике. Я не могу действительно найти что-либо о других, имеющих похожие проблемы.

ответ

0

Ну, ваш ключ раздела - это идентификатор клиента, поэтому все записи на одного клиента переходят на один узел. Если вы пишете много данных на одного клиента, вы можете получить горячую точку, тем самым снижая общую пропускную способность.

Также вы можете привести пример запросов, которые вы запускаете? В Кассандре модель данных всегда должна напоминать запросы, которые вы хотите запустить. Если вам нужно «разрешить фильтрацию», то кажется, что с вашей моделью данных что-то не так. Например, я действительно не вижу смысла «заполненного времени» в вашей ПК. Если вы хотите выполнить запрос по периоду времени, просто замените три столбца на столбец TimeUUID «ts». Это создало бы широкую строку с одним столбцом на запись с уникальным timestam, кластеризованным/разделенным на один идентификатор клиента. Это позволяет делать запросы, как:

select * from exampletable where clientid = 123 and ts > minTimeuuid('2013-06-18 16:23:00') and ts < minTimeuuid('2013-06-18 16:24:00'); 

Опять же, это будет зависеть от запросов вы на самом деле нужно запустить.

И, наконец, для общего руководства по моделированию данных ознакомьтесь с this ebay tech blog. Чтение помогло мне кое-что выяснить для меня.

Надеюсь, что это поможет!

+0

Для примера запроса мне нужно иметь возможность делать такие вещи, как получить следующее: 1) Получить записи для клиента за день 2) Получить записи для клиента для даты и времени. Я использовал заполненный день и заполнил время главным образом потому, что моя база кода - .Net, и нет встроенной функции для тайм-аутов. У меня есть кое-что, поэтому я даю им попробовать.То, как я вижу проблему сейчас, заключается в том, что мне нужно найти ключевую структуру, которая позволяет мне делать эти запросы, не зная больше, чем клиент и время, но все же делит данные достаточно, чтобы не сделать медленную установку. Примечание. Наборы данных очень большие. – Bozarth

+0

Я предлагаю использовать предложенную выше структуру и использовать TimeUUID с использованием клиентов [.NET, таких как fluentcassandra] (https://github.com/fluentcassandra/fluentcassandra). Чтобы избежать горячих точек вы можете легко просто добавить случайное число (из заданного диапазона, как 0-9) и образуют составной ключ раздела, как так: 'CREATE TABLE exampletable ( ClientId ИНТ ведро, внутр ID timeuuid , ... первичный ключ ((ClientID, ведро), идентификатор) ); ' ' выберите * из exampletable, где ClientID = 123 и ковш (0,1,2,3,4,5,6 , 7,8,9) и ts> minTimeuuid ('2013-06-18 00:00:01') и ts omnibear

Смежные вопросы