paint-brush
Boostez le moteur TileDB avec MinIOby@minio
26,371
26,371

Boostez le moteur TileDB avec MinIO

MinIO7m2024/03/21
Read on Terminal Reader

MinIO constitue un puissant backend TileDB principal, car les deux sont conçus pour les performances et l'évolutivité.
featured image - Boostez le moteur TileDB avec MinIO
MinIO HackerNoon profile picture


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 réplication et chiffrement , et il fournit intégrations avec diverses applications. MinIO est le compagnon idéal de TileDB en raison de ses performances et de son évolutivité de pointe. MinIO est capable d'énormes performances – nous l'avons comparé à 325 Gio/s (349 Go/s) sur les GET et 165 Gio/s (177 Go/s) sur les PUT avec seulement 32 nœuds de SSD NVMe disponibles dans le commerce – et est utilisé pour créer des lacs/lacs de données avec des charges de travail d’analyse et d’IA/ML.


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.

Configurer TileDB

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.

Migration de données vers le 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.

Écrire directement dans le compartiment MinIO

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.

Pièges courants

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".

Racks sur racks sur racks

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 plusieurs racks dans plusieurs centres de données avec une relative facilité. Vous bénéficiez également de toutes les fonctionnalités qui rendent MinIO génial, comme Sécurité et contrôle d'accès , Hiérarchisation , Verrouillage et conservation des objets , Service de chiffrement de clé (KES) , entre autres dès la sortie de la boîte. En ayant toutes vos données dans MinIO, vous réduisez la complexité de stockage requise et réalisez donc des économies considérables sur les coûts de stockage de données, tout en exécutant MinIO sur du matériel standard offrant le meilleur rapport performance/coût possible. MinIO suralimente votre moteur TileDB avec des performances de pointe qui font des requêtes un véritable plaisir.


Nous avons ajouté les extraits de code utilisés dans ce blog à un dépôt git . Si vous avez des questions sur la façon de connecter MinIO à TileDB ou de migrer des données vers MinIO, assurez-vous de nous contacter au Mou !


Apparaît également ici .