Узнайте, как развернуть Python SQL Engine в кластере k8s и запускать сложные функции Python из SQL

Даже самые лучшие данные не имеют значения, если никто не может получить к ним доступ. Поэтому крайне важно сделать данные доступными для всех, без необходимости изучать сложные языки программирования. Это проблема, которую пытаются решить движки SQL-запросов. Они позволяют каждому, обладающему некоторыми знаниями SQL, получить доступ к данным, хранящимся в типичных системах больших данных.

Проблема решена? Может быть нет. Потому что во многих случаях ваши данные не хранятся в удобном для доступа озере данных, таком как S3. И вычисления, которые вы хотите применить к нему, - это алгоритмы машинного обучения или другие (обычно на основе Python) сложные операции. Это не очень хорошо работает с (обычно) очень строгими и часто основанными на Java механизмами запросов SQL, такими как presto, Apache Impala или Apache Hive.

И сейчас?

dask-sql (отказ от ответственности: я являюсь автором) - это молодой механизм SQL-запросов, построенный на основе dask, среды распределенных вычислений, написанной исключительно на Python и очень хорошо сочетающейся с экосистемой Python, такой как ваши любимые фреймворки машинного обучения. Это позволяет использовать обычный SQL, например. из вашего любимого инструмента бизнес-аналитики и запрашивать данные, хранящиеся в пространстве Python. В фоновом режиме ваши вычисления распределяются по кластеру машин, но эта сложность тщательно скрывается от вас.

В этом сообщении блога мы развернем dask-sql в кластере Kubernetes (k8s) и будем использовать его для запроса частей данных такси Нью-Йорка и применения к нему машинного обучения. В дополнение к dask-sql и кластеру Dask (для выполнения расчетов) мы развернем Apache Hue в качестве примера для инструмента бизнес-аналитики. Даск хорошо работает с множеством вычислительных систем (YARN, пакетные системы, k8s и т. Д.). Мы используем k8s, поскольку он позволяет нам очень быстро создать кластер у поставщика общедоступного облака для тестирования.

Разверните кластер k8s

Для этого сообщения в блоге мы собираемся развернуть кластер k8s в Google Cloud. Однако вы можете использовать любой кластер k8s по своему усмотрению (на AWS, Azure, в вашей собственной инфраструктуре).

Обновление: как правильно заметил kernelcorn, вы должны принять во внимание, где находятся ваши данные, чтобы найти подходящее место для вашего кластера k8s (в противном случае вы можете заплатить как производительностью, так и реальными деньгами). Мы запрашиваем данные на AWS из GCP - это нормально для этого примера использования, но для любого крупномасштабного варианта использования вы хотите максимально приблизить свои вычисления к своим данным.

Чтобы продолжить, войдите в консоль Google Cloud (или зарегистрируйте новую учетную запись) и включите Kubernetes Engine API. После этого создайте кластер k8s разумного размера, например запустив в облачной консоли (или на вашем локальном компьютере после установки и настройки утилиты gcloud и kubectl) следующее:

gcloud container clusters create \
 — machine-type n1-standard-2 \
 — num-nodes 4 \
 — zone <compute zone> \
 — cluster-version latest \
 <cluster name>

Убедитесь, что вы выбрали вычислительную зону рядом с вами и подходящее имя кластера (например, dask-sql). После развертывания вы должны увидеть четыре работающих узла в кластере с

kubectl get node

Также установите helm (он уже установлен в консоли Google Cloud). Если вы не знаете о helm, не забудьте также проверить страницу его проекта (но вкратце: это для k8s, что такое pip для python)

Разверните dask-sql и получите к нему доступ

Теперь мы готовы развернуть наш кластер Dask, dask-sql и Apache Hue в качестве внешнего интерфейса. Чтобы упростить развертывание, я собрал все в репозиторий git. Клонируйте его и разверните с помощью helm в кластере

git clone https://github.com/nils-braun/dask-sql-k8s-deployment
cd dask-sql-k8s-deployment
helm dependency update dask-sql
helm upgrade --cleanup-on-fail --install dask-sql dask-sql

Развертывание займет некоторое время (так как необходимо загрузить некоторые данные из S3). Вы можете проверить с

