Узнайте, как развернуть 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. Если вас интересует более подробная информация, вот несколько ссылок, которые помогут начать ваше путешествие:
- Информация о Dask: dask.org
- Страница проекта dask-sql: https://nils-braun.github.io/dask-sql/
- Документация по dask-sql: dask-sql.readthedocs.io
Обязательно удалите кластер после того, как закончите.
Удачного SQL-запроса!