paint-brush
Laden Sie die TileDB-Engine mit MinIO aufvon@minio
26,371 Lesungen
26,371 Lesungen

Laden Sie die TileDB-Engine mit MinIO auf

von MinIO7m2024/03/21
Read on Terminal Reader

Zu lang; Lesen

MinIO stellt ein leistungsstarkes primäres TileDB-Backend dar, da beide auf Leistung und Skalierbarkeit ausgelegt sind.
featured image - Laden Sie die TileDB-Engine mit MinIO auf
MinIO HackerNoon profile picture


MinIO stellt ein leistungsstarkes primäres TileDB-Backend dar, da beide auf Leistung und Skalierbarkeit ausgelegt sind. MinIO ist eine einzelne Go-Binärdatei, die in vielen verschiedenen Arten von Cloud- und lokalen Umgebungen gestartet werden kann. Es ist sehr leicht, aber auch voller Funktionen wie Reproduzieren Und Verschlüsselung , und es bietet Integrationen mit verschiedenen Anwendungen. MinIO ist aufgrund seiner branchenführenden Leistung und Skalierbarkeit der perfekte Begleiter für TileDB. MinIO ist zu einer enormen Leistung fähig – wir haben es mit 325 GiB/s (349 GB/s) auf GETs und 165 GiB/s (177 GB/s) auf PUTs mit nur 32 Knoten bewertet handelsübliche NVMe-SSDs – und wird zum Aufbau von Data Lakes/Lake Houses mit Analyse- und AI/ML-Workloads verwendet.


TileDB wird zum Speichern von Daten in einer Vielzahl von Anwendungen verwendet, beispielsweise in den Bereichen Genomik, Geodaten, biomedizinische Bildgebung, Finanzen, maschinelles Lernen und mehr. Die Leistungsfähigkeit von TileDB beruht auf der Tatsache, dass alle Daten effizient als dichtes oder spärliches mehrdimensionales Array modelliert werden können, wobei es sich um das Format handelt, das intern von den meisten Data-Science-Tools verwendet wird. Indem Sie Ihre Daten und Metadaten in TileDB-Arrays speichern, abstrahieren Sie alle Probleme bei der Datenspeicherung und -verwaltung und greifen gleichzeitig mit Ihrer bevorzugten Programmiersprache oder Ihrem bevorzugten Data-Science-Tool über unsere zahlreichen APIs und Integrationen effizient auf die Daten zu.

TileDB einrichten

Lassen Sie uns eintauchen und einige Testdaten mit TileDB erstellen.