kubectl get pods

если все поды уже находятся в состоянии «готово». Как только это произойдет, получите доступ к инструменту Apache Hue BI, обратившись к внешнему IP-адресу, напечатанному на

kubectl get services hue

на порт 8888 или - если вы выполняете развертывание с локального компьютера - путем перенаправления портов

kubectl port-forward svc/hue 8888:8888

и доступ к http: // localhost: 8888. Первое введенное вами имя пользователя и пароль будет использоваться в качестве учетной записи администратора. Теперь подождите, пока база данных не появится в представлении PrestoSQL слева, и начните запрашивать ее! Например, вы можете запустить

SELECT
    FLOOR(trip_distance / 5) * 5 AS "distance",
    AVG(tip_amount) AS "given tip",
    AVG(predict_price(total_amount, trip_distance, passenger_count)) AS "predicted tip"
FROM "nyc-taxi"
WHERE
    trip_distance > 0 AND trip_distance < 50
GROUP BY
    FLOOR(trip_distance / 5) * 5

Что здесь происходит?

Давайте сделаем шаг назад, чтобы понять, что здесь происходит. Мы развернули небольшой кластер из 6 рабочих Dask, планировщик для управления ими, сервер dask-sql и Apache Hue. Если вам интересно, загляните в репозиторий, чтобы узнать больше.

Теперь, когда вы вводите SQL-запрос в Hue, он пересылается на сервер dask-sql (который, случается, говорит по протоколу presto wire, даже если это не сервер presto). dask-sql проанализирует запрос и отправит его в кластер Dask для вычисления, который в конечном итоге получит данные.

Вот и славно. Но почему это так круто? Поскольку вы использовали SQL не только для запуска сложных распределенных вычислений, происходящих в кластере машин (что само по себе уже круто), вы даже запускали вычисление python. Это важно, потому что это открывает возможность (повторно) использовать ваши любимые пакеты и функции Python.

Присмотритесь к приведенному выше примеру SQL. Вы видите функцию predict_price? Это не похоже на стандартную функцию SQL! И да, если вы заглянете в dask-sql/files/run.py файл в репозитории, вы увидите, что это функция Python!

# Our custom function for tip-prediction
# using the already loaded xgboost model
def predict_price(total_amount, trip_distance, passenger_count):
    # Create a dataframe out of the three columns
    # and pass it to dask-xgboost, to predict
    # distributed
    X = dd.concat([total_amount, trip_distance, passenger_count],
                        axis=1).astype("float64")
    return dask_xgboost.predict(client, bst, X)

Он использует уже обученную модель xgboost, которая оценивается на данных, считываемых с S3 (данные предварительно зарегистрированы, как вы можете видеть в том же файле). И все это контролируется с помощью SQL - красиво и чисто, даже если вы этого не заметите.

Что ты можешь сделать с этим? Представьте, что все, что нужно сделать вашим инженерам по данным, - это определить образцы данных и базы данных, которые зарегистрированы в dask-sql. После этого каждый в вашей организации может начать запрашивать данные, если они немного знают SQL. Независимо от того, хранятся ли ваши данные на S3 или hdfs (что также можно сделать, например, с помощью Impala или presto), но также и из любой системы и в любом формате - если вы можете читать их с помощью Python (что верно практически для всего) . Кроме того, вы можете запускать произвольные, предварительно зарегистрированные вычисления Python для этих данных из SQL: машинное обучение, пользовательские вычисления, которыми вы делитесь между своей командой Data Science и BI, сложные операции, которые слишком сложны для непосредственной реализации в SQL, вы называете это. Благодаря этому вы сможете сократить разрыв между бизнес-аналитиками, специалистами по данным и инженерами по данным и еще быстрее получить важную бизнес-информацию о своих (больших) данных.

Вывод

В этом сообщении блога описывается, как вы можете начать работу с dask-sql в кластере kubernetes и начать опрашивать свои данные с помощью SQL. Если вас интересует более подробная информация, вот несколько ссылок, которые помогут начать ваше путешествие:

Обязательно удалите кластер после того, как закончите.

Удачного SQL-запроса!