2016-08-13 3 views
9

Я получаю запрос на навальный запрос, чтобы сказать около 20 ключей от клиента. Я могу либо записать их на C * в одной партии, либо написать их индивидуально в асинхронном режиме и ждать в будущем, чтобы завершить их.Cassandra: Оптимизация пакетной записи

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

Есть ли способ в datastax драйвера Java, с которым я могу группа клавиш , которые могут принадлежать к одной перегородке, а затем клуб их в маленькие партии и затем сделать invidual Незарег пакетную запись в асинхронном. IN, что способ сделать меньше вызовов rpc на сервере, в то же время координатор будет должен писать локально. Я буду использовать политику распознавания токенов.

ответ

7

Ваша идея правильная, но нет встроенного способа, вы обычно делаете это вручную.

Главное правило здесь заключается в использовании TokenAwarePolicy, поэтому некоторая координация будет происходить со стороны водителя. Затем вы можете сгруппировать свои запросы с помощью равенства ключа раздела, что, вероятно, будет достаточно, в зависимости от вашей рабочей нагрузки.

То, что я подразумеваю под «группировкой по равенству ключа раздела», является, например, у вас есть некоторые данные, которые выглядят как

MyData { partitioningKey, clusteringKey, otherValue, andAnotherOne } 

Тогда при вставке несколько таких объектов, сгруппировать их по MyData.partitioningKey. Это значит, что для всех существующих значений paritioningKey вы берете все объекты с такими же partitioningKey и оберните их в BatchStatement. Теперь у вас есть несколько BatchStatements, так что просто выполните их.

Если вы хотите пойти дальше и мимических Cassandra хеширования, то вы должны смотреть на метаданные кластера с помощью метода getMetadata в com.datastax.driver.core.Cluster классе есть метод getTokenRanges и сравнить их с результатом Murmur3Partitioner.getToken или любого другого секционирования настроенного в cassandra.yaml. Я никогда не пробовал это сам.

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

+0

Как я командные клавиш для перехода на тот же узел? - клиент данных stax выставляет токены, принадлежащие каждому узлу, так что я могу шуметь, а затем группировать их? – Peter

+0

Ответа на этот вопрос. – folex

+0

Можете ли вы объяснить, «вы можете сгруппировать свои запросы с помощью равенства ключа раздела» немного больше? Я не понял эту часть. – Peter

0

Записанные файлы должны быть тщательно использованы в Кассандре, потому что они налагают дополнительные накладные расходы. Это также зависит от распределения ключей разделов. Если ваша основная запись нацелена на один раздел, то с помощью Unlogged пакетный результат выполняется в одной операции вставки.

В общем, писать их invidually в асинхронной манере, кажется хорошим Подход как указано здесь: https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-the-nuanced-edition-dd78d61e9885

Вы можете найти пример кода на указанном выше сайте, как обращаться с несколькими асинхр пишет: https://gist.github.com/rssvihla/26271f351bdd679553d55368171407be#file-bulkloader-java https://gist.github.com/rssvihla/4b62b8e5625a805583c1ce39b1260ff4#file-bulkloader-java

EDIT:
пожалуйста, прочитайте это также: https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/#14

Что стоит отдельная партия партий?

Для отдельных партий партий нет журнала регистрации партий. Координатор не имеет дополнительной работы (как для многостраничного раздела ), потому что все идет в один раздел. Отдельные пакеты оптимизированы: они применяются с одним RowMutation [10].

В нескольких словах: отдельные разделы не кладут гораздо больше нагрузки на сервер, чем обычно пишет.


Что делает мульти раздел пакетную стоимость?

Позволь мне процитировать Кристофер Батя, потому что он суммировал это очень хорошо на своем посту «Cassandra антишаблон: Записано партия» [3]:

Кассандра [сначала] писать все заявления пакетный журнал. То, что пакетный журнал реплицируется на два других узла в случае сбоя координатора . Если координатор терпит неудачу, тогда возьмет на себя еще одна реплика для журнала партии . [..] Координатор должен сделать намного больше работы, чем любого другого узла в кластере.

Опять же, в пулях, что должно быть сделано:

  1. сериализации заявление партии
  2. написать сериализированную партию к системной таблице журнала партии
  3. повторности этого сериализованной партии 2 узлов
  4. Координаты записываются на узлы, содержащие разные разделы
  5. по состоянию на сс удалить сериализированную партию из журнала пакетного (также на 2 репликах)

Помните, что неавторизованная партию для нескольких разделов, являются устаревшими, поскольку Cassandra 2.1.6

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