Installieren Sie das TileDB- pip Modul, das auch die numpy Abhängigkeit installieren sollte.


 % pip3 install tiledb Collecting tiledb Downloading tiledb-0.25.0-cp311-cp311-macosx_11_0_arm64.whl (10.4 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.4/10.4 MB 2.7 MB/s eta 0:00:00 Collecting packaging Downloading packaging-23.2-py3-none-any.whl (53 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.0/53.0 kB 643.1 kB/s eta 0:00:00 Collecting numpy>=1.23.2 Downloading numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl (14.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.0/14.0 MB 2.5 MB/s eta 0:00:00 Installing collected packages: packaging, numpy, tiledb Successfully installed numpy-1.26.3 packaging-23.2 tiledb-0.25.0


Erstellen Sie ein Testarray, indem Sie das folgende Python-Skript ausführen und es tiledb-demo.py nennen.


 import tiledb import numpy as np import os, shutil # Local path array_local = os.path.expanduser("./tiledb_demo") # Create a simple 1D array tiledb.from_numpy(array_local, np.array([1.0, 2.0, 3.0])) # Read the array with tiledb.open(array_local) as A: print(A[:])


Führen Sie das Skript aus

 % python3 tiledb-demo.py [1. 2. 3.]


Dadurch wird ein Verzeichnis namens tiledb_demo erstellt, um die tatsächlichen Daten zu speichern.

 % ls -l tiledb_demo/ total 0 drwxr-xr-x 3 aj staff 96 Jan 31 05:27 __commits drwxr-xr-x 2 aj staff 64 Jan 31 05:27 __fragment_meta drwxr-xr-x 3 aj staff 96 Jan 31 05:27 __fragments drwxr-xr-x 2 aj staff 64 Jan 31 05:27 __labels drwxr-xr-x 2 aj staff 64 Jan 31 05:27 __meta drwxr-xr-x 4 aj staff 128 Jan 31 05:27 __schema


Sie können es weiterhin so verwenden, wie es ist, aber es ist kein Problem, wenn alles lokal ist, denn wenn die lokale Festplatte oder der lokale Knoten ausfällt, verlieren Sie Ihre gesamten Daten. Machen wir etwas Lustiges, wie zum Beispiel das Lesen derselben Daten aus einem MinIO-Bucket.

Daten werden in den MinIO-Bucket migriert

Wir beginnen damit, mc in unser Docker-Ökosystem zu laden und dann play.min.io zum Erstellen des Buckets zu verwenden.


Ziehen Sie das MC-Docker-Image

 % docker pull minio/mc


Testen Sie mit MinIO Play, indem Sie alle Buckets auflisten

 % docker run minio/mc ls play [LONG TRUNCATED LIST OF BUCKETS]


Erstellen Sie einen Bucket, in den unsere lokalen TileDB-Daten verschoben werden sollen, und nennen Sie ihn tiledb-demo .

 % docker run minio/mc mb play/tiledb-demo Bucket created successfully `play/tiledb-demo`.


Kopieren Sie den Inhalt des Datenverzeichnisses tiledb_demo “ in den MinIO-Bucket tiledb-demo


 % docker run -v $(pwd)/tiledb_demo:/tiledb_demo minio/mc cp --recursive /tiledb_demo play/tiledb-demo `/tiledb_demo/__commits/__1706696859767_1706696859767_777455531063403b811b2a2bf79d40e7_21.wrt` -> `play/tiledb-demo/tiledb_demo/__commits/__1706696859767_1706696859767_777455531063403b811b2a2bf79d40e7_21.wrt` `/tiledb_demo/__fragments/__1706696859767_1706696859767_777455531063403b811b2a2bf79d40e7_21/a0.tdb` -> `play/tiledb-demo/tiledb_demo/__fragments/__1706696859767_1706696859767_777455531063403b811b2a2bf79d40e7_21/a0.tdb` `/tiledb_demo/__fragments/__1706696859767_1706696859767_777455531063403b811b2a2bf79d40e7_21/__fragment_metadata.tdb` -> `play/tiledb-demo/tiledb_demo/__fragments/__1706696859767_1706696859767_777455531063403b811b2a2bf79d40e7_21/__fragment_metadata.tdb` `/tiledb_demo/__schema/__1706696859758_1706696859758_74e7040e138a4cca93e34aca1c587108` -> `play/tiledb-demo/tiledb_demo/__schema/__1706696859758_1706696859758_74e7040e138a4cca93e34aca1c587108` Total: 3.24 KiB, Transferred: 3.24 KiB, Speed: 1.10 KiB/s


Listen Sie den Inhalt von tiledb-demo auf, um sicherzustellen, dass die Daten kopiert wurden.


 % docker run minio/mc ls play/tiledb-demo/tiledb_demo [2024-01-15 14:15:57 UTC] 0B __commits/ [2024-01-15 14:15:57 UTC] 0B __fragments/ [2024-01-15 14:15:57 UTC] 0B __schema/


Hinweis: Der MinIO-Client ( mc ) oder jeder S3-kompatible Client kopiert nur nicht leere Ordner. Der Grund dafür ist, dass in der Objektspeicherwelt die Daten auf der Grundlage von Bucket-Präfixen organisiert werden, sodass nicht leere Ordner nicht erforderlich sind. In einem zukünftigen Blog werden wir tiefer darauf eingehen, wie Daten mit Präfixen und Ordnern organisiert werden. Daher sehen Sie nur diese drei Ordner und nicht den Rest, den wir im lokalen Ordner gesehen haben.


Versuchen wir nun, dieselben Daten mithilfe des folgenden Python-Codes direkt aus dem MinIO-Bucket zu lesen. Benennen Sie die Datei tiledb-minio-demo.py .


 import tiledb import numpy as np # MinIO keys minio_key = "minioadmin" minio_secret = "minioadmin" # The configuration object with MinIO keys config = tiledb.Config() config["vfs.s3.aws_access_key_id"] = minio_key config["vfs.s3.aws_secret_access_key"] = minio_secret config["vfs.s3.scheme"] = "https" config["vfs.s3.region"] = "" config["vfs.s3.endpoint_override"] = "play.min.io:9000" config["vfs.s3.use_virtual_addressing"] = "false" # Create TileDB config context ctx = tiledb.Ctx(config) # The MinIO bucket URI path of tiledb demo array_minio = "s3://tiledb-demo/tiledb_demo/" with tiledb.open(array_minio, ctx=tiledb.Ctx(config)) as A: print(A[:])


Die Ausgabe sollte Ihnen bekannt vorkommen

 % python3 tiledb-minio-demo.py [1. 2. 3.]


Wir haben aus MinIO gelesen. Als nächstes wollen wir sehen, wie wir die Daten direkt in einen MinIO-Bucket schreiben können, anstatt sie aus einer vorhandenen Quelle nach MinIO zu kopieren.

Direkt in den MinIO-Bucket schreiben

Bisher haben wir Ihnen gezeigt, wie Sie bereits vorhandene Daten lesen, entweder im lokalen Speicher oder in einem vorhandenen Bucket. Aber wenn Sie von Anfang an direkt in MinIO schreiben wollten, wie würde das funktionieren? Lass uns einen Blick darauf werfen.


Der Code zum direkten Schreiben von Daten in den MinIO-Bucket ist derselbe wie oben, mit Ausnahme von zwei Zeilenänderungen.


Der Pfad zum MinIO-Bucket, in dem TileDB-Daten gespeichert sind, muss auf tiledb_minio_demo “ (anstelle von tiledb_demo ) aktualisiert werden.


Wir verwenden die Funktion tiledb.from_numpy “, wie wir es zuvor beim lokalen Speicher getan haben, um das Array zu erstellen, das im MinIO-Bucket gespeichert werden soll.


 [TRUNCATED] # The MinIO bucket URI path of tiledb demo array_minio = "s3://tiledb-demo/tiledb_minio_demo/" tiledb.from_numpy(array_minio, np.array([1.0, 2.0, 3.0]), ctx=tiledb.Ctx(config)) [TRUNCATED]


Nachdem Sie diese beiden Änderungen vorgenommen haben, führen Sie das Skript aus und Sie sollten die folgende Ausgabe sehen

 % python3 tiledb-minio-demo.py [1. 2. 3.]


Wenn Sie das Skript erneut ausführen, schlägt es mit der folgenden Fehlermeldung fehl, da erneut versucht wird, zu schreiben.

 tiledb.cc.TileDBError: [TileDB::StorageManager] Error: Cannot create array; Array 's3://tiledb-demo/tiledb_minio_demo/' already exists


Kommentieren Sie einfach die folgende Zeile aus und Sie können sie mehrmals erneut ausführen.

 # tiledb.from_numpy(array_minio, np.array([1.0, 2.0, 3.0]), ctx=tiledb.Ctx(config))


 % python3 tiledb-minio-demo.py [1. 2. 3.] % python3 tiledb-minio-demo.py [1. 2. 3.]


Überprüfen Sie den MinIO Play-Bucket, um sicherzustellen, dass die Daten wie erwartet vorhanden sind


 % docker run minio/mc ls play/tiledb-demo/tiledb_minio_demo/ [2024-01-15 16:45:04 UTC] 0B __commits/ [2024-01-15 16:45:04 UTC] 0B __fragments/ [2024-01-15 16:45:04 UTC] 0B __schema/


So einfach ist es, Daten in MinIO zu importieren. Haben Sie die gleichen Ergebnisse wie zuvor erhalten? Das hätten Sie tun sollen, aber wenn Sie es nicht getan haben, gibt es ein paar Dinge, die Sie überprüfen können.

Häufige Fehler

Wir werden uns einige häufige Fehler ansehen, die beim Lesen/Schreiben in MinIO auftreten können.


Wenn Ihr Zugangsschlüssel und Ihr geheimer Schlüssel falsch sind, sollten Sie damit rechnen, dass eine Fehlermeldung wie unten angezeigt wird


 tiledb.cc.TileDBError: [TileDB::S3] Error: Error while listing with prefix 's3://tiledb-demo/tiledb_minio_demo/__schema/'... The request signature we calculated does not match the signature you provided. Check your key and signing method.


Als Nächstes müssen Sie sicherstellen, dass der Hostname und der Port korrekt sind. Ohne einen geeigneten Endpunkt würden diese Fehler auftreten.


Falscher Hostname:

 tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't resolve host name


Falscher Port:

 tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't connect to server


Zu guter Letzt ist einer der kryptischsten Fehler, die ich je gesehen habe, der folgende

 tiledb.cc.TileDBError: [TileDB::S3] Error: … [HTTP Response Code: -1] [Remote IP: 98.44.32.5] : curlCode: 56, Failure when receiving data from the peer


Nach einer Menge Debugging stellt sich heraus, dass der obige Fehler angezeigt wird, wenn Sie eine Verbindung über http herstellen, auf dem MinIO-Server jedoch TLS aktiviert ist. Stellen Sie einfach sicher, dass das Verbindungsschema auf die richtige Konfiguration eingestellt ist, in diesem Fall config["vfs.s3.scheme"] = "https".

Racks auf Racks auf Racks

Es gibt einen Rap-Song (Sie können danach suchen), in dem es darum geht, Stapel über Stapel über Stapel von * hüstel* -Geld zu haben. Aber es gibt einen anderen Rap-Song, in dem sie behaupten, sie hätten so viele Stapel Bargeld, dass man sie nicht mehr „Stapel“ nennen könne, sondern jetzt „Racks“. Wenn Ihre Stapel so groß und hoch werden, brauchen Sie im Wesentlichen Regale auf Regalen auf Regalen, um Ihre Bargeldstapel aufzubewahren.


Das ist ein passender Vergleich, denn Ihre Datenbestände bedeuten Ihnen genauso viel (oder mehr) wie die Geldbestände, über die sie reden. Wenn es nur so etwas wie MinIO gäbe, um alle Ihre Objekte – physisch oder virtuell – sicher und leicht zugänglich aufzubewahren.


Mit MinIO im Mix können Sie TileDB problemlos skalieren mehrere Racks in mehreren Rechenzentren mit relativer Leichtigkeit. Sie erhalten außerdem alle Funktionen, die MinIO so großartig machen Sicherheit und Zugangskontrolle , Abstufung , Objektsperrung und -aufbewahrung , Schlüsselverschlüsselungsdienst (KES) , unter anderem direkt aus der Box. Indem Sie alle Ihre Daten in MinIO speichern, verringern Sie die erforderliche Speicherkomplexität und erzielen somit erhebliche Einsparungen bei den Datenspeicherkosten, während gleichzeitig die Ausführung von MinIO auf handelsüblicher Hardware das bestmögliche Leistungs-Kosten-Verhältnis bietet. MinIO steigert Ihre TileDB-Engine mit branchenführender Leistung, die das Abfragen zum Vergnügen macht.


Wir haben die in diesem Blog verwendeten Codeausschnitte zu a hinzugefügt Git-Repository . Wenn Sie Fragen dazu haben, wie Sie MinIO mit TileDB verbinden oder Daten in MinIO migrieren, wenden Sie sich bitte an uns Locker !


Erscheint auch hier .