Мир больших данных приближается к Kubernetes, и мы уже видим, как многие продукты для обработки данных и искусственного интеллекта / машинного обучения создают свои решения на основе Kubernetes, чтобы гарантировать стабильность, масштабируемость и доступность.

До сих пор большинство решений основывалось на виртуальных машинах, без перечисленных выше уровней оркестрации, автоматизации или управления конфигурацией, что делало эти решения менее масштабируемыми и немного неудобными.

С Kubernetes мы можем предоставить гораздо более масштабируемые решения, которые полностью автоматизированы и сохранят свое состояние после сбоев.

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

Для этого многие организации обращаются к Presto, распределенному механизму запросов SQL, который может извлекать данные из нескольких источников, таких как Elasticseaerch, Cassandra, SQL и S3. С помощью presto вы можете накапливать свои знания в области SQL без необходимости создавать свои собственные сценарии и конвертеры, которые в конечном итоге создают разрозненность организации и мешают вам достичь ваших бизнес-целей.

Возможность Presto запрашивать S3 решает множество проблем, возникающих в мире больших данных. Организации в основном сосредоточены на передаче всех своих данных в Data Lake для хранения структурированных, неструктурированных и полуструктурированных данных, поступающих с устройств Интернета вещей, социальных сетей, внутренних систем и т. Д. во-вторых, вы можете основать свою организацию на Presto, будь то для BI или для обучения алгоритмам AI / ML.

В этой демонстрации я покажу вам, как можно использовать Openshift Container Platform для запуска кластера Presto с помощью Stratbust’s Presto Operator, который будет управлять всем жизненным циклом нашего кластера. Кроме того, мы будем использовать контейнерное хранилище Openshift как для объектного, так и для блочного хранилища, чтобы хранить наши запрошенные данные. Для части анализа данных мы будем использовать оператор Open Data Hub, который предоставит нам возможность подключить Superset к presto, чтобы выполнить некоторый BI-анализ.

Давайте начнем!

Предпосылки

  • Работающий кластер Openshift 4.6.3
  • Доступный сервис S3 (Mine предоставляется с OCS4.6)
  • Работающий кластер OpenDataHub

Установка

Подготовка службы S3

Чтобы начать демонстрацию, сначала давайте взглянем на наши установленные операторы в рамках проекта openshift-storage, чтобы убедиться, что оператор Openshift Container Storage полностью установлен:

Теперь, когда у нас установлен оператор и StorageCluster полностью запущен и работает, давайте проверим, что кластер Ceph, обеспечивающий резервное копирование нашего решения хранения, полностью готов к работе. Для этого мы включим модуль tools, который позволит нам запускать команды Ceph:

oc rsh -n openshift-storage $(oc get pods -n openshift-storage | grep rook-ceph-tools | grep Running | awk '{print $1}')

Теперь запустим ceph -s, чтобы убедиться, что наш кластер находится в работоспособном состоянии:

$ ceph -s
  cluster:
    id:     571a7398-d050-429f-83b0-f758e42e024b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum a,b,c (age 13m)
    mgr: a(active, since 13m)
    mds: ocs-storagecluster-cephfilesystem:1 {0=ocs-storagecluster-cephfilesystem-b=up:active} 1 up:standby-replay
    osd: 3 osds: 3 up (since 13m), 3 in (since 13m)
    rgw: 1 daemon active (s3a.a)
 
  task status:
    scrub status:
        mds.ocs-storagecluster-cephfilesystem-a: idle
        mds.ocs-storagecluster-cephfilesystem-b: idle
 
  data:
    pools:   10 pools, 176 pgs
    objects: 305 objects, 87 MiB
    usage:   3.1 GiB used, 1.5 TiB / 1.5 TiB avail
    pgs:     176 active+clean
 
  io:
    client:   938 B/s rd, 45 KiB/s wr, 1 op/s rd, 2 op/s wr

Мы видим, что наш кластер полностью готов к работе, мы можем создать пользователя S3, которому мы дадим возможность взаимодействовать с нашим сервисом OCS S3:

$ radosgw-admin user create --display-name="odh" --uid=odh      
{
    "user_id": "odh",
    "display_name": "odh",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "odh",
            "access_key": "HC8V2PT7HX8ZFS8NQ37R",
            "secret_key": "Y6CENKXozDDikJHQgkbLFM38muKBnmWBsAA1DXyU"
        }
    ],

Большой! теперь у нас есть сервис S3, с которым мы можем взаимодействовать.

Загрузите данные в нашу корзину S3

