Выполнение запросов к Distributed таблицам Clickhouse

admin

Движок Distributed в Clickhouse позволяет работать с большими объемами данных, которые распределены между множеством серверов. Движок Distributed позволяет задать шарды (сервера), на которых хранятся данные и читать/записывать их. Запись данных – это скорее функция для удобства, т.к. более управляемый подход состоит в том, чтобы записывать данные прямо на шарды самостоятельно. А вот чтение данных – это мега удобная функция Distributed таблицы.

Настройка Distributed таблицы

Путь у нас уже есть три шарда с таблицей pageviews. Теперь нам необходимо на отдельном сервере:

  • Настроить кластер в конфиге Clickhouse.
  • Объявить distributed таблицу.
  • Запилить пару запросов для проверки.

Детально процесс описан в статье по распределенному хранению. На сервере, на котором будем делать выборки, добавляем в конфиг (/etc/clickhouse-server/config.xml) список IP адресов шардов:

<**analytics**>

**10.62.195.100**

9000

**10.62.194.180**

9000

**10.62.194.148**

9000

</**analytics**>

## Три сервера шардов, с которых будет читать данные распределенная таблица

На каждом из этих серверов существует таблица pageviews, которая хранит свою порцию данных. После сохранения конфига на сервере для чтения, нам нужно перезапустить Clickhouse. После чего, объявляем на нем распределенную таблицу:

CREATE TABLE pageviews_analytics

(date Date, time DateTime, …, post_id String, session_id String)

ENGINE = Distributed(**analytics**, **mediabox**, **pageviews**)

## Распределенная таблица кластера analytics и базы данных mediabox

Запросы к распределенным данным

Теперь наша таблица готова к запросам:

SELECT count(*) FROM pageviews_analytics

Посчитаем количество записей на всех трех шардах:

┌────count()─┐
│ 5564719584 │
└────────────┘

1 rows in set. Elapsed: 3.290 sec. Processed 5.56 billion rows, 5.56 GB (1.69 billion rows/s., 1.69 GB/s.) 

Ну и что-то посложнее – посчитаем, например, количество устройств и просмотров, которые собирает [https://iotechnologies.com наш счетчик] по странам за 30 дней:

SELECT

uniq(user_id) AS devices,

count(*) AS pageviews,

country

FROM pageviews_analytics

WHERE date >= today() – 30

GROUP BY country

ORDER BY devices DESC

LIMIT 75

В результате увидим следующую таблицу:

┌──devices─┬─pageviews─┬─country────────┐
│ 39570941 │ 103196486 │ United States  │
│ 23291622 │ 172966086 │ Netherlands    │
│ 22805292 │ 117434407 │ Germany        │
│ 21708853 │ 155991547 │ Belgium        │
│ 19607740 │  90915385 │ United Kingdom │
...
│  5717729 │  28592470 │ Singapore      │
│  5151877 │  44360084 │ Chile          │
│  5119712 │  22587348 │ Turkey         │
└──────────┴───────────┴────────────────┘

75 rows in set. Elapsed: 284.743 sec. Processed 5.57 billion rows, 257.16 GB (19.55 million rows/s., 903.15 MB/s.) 

Ограничение по памяти для обработки

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

SELECT 
    count(*) AS total, 
    user_id
FROM pageviews_analytics 
GROUP BY user_id
ORDER BY total DESC
LIMIT 10

↗ Progress: 411.68 million rows, 15.22 GB (39.81 million rows/s., 1.47 GB/s.)
Received exception from server (version 18.14.19):
***Code: 241. DB::Exception: Received from localhost:9000,
::1. DB::Exception: Received from 10.62.194.180:9000.
DB::Exception: Memory limit (for query) exceeded:
would use 9.31 GiB (attempt to allocate chunk of 4194304 bytes),
maximum: 9.31 GiB. ***

0 rows in set. Elapsed: 10.700 sec. Processed 411.68 million rows, 15.22 GB (38.47 million rows/s., 1.42 GB/s.) 

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

<h2>TL;DR

Distributed движок в Clickhouse позволяет делать выборки из таблиц с разных серверов. При этом вам не нужно беспокоиться о склеивании результата, т.к. это как раз эффективно решает сама база данных.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023