Що таке Trino?
Trino — це розподілений механізм запитів, який обробляє дані паралельно на кількох серверах. Існує два типи серверів Trino: координатори та робітники. Наступні розділи описують ці сервери та інші компоненти архітектури Trino.
Що таке Apache Superset?
Apache Superset — це сучасний веб-додаток для бізнес-аналітики, готовий до використання на підприємствах. Він швидкий, легкий, інтуїтивно зрозумілий і має безліч налаштувань, які дозволяють користувачам з будь-яким рівнем навичок легко досліджувати та візуалізувати свої дані, від простих кругових діаграм до детальних геопросторових графіків на deck.gl.
Для цього проекту я використовував такі бази даних як бекенди для Trino.
- Mysql — Inventory
- Mysql — Petclinic
- Mongodb Atlas
Я налаштував Trino та Superset для отримання даних з вищезазначених баз даних.
Налаштування баз даних:
1. Mysql — Inventory
Використовуйте наступний Yaml для створення тестової бази даних для інвентаризації:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-inventory
spec:
selector:
matchLabels:
app: mysql-inventory
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql-inventory
spec:
containers:
- image: quay.io/debezium/example-mysql:2.4
name: mysql-inventory
env:
- name: MYSQL_ROOT_PASSWORD
value: rootpass
- name: MYSQL_USER
value: mysqluser
- name: MYSQL_PASSWORD
value: mysqlpw
ports:
- containerPort: 3306
name: mysql-inventory
---
apiVersion: v1
kind: Service
metadata:
name: mysql-inventory
spec:
ports:
- port: 3306
selector:
app: mysql-inventory
clusterIP: None
Використовуйте наступні облікові дані для підключення до бази даних, запустивши команду в pod: petclinic/petclinic
**2.
Mysql2 — Petclinic
Використовуйте наступний Yaml для створення тестової бази даних для Petclinic:
kind: Service
apiVersion: v1
metadata:
name: mysql-petclinic
labels:
app: mysql-petclinic
spec:
ports:
- name: 3306-tcp
protocol: TCP
port: 3306
targetPort: 3306
- name: 33060-tcp
protocol: TCP
port: 33060
targetPort: 33060
internalTrafficPolicy: Cluster
type: ClusterIP
ipFamilyPolicy: SingleStack
sessionAffinity: None
selector:
app: mysql-petclinic
deployment: mysql-petclinic
---
apiVersion: v1
data:
init.sql: |
CREATE TABLE IF NOT EXISTS vets (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(30),
last_name VARCHAR(30),
INDEX(last_name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS specialties (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(80),
INDEX(name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS vet_specialties (
vet_id INT(4) UNSIGNED NOT NULL,
specialty_id INT(4) UNSIGNED NOT NULL,
FOREIGN KEY (vet_id) REFERENCES vets(id),
FOREIGN KEY (specialty_id) REFERENCES specialties(id),
UNIQUE (vet_id,specialty_id)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS types (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(80),
INDEX(name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS owners (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(30),
last_name VARCHAR(30),
address VARCHAR(255),
city VARCHAR(80),
telephone VARCHAR(20),
INDEX(last_name)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS pets (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30),
birth_date DATE,
type_id INT(4) UNSIGNED NOT NULL,
owner_id INT(4) UNSIGNED NOT NULL,
INDEX(name),
FOREIGN KEY (owner_id) REFERENCES owners(id),
FOREIGN KEY (type_id) REFERENCES types(id)
) engine=InnoDB;
CREATE TABLE IF NOT EXISTS visits (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
pet_id INT(4) UNSIGNED NOT NULL,
visit_date DATE,
description VARCHAR(255),
FOREIGN KEY (pet_id) REFERENCES pets(id)
) engine=InnoDB;
INSERT IGNORE INTO vets VALUES (1, 'James', 'Carter');
INSERT IGNORE INTO vets VALUES (2, 'Helen', 'Leary');
INSERT IGNORE INTO vets VALUES (3, 'Linda', 'Douglas');
INSERT IGNORE INTO vets VALUES (4, 'Rafael', 'Ortega');
INSERT IGNORE INTO vets VALUES (5, 'Henry', 'Stevens');
INSERT IGNORE INTO vets VALUES (6, 'Sharon', 'Jenkins');
INSERT IGNORE INTO specialties VALUES (1, 'radiology');
INSERT IGNORE INTO specialties VALUES (2, 'surgery');
INSERT IGNORE INTO specialties VALUES (3, 'dentistry');
INSERT IGNORE INTO vet_specialties VALUES (2, 1);
INSERT IGNORE INTO vet_specialties VALUES (3, 2);
INSERT IGNORE INTO vet_specialties VALUES (3, 3);
INSERT IGNORE INTO vet_specialties VALUES (4, 2);
INSERT IGNORE INTO vet_specialties VALUES (5, 1);
INSERT IGNORE INTO types VALUES (1, 'cat');
INSERT IGNORE INTO types VALUES (2, 'dog');
INSERT IGNORE INTO types VALUES (3, 'lizard');
INSERT IGNORE INTO types VALUES (4, 'snake');
INSERT IGNORE INTO types VALUES (5, 'bird');
INSERT IGNORE INTO types VALUES (6, 'hamster');
INSERT IGNORE INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
INSERT IGNORE INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
INSERT IGNORE INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
INSERT IGNORE INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
INSERT IGNORE INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S.
Вставка 'Fair Way', 'Madison', '6085552765');
INSERT IGNORE INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
INSERT IGNORE INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
INSERT IGNORE INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
INSERT IGNORE INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
INSERT IGNORE INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
INSERT IGNORE INTO owners VALUES (11, 'Burr', 'Sutter', '123 ABC Lane', 'Wonderland', '5555555555');
INSERT IGNORE INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1);
INSERT IGNORE INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2);
INSERT IGNORE INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3);
INSERT IGNORE INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3);
INSERT IGNORE INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4);
INSERT IGNORE INTO pets VALUES (6, 'George', '2000-01-20', 4, 5);
INSERT IGNORE INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6);
INSERT IGNORE INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6);
INSERT IGNORE INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7);
INSERT IGNORE INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8);
INSERT IGNORE INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9);
INSERT IGNORE INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10);
INSERT IGNORE INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10);
INSERT IGNORE INTO visits VALUES (1, 7, '2010-03-04', 'rabies shot');
INSERT IGNORE INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot');
INSERT IGNORE INTO visits VALUES (3, 8, '2009-06-04', 'neutered');
INSERT IGNORE INTO visits VALUES (4, 7, '2008-09-04', 'spayed');
immutable: false
kind: ConfigMap
metadata:
name: mysql-db-init
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql-petclinic
name: mysql-petclinic
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: mysql-petclinic
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: mysql-petclinic
deployment: mysql-petclinic
spec:
containers:
- env:
- name: MYSQL_USER
value: petclinic
- name: MYSQL_PASSWORD
value: petclinic
- name: MYSQL_ROOT_PASSWORD
value: petclinic
- name: MYSQL_DATABASE
value: petclinic
image: 'docker.io/mysql:latest'
imagePullPolicy: Always
name: mysql-petclinic
ports:
- containerPort: 3306
protocol: TCP
- containerPort: 33060
protocol: TCP
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-1
- mountPath: /docker-entrypoint-initdb.d
name: mysql-db-init
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
volumes:
- name: mysql-1
- configMap:
defaultMode: 493
name: mysql-db-init
name: mysql-db-init
Використовуйте наступні облікові дані для підключення до бази даних, запустивши команду в pod: mysqluser/mysqlpw
3. Mongo
Скоро буде!!
4. Postgres
Скоро буде!!
Налаштування Trino на Minikube:
- Додати репозиторій Helm
$ helm repo add trino https://trinodb.github.io/charts
- Встановіть Trino за допомогою helm chart
$ helm install example-trino-cluster trino/trino
- Перевірте Pods
Оновіть Config Map [example-trino-cluster-catalog] для Trino:
data:
mongo.properties: |
connector.name=mongodb
mongodb.connection-url=mongodb+srv://user:[email protected]/
mysqlinventory.properties: |
connector.name=mysql
connection-url=jdbc:mysql://mysql-inventory:3306
connection-user=mysqluser
connection-password=mysqlpw
mysqlpetclinic.properties: |
connector.name=mysql
connection-url=jdbc:mysql://mysql-petclinic:3306
connection-user=petclinic
connection-password=petclinic
tpcds.properties: |
connector.name=tpcds
tpcds.splits-per-node=4
tpch.properties: |
connector.name=tpch
tpch.splits-per-node=4
- Перезапустіть деплойменти для Trino
$ kubectl rollout restart -n trino-superset deployment example-trino-cluster-coordinator
- Порт-форвардинг для Trino CLI, щоб він міг слухати кластер Trino.
$ PODNAME=$(kubectl -n trino-superset get pods -o NAME| grep coordinator)
$ kubectl -n trino-superset port-forward $POD_NAME 8080:8080
-
Завантажте trino-cli з наступного місця.
-
Java-додаток надасть доступ до trino-cli, запустіть запити, використовуючи контекст і назву каталогу.
Налаштування Superset:
- Додайте репозиторій helm для Superset
$ helm repo add superset https://apache.github.io/superset
"superset" був доданий до ваших репозиторіїв
- Встановіть Superset за допомогою helm та custom values.yaml з бібліотекою sqlalchemy
Використовуйте наступний файл values.yaml для конфігурації бібліотеки sqlalchemy для Trino
bootstrapScript: |
#!/bin/bash
pip install sqlalchemy-trino &&\
if [! -f ~/bootstrap]; then echo "Running Superset with uid {{
.Values.runAsUser }}" > ~/bootstrap; fi
$ helm upgrade --install --values values.yaml superset superset/superset
- Порт-форвардинг для Trino CLI, щоб він міг слухати кластер Trino.
$ kubectl port-forward service/superset 8088:8088 --namespace superset
-
Увійдіть у Superset з наступними обліковими даними: admin / admin
-
Створіть з'єднання Trino в Superset
Перейдіть до Налаштування > Підключення до баз даних і натисніть на +Іконка бази даних для створення нового підключення до бази даних
Використовуйте наступний рядок підключення [відредагуйте його відповідно]:
trino://[email protected]:8080
- Запускайте запити до ваших баз даних через інтерфейс Superset.
Перейдіть до Sql Lab в верхньому меню та запускайте ваші SQL запити.
Використовуйте команди для отримання результатів з кількох баз даних.
SELECT * from mysqlinventory.inventory.customers;
SELECT * from mysqlpetclinic.petclinic.owners;
SELECT * from mongo.sample_mflix.users where name like "%Stark%";
Перекладено з: [How to Setup Trino and Superset on Minikube ?](https://medium.com/@vishnoiabhishek1/how-to-setup-trino-and-superset-on-minikube-6990e0521ae8)