В этом разделе мы загрузим предварительно созданный JSON в корзину S3, чтобы Presto мог запрашивать его. Давайте создадим конфигурацию для awscli:

$ export AWS_ACCESS_KEY_ID=HC8V2PT7HX8ZFS8NQ37R 
$ export AWS_SECRET_ACCESS_KEY=Y6CENKXozDDikJHQgkbLFM38muKBnmWBsAA1DXyU

Важный! используйте те же учетные данные, которые вы создали в предыдущем разделе, чтобы Presto мог видеть созданный сегмент.

Файл JSON, accounts.json предварительный просмотр:

{"name": "Michael"}
{"name": "Shimon", "age": 30, "country": "Israel"}
{"name": "Melissa", "age":12, "country": "Spain"}
{"name": "Shon", "age":24, "country": "Spain"}
{"name": "Jake", "age":28, "country": "US"}
{"name": "Kate", "age":50, "country": "Hungary"}
{"name": "Aaron", "age":35, "country": "Africa"}

Теперь давайте создадим корзину и загрузим наш файл JSON в корзину S3:

$ aws s3 mb s3://processed-data --endpoint-url http://rgw-openshift-storage.apps.cluster-b601.b601.example.opentlc.com
$ aws s3 cp accounts.json s3://processed-data/accounts.json/ --endpoint-url http://rgw-openshift-storage.apps.cluster-b601.b601.example.opentlc.com

Важно! для создания схемы Presto объект должен быть помещен в префикс S3 (папку). В реальном мире эта фаза выполняется автоматически, так как ваши конвейеры ETL, вероятно, будут обрабатывать данные (бронза-серебро-золото) и перебрасывать все обработанные объекты в корзину Gold, в нашем случае это корзина обработанных данных.

Развертывание нашего кластера Presto

Чтобы Presto сохранял метаданные, мы используем Hive. Поскольку Hive требуется место для хранения всей информации о схемах и таблицах, кластер PostgreSQL следует развернуть заранее.

Для этого мы воспользуемся командой oc для создания нашего развертывания:

$ oc create -f https://github.com/shonpaz123/cephdemos/raw/master/superset-presto-ocs/01-presto-pg-deployment.yml

Давайте проверим, что база данных PostgreSQL полностью работоспособна:

$ oc get pods 
                                                                                                              
NAME                        READY   STATUS    RESTARTS   AGE
postgres-68d5445b7c-fpp8x   1/1     Running   0          46

Теперь давайте посмотрим, как наш кластер PostgreSQL ограничил PVC, исходящий из нашего класса хранилища RBD:

$ oc get pvc 
                                                                                                             
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
postgres-pv-claim   Bound    pvc-452121cc-c46f-4444-9424-113f00587e6e   5Gi        RWO            ocs-storagecluster-ceph-rbd   14m

Большой! наш кластер PostgreSQL готов потреблять данные из OCS! Теперь давайте создадим наш кластер presto, прежде чем мы это сделаем, мы установим Presto Operator, поступающий из Operator Hub:

Сначала мы создадим секрет, который Presto будет использовать для доступа к нашей службе S3, этот секрет будет содержать наш доступ к S3 и секретный ключ:

$ oc create secret generic aws-secret --from-literal=AWS_ACCESS_KEY_ID="HC8V2PT7HX8ZFS8NQ37R" --from-literal=AWS_SECRET_ACCESS_KEY="Y6CENKXozDDikJHQgkbLFM38muKBnmWBsAA1DXyU"

Мы укажем на Престо, чтобы он извлек учетные данные из этого секрета.

Отлично, теперь мы можем создать наш кластер, для этого мы воспользуемся командой oc, чтобы создать Presto CR для Presto Operator, который в конечном итоге создаст наш кластер со всей необходимой конфигурацией:

$ oc create -f https://github.com/shonpaz123/cephdemos/raw/master/superset-presto-ocs/02-presto-deployment.yml

Важно! убедитесь, что вы изменили как hive.s3.endpoint, так и s3Endpoint, чтобы они указывали на вашу службу S3. Если ваша служба S3 находится внутри самого кластера Openshift, вам следует указать IP-адрес службы S3 ClusterIP для работы с path_style, например:

$ oc get svc -n openshift-storage | grep rgw                                                                                  
rook-ceph-rgw                                  ClusterIP      172.30.255.77    <none>

Теперь, когда у нас есть IP-адрес S3, мы можем поместить его в Presto CR, чтобы Presto мог его использовать. Давайте проверим, что наш кластер Presto полностью готов к работе:

$ oc get pods                                                                                                                 
NAME                                             READY   STATUS    RESTARTS   AGE
hive-metastore-presto-odh-5fd66d5848-w84cw       1/1     Running   0          6m46s
postgres-68d5445b7c-fpp8x                        1/1     Running   0          13m
presto-coordinator-presto-odh-84cf47f6f9-22wx2   2/2     Running   0          6m46s
presto-operator-877cb866b-7fmkd                  1/1     Running   0          10m
presto-worker-presto-odh-7864984fc5-m4jjg        1/1     Running   0          6m46s
presto-worker-presto-odh-7864984fc5-rp85m        1/1     Running   0          6m46s

Большой! у нас есть все необходимые ресурсы, чтобы начать запрашивать нашу службу S3! Для этого подключимся к нашему модулю coordinator:

$ oc rsh $(oc get pods | grep coordinator | grep Running | awk '{print $1}')

Теперь мы подключимся к presto-cli оболочке, чтобы запустить несколько запросов:

sh-4.4$ presto-cli --catalog hive 
presto> CREATE SCHEMA hive.accounts WITH (location='s3a://processed-data/accounts.json/');
CREATE SCHEMA

Мы сообщаем Presto, что хотим создать схему, которая будет расположена в определенном префиксе (папке) в нашей корзине S3. Теперь давайте создадим таблицу, которая будет сопоставлена ​​с загруженным ранее JSON:

presto> USE hive.accounts;
presto:accounts> CREATE TABLE accounts (name varchar, age int, country varchar) WITH (format = 'json', external_location = 's3a://processed-data/accounts.json/');
CREATE TABLE

Мы переключили наш контекст на использование созданной схемы, затем создали таблицу, которая сопоставляет все поля столбцов с ключами JSON, которые есть в нашей корзине S3, и наконец сказали Presto, что файл, находящийся в корзине, имеет формат JSON.

Там Там Там! настал наш момент :)

Теперь давайте запросим нашу таблицу:

presto:accounts> SELECT * from accounts;
  name   | age  | country 
---------+------+---------
 Michael | NULL | NULL    
 Shimon  |   30 | Israel  
 Melissa |   12 | Spain   
 Shon    |   24 | Spain   
 Jake    |   28 | US      
 Kate    |   50 | Hungary 
 Aaron   |   35 | Africa  
 Aaron   |   35 | Africa  
(8 rows)

Джекпот! мы только что SQL запросили JSON, находящийся в нашей корзине S3!

В реальной производственной среде вы определенно не будете работать с presto-cli, и вам понадобится более интеллектуальное решение, для этого мы воспользуемся Superset, чтобы начать работу по бизнес-аналитике.

Для этого мы воспользуемся оператором Open Data Hub, который предоставит нам полное развертывание надмножества:

Теперь, когда у нас установлен Superset, давайте войдем в него, чтобы интегрировать с ним Presto. Для этого мы будем искать его маршрут, чтобы иметь доступ к нему извне:

oc get route 
NAME                                HOST/PORT                                                                 PATH   SERVICES   PORT       TERMINATION   WILDCARD
route.route.openshift.io/superset   superset-openshift-operators.apps.cluster-b601.b601.example.opentlc.com          superset   8088-tcp                 None

Теперь войдите в пользовательский интерфейс Superset с учетными данными admin:admin, если не указано иное.

Перейдите в Базы данных - ›Добавить базу данных и добавьте нашу базу данных учетных записей, расположенную на Presto, в качестве нашей базы данных (вы должны использовать службу Presto ClusterIP, чтобы подключить Suprtset к ней). Наконец, нажмите кнопку Проверить соединение, чтобы убедиться, что все в порядке:

Теперь перейдите в SQL LAb → SQL Editor и начните запрашивать нашу базу данных учетных записей:

Мы можем нажать кнопку Explore, чтобы создать диаграмму и добавить ее на панель инструментов, я создал некоторые заранее, и это выглядит так:

Здесь мы использовали таблицу счетов от Presto и создали несколько панелей управления бизнес-аналитикой, которые подходят и полезны для нашего бизнеса. Это может значительно улучшить процесс принятия решений.

Большой! Мы только что создали нашу первую работу в области бизнес-аналитики над Openshift!

Заключение

Мы увидели, как мы можем запускать SQL-запросы к службе S3, которые все были расположены в Openshift и предоставлялись полностью управляемыми операторами как часть Openshift Operator Hub. Это позволит снизить TTM и ускорить достижение бизнес-целей, поскольку все это осуществляется на единой платформе - продукты бизнес-аналитики, обработки данных и хранения под одной крышей.

Надеюсь, вам это показалось интересным, увидимся в следующий раз :)