Производительность Кассандры для длинных рядов - PullRequest
8 голосов
/ 16 марта 2012

Я смотрю на реализацию CF в Cassandra, которая имеет очень длинные строки (от сотен тысяч до миллионов столбцов в строке).

Используя полностью фиктивные данные, я вставил 2 миллиона столбцов водин ряд (равномерно распределенный).Если я выполняю операцию среза, чтобы получить 20 столбцов, то я замечаю значительное снижение производительности по мере того, как вы выполняете операцию среза дальше по строке.

В большинстве столбцов я, кажется, могу обслуживатьувеличение среза приводит к 10-40 мс, но по мере приближения к концу строки производительность достигает предела, время отклика постепенно увеличивается с 43 мс на отметке 1 800 000 до 214 мс на 1 900 000 и на 435 мс на 1 999 900!(Все срезы имеют одинаковую ширину.)

Я затрудняюсь объяснить, почему происходит такое значительное снижение производительности, когда вы добираетесь до конца строки.Может ли кто-нибудь дать какие-то указания относительно того, что Кассандра делает внутренне, чтобы сделать такую ​​задержку?Кэширование строк отключено, и в значительной степени все является установкой Cassandra 1.0 по умолчанию.

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

Большое спасибо.

Предостережение, я выполняю 10 параллельных запросов одновременно, поэтому они немного медленнеев любом случае, чем я ожидал, но это справедливый тест для всех запросов, и даже просто выполняя их все последовательно, наблюдается странное снижение между 1 800 000 и 1 900 000 записью.

Я также заметил, ЧРЕЗВЫЧАЙНО плохопроизводительность при выполнении обратных слайсов только для одного элемента при 200 000 столбцов в строке: query.setRange (end, start, false, 1);

Ответы [ 2 ]

9 голосов
/ 16 марта 2012

Хорошим ресурсом по этому вопросу является сообщение в блоге Аарона Мортона о Обратных компараторах Кассандры .Из статьи:

Вспомните из моего поста Планы запросов Кассандры , что, как только строки достигают определенного размера, они включают индекс столбцов.И что весь индекс должен читаться всякий раз, когда необходимо использовать какую-либо часть индекса, что имеет место при использовании диапазона слайсов, который задает начало или обратное.Таким образом, самым быстрым запросом среза к строке был тот, который извлек первые X столбцов в строке, указав только число столбцов.

Если вы в основном читаете с конца строки (дляНапример, если вы храните вещи по меткам времени и в основном хотите просматривать последние данные), вы можете использовать Reversed Comparator, в котором столбцы хранятся в порядке убывания.Это даст вам гораздо лучшую (и более последовательную) производительность запросов.

Если ваши шаблоны чтения более случайны, возможно, лучше разбить данные на несколько строк.

4 голосов
/ 19 марта 2012

Комментарий Псанфорда привел меня к ответу.Оказывается, что Cassandra <1.1.0 (в настоящее время находится в бета-версии) имеет низкую производительность на срезах в длинных строках в Memtables (которые не были записаны на диск), но лучшую производительность на SSTables, сбрасываемых на диск с теми же данными. </p>

см. http://mail-archives.apache.org/mod_mbox/cassandra-user/201201.mbox/%3CCAA_K6YvZ=vd=Bjk6BaEg41_r1gfjFaa63uNSXQKxgeB-oq2e5A@mail.g65 https://issues.apache.org/jira/browse/CASSANDRA-3545.

В моем примере первые 1,8 миллиона строк были сброшены на диск, поэтому срезы в этом диапазоне были быстрыми, но последние ~ 200 000 строк не были сброшены на диск и все еще были в memtables.Поскольку на длинных строках нарезка памяти происходит медленно, вот почему я видел плохую производительность в конце строк (мои данные были вставлены в порядке столбцов).

Это можно исправить, вручную вызвав сброс наКассандровые узлы.Патч был применен к 1.1.0, чтобы исправить это, и я могу подтвердить, что это решает проблему для меня.

Надеюсь, это поможет кому-то еще с такой же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...