Trino ist eine Open-Source verteilte SQL-Abfrage-Engine, die entwickelt wurde, um große Datenmengen zu analysieren, die über eine oder mehrere heterogene Datenquellen verteilt sind. Trino wurde entwickelt, um Datenbank- und ETL-Anwendungen sowie interaktive Analysen für große Datenmengen und Berichtserstellung zu handhaben.
Alluxio ist eine Open-Source Datenorchestrierungsplattform für groß angelegte Analysen und KI. Alluxio befindet sich zwischen Berechnungsframeworks wie Trino und Apache Spark und verschiedenen Speichersystemen wie Amazon S3, Google Cloud Storage, HDFS und MinIO.
Dies ist ein Tutorial zur Bereitstellung von Alluxio als Caching-Schicht für Trino mit dem Iceberg-Connector.
Warum benötigen wir Caching für Trino?
A small fraction of the petabytes of data you store is generating business value at any given time. Repeatedly scanning the same data and transferring it over the network consumes time, compute cycles, and resources. This issue is compounded when pulling data from disparate Trino clusters across regions or clouds. In these circumstances, caching solutions can significantly reduce the latency and cost of your queries.
Trino verfügt über einen integrierten Caching-Engine namens Rubix in seinem Hive-Connector. Während dieses System bequem ist, da es mit Trino geliefert wird, ist es auf den Hive-Connector beschränkt und wurde seit 2020 nicht mehr gepflegt. Es fehlen auch Sicherheitsfeatures und Unterstützung für zusätzliche Berechnungs-Engines.
Trino mit Alluxio
Alluxio verbindet Trino mit verschiedenen Speichersystemen und bietet APIs sowie einen einheitlichen Namensraum für datengetriebene Anwendungen. Alluxio ermöglicht Trino den Zugriff auf Daten unabhängig von der Datenquelle und transparentes Caching häufig genutzter Daten (z.B. häufig verwendete Tabellen) in Alluxio verteiltes Speicher.
Verwenden von Alluxio Caching über den Iceberg-Connector über MinIO Dateispeicher
Wir haben eine Demo erstellt, die zeigt, wie Alluxio so konfiguriert wird, dass es Write-Through Caching mit MinIO verwendet. Dies wird erreicht, indem der Iceberg-Connector verwendet und eine einzelne Änderung der Standorteigenschaft in der Tabelle aus der Trino-Perspektive vorgenommen wird.
In dieser Demo wird Alluxio auf separaten Servern ausgeführt; es wird jedoch empfohlen, es auf den gleichen Knoten wie Trino zu betreiben. Dies bedeutet, dass alle Konfigurationen für Alluxio auf den Servern vorliegen, auf denen Alluxio läuft, während die Konfiguration von Trino unberührt bleibt. Der Vorteil, Alluxio extern zu betreiben, ist, dass es nicht um Ressourcen mit Trino konkurriert, aber der Nachteil ist, dass Daten über das Netzwerk übertragen werden müssen, wenn aus Alluxio gelesen wird. Es ist für die Leistung entscheidend, dass Trino und Alluxio im gleichen Netzwerk sind.
Um dieser Demo zu folgen, kopieren Sie den Code, der hier zu finden ist.
Trino-Konfiguration
Trino ist identisch mit einer Standard-Iceberg-Konfiguration konfiguriert. Da Alluxio extern zu Trino läuft, ist die einzige erforderliche Konfiguration bei der Abfragezeit und nicht bei der Startzeit.
Alluxio-Konfiguration
Die Konfiguration für Alluxio kann mithilfe der Datei alluxio-site.properties
festgelegt werden. Um alle Konfigurationen im docker-compose.yml
zusammenzulegen, setzen wir sie mithilfe von Java-Eigenschaften über die Umgebungsvariable ALLUXIO_JAVA_OPTS
. In dieser Anleitung bezeichnen wir den Master-Knoten als Leader und die Worker als Follower.
Master-Konfigurationen
alluxio.master.mount.table.root.ufs=s3://alluxio/
Der Leader bietet Ports 19998
und 19999
frei, wobei Letzterer der Port für die Web-UI ist.
Worker-Konfigurationen
alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower
Der Follower öffnet Ports 29999
und 30000
und richtet einen gemeinsam genutzten Speicher ein, der von Alluxio zum Speichern von Daten verwendet wird. Dieser ist auf 1G
mithilfe der Eigenschaft shm_size
eingestellt und wird aus der Eigenschaft alluxio.worker.ramdisk.size
referenziert.
Gemeinsame Konfigurationen zwischen Leader und Follower
alluxio.master.hostname=alluxio-leader
# Minio-Konfigurationen
alluxio.underfs.s3.endpoint=http://minio:9000
alluxio.underfs.s3.disable.dns.buckets=true
alluxio.underfs.s3.inherit.acl=false
aws.accessKeyId=minio
aws.secretKey=minio123
# Demo-spezifische Konfigurationen
alluxio.security.authorization.permission.enabled=false
Das `alluxio.master.hostname
` muss auf allen Knoten, sowohl auf den Führungsknoten als auch auf den Folgeknoten, vorhanden sein. Die meisten geteilten Konfigurationen verweisen Alluxio auf das `underfs
`, in diesem Fall also MinIO. `
`Das `alluxio.security.authorization.permission.enabled
` ist auf „false“ gesetzt, um die Docker-Einrichtung einfach zu halten. `
` `Hinweis:`Dies wird für eine Produktionsumgebung oder eine CI/CD-Umgebung nicht empfohlen. `
` ``Dienste starten `
`Zunächst sollten Sie die Dienste starten. Stellen Sie sicher, dass Sie sich im Verzeichnis `trino-getting-started/iceberg/trino-alluxio-iceberg-minio
` befinden. Führen Sie nun folgenden Befehl aus: `
docker-compose up -d
`Sie sollten folgende Ausgabe erwarten. Docker muss möglicherweise die Docker-Images herunterladen, bevor Sie die „Created/Started“-Nachrichten sehen, sodass zusätzliche Ausgaben auftreten können: `
[+] Running 10/10
⠿ Network trino-alluxio-iceberg-minio_trino-network Created 0.0s
⠿ Volume "trino-alluxio-iceberg-minio_minio-data" Created 0.0s
⠿ Container trino-alluxio-iceberg-minio-mariadb-1 Started 0.6s
⠿ Container trino-alluxio-iceberg-minio-trino-coordinator-1 Started 0.7s
⠿ Container trino-alluxio-iceberg-minio-alluxio-leader-1 Started 0.9s
⠿ Container minio Started 0.8s
⠿ Container trino-alluxio-iceberg-minio-alluxio-follower-1 Started 1.5s
⠿ Container mc Started 1.4s
⠿ Container trino-alluxio-iceberg-minio-hive-metastore-1 Started
` ``Trino CLI öffnen `
`Sobald dies abgeschlossen ist, können Sie sich auf dem Trino-Koordinatorknoten anmelden. Wir werden dies tun, indem wir den `exec
`-Befehl verwenden und das `trino
` CLI-Executable als den Befehl ausführen, den wir auf diesem Container ausführen. Beachten Sie, dass die Container-ID `trino-alluxio-iceberg-minio-trino-coordinator-1
` lautet, also der auszuführende Befehl ist:
<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio
Wenn Sie mit diesem Schritt beginnen, sollten Sie nach Abschluss des Starts den trino
Cursor sehen. Es sollte so aussehen, wenn es fertig ist:
trino>
Um am besten zu verstehen, wie diese Konfiguration funktioniert, erstellen wir eine Iceberg-Tabelle unter Verwendung einer CTAS (CREATE TABLE AS)-Abfrage, die Daten von einem der TPC-Connectoren in Iceberg pusht, das auf MinIO zeigt. Die TPC-Connectoren generieren Daten in Echtzeit, damit wir einfache Tests wie diesen durchführen können.
Führen Sie zunächst einen Befehl aus, um die Kataloge anzuzeigen, um die tpch
und iceberg
Kataloge zu sehen, da diese in der CTAS-Abfrage verwendet werden:
SHOW CATALOGS;
Sie sollten feststellen, dass der Iceberg-Katalog registriert ist.
MinIO Buckets und Trino Schemas
Beim Start wird der folgende Befehl in einem Initialisierungscontainer ausgeführt, der die mc
CLI für MinIO enthält. Dies erstellt einen Bucket in MinIO namens /alluxio
, der uns einen Speicherort zum Schreiben unserer Daten bietet und wir können Trino sagen, wo es zu finden ist:
/bin/sh -c "
until (/usr/bin/mc config host add minio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/alluxio;
/usr/bin/mc mb minio/alluxio;
/usr/bin/mc policy set public minio/alluxio;
exit 0;
"
Hinweis: Dieser Bucket wird als Mountpunkt für Alluxio fungieren, so wird das Schemadirectory alluxio://lakehouse/
in Alluxio auf s3://alluxio/lakehouse/
abgebildet.
Abfragen in Trino
Lassen Sie uns nun das SCHEMA
erstellen, das uns zum Bucket in MinIO zeigt, und dann unsere CTAS-Abfrage ausführen. Kehren Sie in der Shell zum Erstellen des iceberg.lakehouse
SCHEMA
zurück. Dies ist der erste Aufruf beim Metastore, um den Speicherort des Schemas im Alluxio-Namensraum zu speichern. Beachten Sie, dass wir den Hostnamen alluxio-leader
und den Port 19998
angeben müssen, da wir Alluxio nicht als Standarddateisystem festgelegt haben. Berücksichtigen Sie dies, wenn Sie möchten, dass Alluxio-Caching die Standardnutzung ist und für Benutzer, die DDL-Anweisungen verwalten, transparent ist:
CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');
Nun, da wir ein SCHEMA
haben, das auf den Bucket verweist, in dem wir unsere Tabellen in Alluxio speichern, das mit MinIO synchronisiert, können wir unsere erste Tabelle erstellen.
Optional: Um Ihre Abfragen auszuführen, melden Sie sich bei der Trino UI an und melden Sie sich mit einem beliebigen Benutzernamen an (es spielt keine Rolle, da keine Sicherheit eingerichtet ist).
Verschieben Sie die Kundendaten aus den kleinen generierten TPCH-Daten in MinIO mithilfe einer CTAS-Abfrage. Führen Sie die folgende Abfrage aus, und wenn Sie möchten, beobachten Sie sie bei der Trino UI:
CREATE TABLE iceberg.lakehouse.customer
WITH (
format = 'ORC',
location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
)
AS SELECT * FROM tpch.tiny.customer;
Gehen Sie zur Alluxio UI und zur MinIO UI und durchsuchen Sie die Alluxio- und MinIO-Dateien. Sie sehen nun ein lakehouse
-Verzeichnis, das ein customer
-Verzeichnis enthält, das die von Trino nach Alluxio und von Alluxio nach MinIO geschriebenen Daten enthält.
Nun gibt es eine Tabelle unter Alluxio und MinIO, Sie können diese Daten abfragen, indem Sie Folgendes überprüfen:
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;
Wie stellen wir sicher, dass Trino tatsächlich von Alluxio und nicht von MinIO liest? Lassen Sie uns die Daten in MinIO löschen und die Abfrage erneut ausführen, nur um sicher zu gehen. Sobald Sie diese Daten löschen, sollten Sie immer noch Daten zurückbekommen.
Beenden von Diensten
Sobald Sie dieses Tutorial abgeschlossen haben, können die für diese Übung verwendeten Ressourcen mit dem folgenden Befehl freigegeben werden:
docker-compose down
Schlussfolgerung
An diesem Punkt sollten Sie ein besseres Verständnis von Trino und Alluxio haben, wie man mit der Bereitstellung von Trino und Alluxio beginnt und wie man Alluxio-Caching mit einem Iceberg-Connector und MinIO-Dateispeicher verwendet. Ich hoffe, dass Ihnen dieser Artikel gefallen hat. Stellen Sie sicher, dass Sie diesen Artikel mögen und kommentieren, wenn Sie Fragen haben!
Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes