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
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.
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.
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.
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.
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".
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
Wir haben die in diesem Blog verwendeten Codeausschnitte zu a hinzugefügt
Erscheint auch hier .