Классические реляционные системы управления базами данных (MS SQL Server, MySQL, PostreSQL) являются строчными:

Значения, относящиеся к одной строке, физически хранятся рядом. В колоночных СУБД все наоборот:

Разный порядок хранения данных подходит для разных сценариев работы.
Классический OLTP-сценарий (Online Transaction Processing):
Сценарий извлечения и обработки больших данных, OLAP-сценарий (Online Analytical Processing):
Для OLTP-сценария целесообразно применять строковые базы данных, а для OLAP-сценария — колоночные.
Примеры колоночных СУБД: ClickHouse, Cassandra, Snowflake, Amazon Redshift и BigQuery.
В рамках лабораторной работы мы будем работать с СУБД ClickHouse, разработку которой начинал Яндекс. ClickHouse был разработан для решения задач веб-аналитики для Яндекс Метрики — третьей по популярности системы веб-аналитики в мире. В настоящее время ClickHouse используют Cloudflare, Bloomberg, ВКонтакте, Т-Банк и другие.
Особенности ClickHouse:
Spark является частью экосистемы Hadoop и альтернативой MapReduce. Spark позволяет производить пакетную и потоковую обработку данных.
В отличии от MapReduce в Spark:
Spark может работать в Hadoop-кластере под управлением YARN и загружать данные из распределенных файловых систем (например, из HDFS). Spark состоит из следующих компонентов:
Основными абстракциями в Spark являются Resilient Distributed Dataset (RDD) и DataFrame. Для работы с Apache Spark существуют API на самых разных языках программирования (Java, Python, Scala, R). Мы будем использовать PySpark.
Научиться работать с колончатой системой управления базами данных ClickHouse и выполнять аналитические запросы с использованием PySpark.
Spark (Hadoop)ClickHouseЭти названия будут использоваться далее в инструкции
Вы можете выполнять эту ЛР до выполнения ЛР 2. В этом случае вам просто потребуются две настроенные виртуальные машины с различными IP-адресами, находящиеся в одной виртуальной сети. Переименуйте их, чтобы было проще следовать инструкции
ClickHouse (потребуется авторизоваться на Kaggle, возможно у вас есть аккаунт, можно через Google)Чтобы скачать набор данных на странице с данными нажмите
Download, далееDownload dataset as zip
в архиве будет 2 файла с расширением .csv; возьмите тот, который больше по размеру (~400 МБ), для удобства переименуйте его в data.csv и перенесите на виртуальную машину ClickHouse
это данные о финансовых транзакциях, могут быть использованы для решения задачи классификации (мошенническая транзакция или нет)
Чтобы было удобнее писать код на Python в режиме подключения по SSH через Visual Studio Code сразу после подключения к виртуальной машине перейдите на вкладку
Extensionsв Visual Studio Code и установите на конкретную виртуальную машину расширениеPython.
ClickHouseОбратите внимание: в ходе установки нужно будет установить пароль пользователя по умолчанию. Запомните этот пароль!
# установка необходимых зависимостей
sudo apt-get install -y ca-certificates curl gnupg
# добавление ключа репозитория ClickHouse
curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
# добавление репозитория ClickHouse
echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
# обновление списка пакетов
sudo apt-get update
# установка ClickHouse
# в ходе установки нужно будет ввести пароль дефолтного пользователя (default)
sudo apt-get install -y clickhouse-server clickhouse-client
sudo nano /etc/clickhouse-server/config.d/listen_host.xml
<clickhouse>
<listen_host>0.0.0.0</listen_host>
<allow_unrestricted_reads_from_file>1</allow_unrestricted_reads_from_file>
</clickhouse>
# запуск сервера
sudo clickhouse start
# подключение к клиенту
clickhouse-client
clickhouse-client вы можете писать SQL-запросы к серверуclickhouse-client выполните команду exitSELECT version();
Не забудьте ввести пароль пользователя
Если веб-интерфейс не открывается, остановите сервер командой
sudo clickhouse stop; выполните командуsudo clickhouse-serverи посмотрите логи; по логам можно заняться исследованием ошибок
ClickHousedata.csv в нужную директорию и измените владельца:sudo mv data.csv /var/lib/clickhouse/user_files/
sudo chown clickhouse:clickhouse /var/lib/clickhouse/user_files/data.csv
CREATE TABLE transactions
ENGINE = MergeTree()
ORDER BY tuple()
AS SELECT * FROM file('data.csv', 'CSVWithNames', 'auto');
Не забудьте указать корректный путь к файлу! Путь указывается относительно директории
/var/lib/clickhouse/user_files/
SELECT * FROM transactions LIMIT 500
используя документацию по запросам, попрактикуйтесь с выполнением аналитических запросов
Пример вывода:

Пример вывода:

Spark (Hadoop)wget https://dlcdn.apache.org/spark/spark-3.5.5/spark-3.5.5-bin-hadoop3.tgz
tar xvf spark-3.5.5-bin-hadoop3.tgz
~/.bashrc следующие значения (важно: следите за вашими путями; у вас могут быть другие пути, не такие как у меня):export SPARK_HOME=/home/mikhail/spark-3.5.5-bin-hadoop3
export PATH=$PATH:$SPARK_HOME/bin
source ~/.bashrcspark-shell, запустится оболочка Spark, ее можно закрыть через Ctrl+CSpark (Hadoop)pysparkfrom pyspark.sql import SparkSession
spark = SparkSession.builder\
.master("local[*]")\
.appName('Spark Test')\
.getOrCreate()
Spark (Hadoop), поместите его в папку с проектом (где вы код пишите на Python)from pyspark.sql import SparkSession
spark = SparkSession.builder\
.master('local[*]')\
.appName('Spark Test')\
.config('spark.driver.extraClassPath','clickhouse.jar')\
.getOrCreate()
# здесь не забудьте если нужно поменять адрес
url='jdbc:clickhouse://192.168.56.101:9000'
user='default'
# и здесь
password='12345'
# здесь имя пользователя и таблицы
dbtable='default.transactions'
driver='com.github.housepower.jdbc.ClickHouseDriver'
# загружаем данные в виде DataFrame
df=spark.read.format('jdbc').option('driver',driver).option('url',url).option('user',user).option('password',password).option('dbtable',dbtable).load()
# выводим 5 строк датафрейма
df.show(5)
pyspark.sql) напишите код для выполнения тех же 4 запросов, которые вы писали в браузере;