Кассандре не удалось запросить сумму строк из таблицы - PullRequest
1 голос
/ 28 мая 2019

Я использую базу данных Cassandra для сбора и сохранения данных простого сетевого анализатора, но поскольку число строк в таблице превышает 20 миллионов строк +, невозможно выполнить какую-либо статистическую функцию, такую ​​как sum или count.

Ниже приведена схема моей таблицы:

CREATE TABLE db.uinfo (
    id timeuuid,
    created timestamp,
    dst_ip text,
    dst_mac text,
    dst_port int,
    protocol int,
    src_ip text,
    src_mac text,
    src_port int,
    PRIMARY KEY (id, created)
) WITH CLUSTERING ORDER BY (created ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

Теперь, когда я запускаю запрос (с ограничением или без него):

select src_ip, sum(data) as total from db.uinfo;

Выдает следующую ошибку:

OperationTimedOut: errors={'127.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=127.0.0.1

Есть ли шанс, что кто-нибудь из вас, хорошие люди, может помочь мне сделать то же самое?Я попытался изменить время ожидания в cqlshrc и cassandra.yaml соответственно.Я даже пытался запустить cqlsh используя:

cqlsh --connect-timeout=120 --request-timeout=120.

Я использую [cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]

1 Ответ

2 голосов
/ 28 мая 2019

Этот тип запросов не будет работать с Cassandra, когда у вас есть относительно большие данные - такие запросы требуют сканирования всей базы данных и чтения всех данных в ней.Кассандра хороша, когда вы знаете раздел, на который хотите попасть, и поэтому отправляете запросы только на отдельные серверы, где они могут быть обработаны очень эффективно.Таким образом, функции агрегирования лучше всего работают только в пределах раздела.

Если вам нужны такие запросы - обычное предложение - использовать Spark для параллельного чтения данных и выполнения агрегации.Вы можете сделать это, используя Spark Cassandra Connector , но это будет медленнее, чем обычные запросы - может быть, десятки секунд или даже минут, в зависимости от размера данных, аппаратного обеспечения для заданий Spark и т. Д.

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

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