Распределенная пагинация в Кассандре

Я искал разбиение на страницы в cassandra и нашел эту идеальную тему здесь: Разбиение на страницы результатов в Cassandra (CQL), причем этот ответ принят большинством людей. Но я хочу делать то же самое на нескольких компьютерах. Приведу пример ...

Проблема

Допустим, у меня есть три компьютера, подключенные к одной базе данных cassandra. Каждый компьютер хочет взять несколько строк из следующей таблицы:

CREATE TABLE IF NOT EXISTS lp_webmap.page (
    domain_name1st text,
    domain_name2nd text,
    domain_name3rd text,
    location text,
    title text,
    rank float,
    updated timestamp,
    PRIMARY KEY (
        (domain_name1st, domain_name2nd, domain_name3rd), location
    )
);

Каждый компьютер занимает несколько строк и выполняет за них трудоемкие вычисления. Для фиксированного ключа раздела (имя_домена1st, имя_домена2nd, имя_домена3rd) и другого ключа кластеризации (расположение) могут быть тысячи результатов.

И теперь возникает проблема ... как быстро заблокировать пару строк, когда компьютер1 работает на других компьютерах?

Неиспользуемое решение

В стандартном SQL я бы использовал что-то вроде этого:

CREATE TABLE IF NOT EXISTS lp_registry.page_lock (
    domain_name1st text,
    domain_name2nd text,
    domain_name3rd text,
    page_from int,
    page_count int,
    locked timestamp,
    PRIMARY KEY (
        (domain_name1st, domain_name2nd, domain_name3rd), locked, page_from
    )
) WITH CLUSTERING ORDER BY (locked DESC);

Это позволило бы мне сделать следующее:

  • Выберите первые 10 страниц на компьютере 1 и заблокируйте их (page_from = 1, page_count = 10)
  • Быстро проверьте блокировки на двух других машинах и получите неиспользуемые страницы для расчетов.
  • Принимайте и блокируйте большее количество страниц на более быстрых компьютерах
  • Удалить все блокировки для данного ключа раздела после обработки всех страниц

Вопрос

Однако я не могу сделать LIMIT 20,10 в Cassandra, а также не могу сделать это, так как я хочу разбивать на страницы на разных компьютерах. Есть ли шанс, как быстро пролистать эти страницы?


person Michal    schedule 14.02.2016    source источник
comment
Я бы не знал, как сделать то, о чем вы просите. Но рассматривали ли вы альтернативные подходы? Например, используя один клиент Cassandra для запроса строк, которые необходимо обработать, помещая их в очередь и заставляя все клиенты потреблять строки из очереди? Таким образом вы можете контролировать количество обрабатываемых строк и получить балансировку нагрузки между клиентами.   -  person Ralf    schedule 14.02.2016
comment
Я не понимаю вашего требования, вы можете объяснить его более подробно? Почему для разбивки результатов на страницы необходима блокировка?   -  person doanduyhai    schedule 14.02.2016
comment
@doanduyhai ... Зачем нужна блокировка? Потому что я не хочу, чтобы два разных компьютера обрабатывали одни и те же строки.   -  person Michal    schedule 14.02.2016
comment
Если вы хотите разделить обработку вашей таблицы на разные компьютеры. Что вы можете сделать, так это использовать существующие ключи разделов. Например, вы можете решить, что компьютер1 может обрабатывать только список (имя_домена1st, имя_домена2nd, имя_домена3rd), а компьютер2 обрабатывает только другую комбинацию доменных имен.   -  person doanduyhai    schedule 14.02.2016
comment
@doanduyhai, тогда должна быть дополнительная логика, которая будет указывать каждому конкретному компьютеру, какие ключи раздела используют, а какие нет. Поскольку эти узлы (компьютеры) независимы, и я хочу добавить неопределенное количество узлов в будущем, боюсь, я не смогу этого сделать. Но спасибо за совет.   -  person Michal    schedule 14.02.2016
comment
Существует простое решение для независимости разделения компьютера на разделы. Используйте последовательное хеширование. Например, каждому компьютеру присваивается порядок (1, 2, ... N). Затем для каждого кортежа (имя_домена1st, имя_домена2nd, имя_домена3rd) вычислите хэш из 3 значений, он даст вам целое число. Затем вычислите по модулю этого хеш-значения против N (N = общее количество компьютеров). Если хэш% N = 2, то за этот раздел отвечает компьютер с номером 2.   -  person doanduyhai    schedule 14.02.2016