MinIO constitue un puissant backend TileDB principal, car les deux sont conçus pour les performances et l'évolutivité. MinIO est un binaire Go unique qui peut être lancé dans de nombreux types différents d'environnements cloud et sur site. Il est très léger, mais il regorge également de fonctionnalités telles que
TileDB est utilisé pour stocker des données dans diverses applications, telles que la génomique, la géospatiale, l'imagerie biomédicale, la finance, l'apprentissage automatique, etc. La puissance de TileDB vient du fait que toutes les données peuvent être modélisées efficacement sous la forme d'un tableau multidimensionnel dense ou clairsemé, format utilisé en interne par la plupart des outils de science des données. En stockant vos données et métadonnées dans des tableaux TileDB, vous éliminez toutes les difficultés de stockage et de gestion des données, tout en accédant efficacement aux données avec votre langage de programmation ou outil de science des données préféré via nos nombreuses API et intégrations.
Plongeons-nous et créons des données de test à l'aide de TileDB.
Installez le module pip
TileDB, qui devrait également installer la dépendance numpy
.
% 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
Créez un tableau de test en exécutant le script Python ci-dessous, nommez-le tiledb-demo.py
.
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[:])
Exécutez le script
% python3 tiledb-demo.py [1. 2. 3.]
Cela créera un répertoire appelé tiledb_demo
pour stocker les données réelles.
% 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
Vous pouvez continuer à l'utiliser tel quel, mais ce n'est pas bon si tout est local, car si le disque ou le nœud local tombe en panne, vous perdez toutes vos données. Faisons quelque chose d'amusant, comme lire ces mêmes données à partir d'un compartiment MinIO.
Nous allons commencer par extraire mc dans notre écosystème Docker, puis utiliser play.min.io pour créer le bucket.
Extraire l'image mc docker
% docker pull minio/mc
Testez avec MinIO Play en listant tous les buckets
% docker run minio/mc ls play [LONG TRUNCATED LIST OF BUCKETS]
Créez un compartiment vers lequel déplacer nos données TileDB locales, nommez-le tiledb-demo
.
% docker run minio/mc mb play/tiledb-demo Bucket created successfully `play/tiledb-demo`.
Copiez le contenu du répertoire de données tiledb_demo
dans le compartiment MinIO 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
Répertoriez le contenu de tiledb-demo
pour vous assurer que les données ont été copiées.
% 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/
Remarque : Le client MinIO ( mc
), ou tout client compatible S3, copie uniquement les dossiers non vides. La raison en est que dans le monde du stockage objet, les données sont organisées en fonction de préfixes de compartiment, de sorte que des dossiers non vides ne sont pas nécessaires. Dans un prochain blog, nous approfondirons la façon dont les données sont organisées avec des préfixes et des dossiers. Par conséquent, vous ne voyez que ces 3 dossiers et pas le reste que nous avons vu dans le dossier local.
Essayons maintenant de lire les mêmes données directement à partir du compartiment MinIO en utilisant le code Python ci-dessous, nommez le fichier 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[:])
La sortie devrait sembler familière
% python3 tiledb-minio-demo.py [1. 2. 3.]
Nous avons lu MinIO, voyons ensuite comment nous pouvons écrire les données directement dans un compartiment MinIO, au lieu de les copier dans MinIO à partir d'une source existante.
Jusqu'à présent, nous vous avons montré comment lire des données qui existent déjà, soit dans le stockage local, soit dans un compartiment existant. Mais si vous vouliez repartir à zéro en écrivant directement sur MinIO dès le départ, comment cela fonctionnerait-il ? Nous allons jeter un coup d'oeil.
Le code pour écrire des données directement dans le compartiment MinIO est le même que ci-dessus, sauf avec deux changements de ligne.
Le chemin d'accès au compartiment MinIO où les données TileDB sont stockées doit être mis à jour vers tiledb_minio_demo
(au lieu de tiledb_demo
).
Nous utiliserons la fonction tiledb.from_numpy
, comme nous l'avons fait précédemment avec le stockage local, pour créer le tableau à stocker dans le compartiment MinIO.
[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]
Après avoir effectué ces 2 modifications, exécutez le script et vous devriez voir le résultat ci-dessous
% python3 tiledb-minio-demo.py [1. 2. 3.]
Si vous exécutez à nouveau le script, il échouera avec l'erreur ci-dessous car il tentera d'écrire à nouveau.
tiledb.cc.TileDBError: [TileDB::StorageManager] Error: Cannot create array; Array 's3://tiledb-demo/tiledb_minio_demo/' already exists
Commentez simplement la ligne suivante et vous pourrez la réexécuter plusieurs fois.
# 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.]
Vérifiez le compartiment MinIO Play pour vous assurer que les données s'y trouvent comme prévu
% 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/
Et voilà, importer des données dans MinIO est aussi simple que cela. Avez-vous obtenu les mêmes résultats que précédemment ? Vous auriez dû, mais si vous ne l’avez pas fait, vous pouvez vérifier certaines choses.
Nous examinerons quelques erreurs courantes que vous pourriez rencontrer en essayant de lire/écrire sur MinIO.
Si votre clé d'accès et votre clé secrète sont incorrectes, vous devriez vous attendre à voir un message d'erreur comme ci-dessous
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.
Ensuite, vous devez vous assurer que le nom d'hôte et le port sont corrects. Sans point de terminaison approprié, ce sont les erreurs que vous rencontreriez.
Nom d'hôte incorrect :
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't resolve host name
Port incorrect :
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't connect to server
Enfin et surtout, l'une des erreurs les plus énigmatiques que j'ai vues est la suivante
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
Après une tonne de débogage, il s'avère que si vous vous connectez via http mais que TLS est activé sur le serveur MinIO, vous verrez l'erreur ci-dessus. Assurez-vous simplement que le schéma de connexion est défini sur la bonne configuration, dans ce cas, config["vfs.s3.scheme"] = "https".
Il y a une chanson de rap (vous pouvez la rechercher) dans laquelle ils rappent sur le fait d'avoir des piles sur des piles sur des piles de * toux* cash. Mais il y a une autre chanson de rap dans laquelle ils prétendent avoir tellement de piles de billets qu'on ne peut plus les appeler des « piles », ils sont maintenant des « racks ». Essentiellement, lorsque vos piles deviennent si grandes et si hautes, vous avez besoin d'étagères sur étagères pour stocker vos piles d'argent.
Il s’agit d’une comparaison pertinente, car vos piles de données comptent autant (ou plus) pour vous que les piles d’argent sur lesquelles elles rappent. Si seulement il existait quelque chose comme MinIO pour garder tous vos objets – physiques ou virtuels – en sécurité et facilement accessibles.
Avec MinIO dans le mix, vous pouvez facilement faire évoluer TileDB vers
Nous avons ajouté les extraits de code utilisés dans ce blog à un
Apparaît également ici .