В мире больших данных
218 subscribers
34 photos
5 files
54 links
Полезные заметки о системном анализе в мире больших данных. Если вам интересны Big Data, DWH, SQL и как навести порядок в данных — заглядывайте. Будет интересно и по делу.

Автор: @JuliaMur
Download Telegram
Коротко о ClickHouse:

— OLAP-СУБД
— Колоночное хранение
— Эффективное сжатие данных
— Многопоточная, распределённая, специализированные векторные алгоритмы
— Высокая производительность
— Горизонтальное масштабирование
— Обновление данных большими батчами
— Время обработки 10 строк примерно такое же, как 10 000 строк
— SQL с особенностями
— Отсутствие транзакций
— Не любит джойны
— Ограниченность оконных функций

#clickhouse
Шардирование данных в ClickHouse

Шардирование — стратегия горизонтального масштабирования кластера (набора серверов), при которой части одной базы данных размещаются (и обрабатываются) параллельно на разных узлах кластера. Узел — 1 сервер кластера. Каждый сервер хранит свой набор данных.

Для шардирования используется движок Distributed. Он не хранит данные самостоятельно, а позволяет обрабатывать запросы распределённо, на нескольких серверах. Чтение автоматически распараллеливается.

Данные между шардами распределяются либо по какому-то ключу, например по идентификатору пользователя, либо равномерно. В качестве ключа шардирования рекомендуется брать значение хеш-функции от поля (not-Nullable) в таблице, которое обеспечит достаточно ровное распределение наборов данных по разным шардам в кластере. Либо же поле должно быть наполненно уникальными INTEGER значениями. Это важно для равномерного распределения данных между шардами.

Каждая шардированная таблица в ClickHouse состоит из:
— распределенной таблицы на движке Distributed, которая маршрутизирует запросы;
— нижележащих таблиц с данными, расположенных на нескольких шардах кластера.

С шардированной таблицей можно работать с данными, обращаясь:
— к нижележащим таблицам напрямую: вставлять данные на нужные шарды или читать данные, содержащиеся в таблице на конкретном шарде (сложнее, но эффективнее);
— через распределенную таблицу, которая будет представлять данные всех распределнных таблиц в виде единой таблицы.

Подробнее про создание Distributed-table можно прочитать в доке: https://clickhouse.com/docs/en/engines/table-engines/special/distributed

#clickhouse
Основные отличия ClickHouse от других MPP-систем

CH изначально создавался как БД, максимально приспособленная для всевозможной агрегации очень широких таблиц (в частности для хранения и использования Яндекс.Метрики), при этом в него изначально не закладывалась необходимость быстрых JOIN.

В CH используется свой диалект SQL, а не общепринятый ANSI SQL. Это нужно учитывать при написании запросов.

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

Ещё раз. ClickHouse создан для быстрой агреграции и не создан для JOIN.

И снова напомню, в ClickHouse нет транзакций. Именно поэтому он такой быстрый. Но отсутствие транзакций также накладывает и свои особенности использования.

#clickhouse
Целочисленные типы в Clickhouse

Кроме привычного Integer, Clickhouse также поддерживает неотрицательные целые числа, которые представлены префиксом U.

Целое число:
Int8 - [-128 : 127] - 8 bit
Int16 - [-32768 : 32767] - 16 bit
Int32 - [-2147483648 : 2147483647] - 32 bit
Int64 - [-9223372036854775808 : 9223372036854775807] - 64 bit
...


Целое неотрицательное число:
UInt8 - [0 : 255] - 8 bit
UInt16 - [0 : 65535] - 16 bit
UInt32 - [0 : 4294967295] - 32 bit
UInt64 - [0 : 18446744073709551615] - 64 bit
...


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

Что важно понимать? Прямое преобразование из UInt в Int чаще всего невозможно, так как Int не вместит в себя весь диапозон UInt. Например, в строке типа UInt8 могут содержаться числа от 0 до 255, в то время как в строке типа Int8 от -128 до 127. Аналогично и с обратным преобразованием, поэтому нужно быть внимательным при переносе данных между разными источниками или внутри БД. Ну и, конечно, всегда изучать не только типы столбцов, но и сами данные и их бизнес-смысл.

Подробнее об ёмкости типов в доках CH.

#clickhouse