2013-03-21 2 views
0

Предположим, что у меня есть CF в Кассандре, которая имеет следующую схему:Основные перегородки в PlayORM

  • TimeStamp
  • Device ID
  • Имя устройства
  • Устройство Владелец

PKEY (TimeStamp, Device ID): Это означает, что раздел происходит на TimeStamp.

Ниже приведены запросы меня интересуют:

Select * из схемы, где TimeStamp = '..' Select * из схемы, где DeviceID = '..'

Первый запрос возвращает 500K записей , второй запрос возвращает 50K записей. Для первого запроса узкое место все извлекается на одном узле, поэтому я хочу распространять данные на нескольких узлах для TimeStamp. Узким местом для второго запроса является то, что все записи могут быть распределены по всем дискам на разных узлах, что приводит к нескольким выборкам на диске.

Предположим, что я хочу создавать виртуальные разделы, так что записи для определенного TimeStamp также распределяются между узлами кластера. Возможно ли это в PlayORM? Если да, можете ли вы предоставить код, который может это сделать (или пример, который делает такую ​​вещь)?

Еще одно требование, которое у меня есть, - это поиск всех записей для определенного идентификатора устройства. Могу ли я сделать виртуальное разбиение на «Идентификатор устройства» для того же CF? Если да, можете ли вы предоставить код/​​ссылку, которая рассказывает, как это сделать?

Я был бы рад, если бы кто-то мог предоставить исходный код для выполнения такой вещи, потому что документацию не так просто понять, а писать код просто, читая текущую документацию, оказывается кошмаром. Без «полных» примеров кода оценка PlayORM кажется невозможной.

ответ

3

Да, вам понадобится что-то подобное в PlayOrm ... (опубликуйте комментарий, если мне что-то не хватает, и я могу ответить снова).

https://github.com/deanhiller/playorm/blob/master/src/test/java/com/alvazan/test/db/PartitionedTrade.java

а также запрос ПЕРЕГОРОДКИ т ('счет',: PartID) Выбрать T FROM TABLE, как т INNER JOIN t.security при s- WHERE s.securityType =: тип и t.numShares =: акции "

« учетная запись »идентифицирует столбец раздела и: partId является идентификатором раздела. В вашем случае у вас есть PARTITIONS t ('deviceid', {actualDeviceId}) или t ('time', {time }), где первый параметр - это имя столбца, а второй - фактический идентификатор раздела для времени или идентификатор раздела для устройства. Реализация разделов не должна превышать X миллионов строк, где X, вероятно, составляет около 3 милли на.

В пакете com.alvazan.test.db есть множество различных примеров, и com.alvazan.test показывает, как они используются. Я собираюсь попросить кого-то настроить документы на основе вашей обратной связи, чтобы поместить ссылки непосредственно на код в нашей кодовой базе ...

ps. если вы загружаете из github, запустите eclipse gradlew или eclipse gradle (в зависимости от ОС), а затем импортируйте в eclipse, все тесты работают из коробки с версией noSQL в памяти (мы используем ее для разработки). Затем, если вы хотите работать против cassandra, в документах есть способ изменить одну строку, и все тесты выполняются против cassandra.

Ускорение. PlayOrm выполняет широкий ряд, используя шаблон составного имени для каждого раздела (индекс для каждого раздела). Когда вы запрашиваете, он читает эту строку партиями из 200 (или размерами, которые вы предоставляете), а затем отправляет запросы с использованием ключей, найденных в индексе, ко всем машинам (т. Е. На данный момент вы получаете параллельную пропускную способность). Это связано с тем, что каждый раздел распространяется по кластеру. На самом деле, все узлы в конечном итоге имеют срезы почти всех разделов, в зависимости от того, сколько у вас узлов и сколько разделов (то есть 100 узлов и 32 раздела, а не все узлы будут иметь все разделы).

Под одеялом играющий делает что-то действительно очень простое. Все строки написаны так, как будто они не были разделены вообще !!! Затем записывается строка индекса (RF = 3 означает 3 узла), а имя строки индекса -/TABLE/partition/column/partitionId. Это ключ строки для индекса. С помощью инструмента командной строки вы даже можете прочитать индекс самостоятельно, а только индекс или запросить раздел. Для этого используйте инструмент командной строки playOrm.

Наконец, поскольку широкие строки в Кассандре упорядочены, когда вы используете определенный индекс, как ПЕРЕГОРОДКИ й («DeviceId», «device1») выберите г из таблицы, как г где d.time> Integer.MIN_INT

, тогда результаты возвращаются в порядке этого индекса (т. Е. Время в этом случае), или если вы хотите обратный порядок, просто вызовите курсор.afterLast затем курсор.прерывный, курсор.прерывный и т. Д. И т. Д.

clear, PlayOrm игнорирует разметку cassandra. Он записывается в ваши данные так же, как и вообще никакого раздела. Он также пишет в индексе или два. Предположим, вы разбиваете дважды, один раз по времени и один раз по идентификатору устройства. В этом случае он записывает в таблицу StringIndice или IntegerIndice (BigInteger !!! not Integer) с клавишами строк (и говорит, что ваш объект называется Устройством). Давайте также скажем в вашей сущности, вы @NoSqlIndexed в столбце «name» !!!!

/Devices/byDevice/device1/name = the wide row 
/Devices/byTime/time56/name = the wide row 

Если у вас есть более @NoSqlIndexed столбцов, есть несколько строк в таблицах индексов. Однако все строки распределены по кластеру и не заботятся о разделении.

Имеет ли это смысл? Не стесняйтесь дать ему шанс и попробовать. Просто опубликуйте новый вопрос о stackoverflow, если у вас есть какие-либо вопросы/вопросы по его внедрению.

+0

Дин, я хотел бы знать, как бы PlayORM убедиться, что оба запроса выполняются быстро? Предположим, что у вас есть Устройства 500 K, и для каждого устройства у нас есть 10 K timeStamps. Можете ли вы запустить меня, как сделать разбиение на разделы в cassandra для схемы выше, и как должно происходить виртуальное разбиение. Допустим, у меня есть кластер cassandra с тремя узлами, тогда вы можете дать мне коэффициент ускорения из-за PlayORM по сравнению с оригинальной производительностью? И можете ли вы, пожалуйста, сообщить мне, почему эта скорость происходит? – Ouroboros

+0

Дин, для каждого «TimeStamp» есть записи 500 K. Когда раздел был сделан с Cassandra в timestamp, разве это не похоже на PARTITIONS в PlayORM t ('timestamp', {time})? Проблема, которая у меня есть, заключается в том, что в Cassandra все записи раздела (в этом случае записываются как временная метка) попадают внутрь узла. Это приводит к замедлению, поскольку ответ ограничен узким диском. Лучше ли решение PARORMTION от PlayORM? Я считаю, что если все записи для раздела в метке времени распределены по всем узлам кластера, это решение будет наиболее эффективным. – Ouroboros

+0

Также вы можете объяснить, как cassandra хранит все данные только один раз (без репликации), но PlayORM может создавать несколько разделов на разных столбцах CF? Это звучит слишком хорошо, чтобы быть правдой. Можете ли вы дать представление о том, как разные разделы хранятся в Кассандре, и если все записи раздела хранятся в одном узле? Мне трудно убедить себя, что на CF может появиться более одного раздела, когда раздел имеет все записи на определенном узле кластера.Любая ссылка на архитектуру виртуального разбиения PlayORM была бы полезна. – Ouroboros

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