MinIO es un potente backend primario de TileDB porque ambos están diseñados para ofrecer rendimiento y escalabilidad. MinIO es un único binario de Go que se puede iniciar en muchos tipos diferentes de entornos locales y de nube. Es muy liviano, pero también está repleto de funciones como
TileDB se utiliza para almacenar datos en una variedad de aplicaciones, como genómica, geoespacial, imágenes biomédicas, finanzas, aprendizaje automático y más. El poder de TileDB surge del hecho de que cualquier dato se puede modelar de manera eficiente como una matriz multidimensional densa o dispersa, que es el formato utilizado internamente por la mayoría de las herramientas de ciencia de datos. Al almacenar sus datos y metadatos en matrices TileDB, abstrae todos los problemas de almacenamiento y administración de datos, mientras accede de manera eficiente a los datos con su lenguaje de programación o herramienta de ciencia de datos favorito a través de nuestras numerosas API e integraciones.
Profundicemos y creemos algunos datos de prueba usando TileDB.
Instale el módulo pip
TileDB, que también debería instalar la dependencia 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
Cree una matriz de prueba ejecutando el siguiente script de Python, asígnele el 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[:])
Ejecute el script
% python3 tiledb-demo.py [1. 2. 3.]
Esto creará un directorio tiledb_demo
para almacenar los datos reales.
% 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
Puede continuar usándolo tal como está, pero no es bueno si todo es local porque si el disco o nodo local falla, perderá todos sus datos. Hagamos algo divertido, como leer estos mismos datos de un depósito MinIO.
Comenzaremos incorporando mc a nuestro ecosistema acoplable y luego usaremos play.min.io para crear el depósito.
Extraer la imagen de mc docker
% docker pull minio/mc
Pruebe con MinIO Play enumerando todos los depósitos
% docker run minio/mc ls play [LONG TRUNCATED LIST OF BUCKETS]
Cree un depósito al que mover nuestros datos locales de TileDB, asígnele el tiledb-demo
.
% docker run minio/mc mb play/tiledb-demo Bucket created successfully `play/tiledb-demo`.
Copie el contenido del directorio de tiledb_demo
al depósito 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
Enumere el contenido tiledb-demo
para asegurarse de que los datos se hayan copiado.
% 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/
Nota: El cliente MinIO ( mc
), o cualquier cliente compatible con S3, solo copia carpetas que no están vacías. La razón de esto es que en el mundo del almacenamiento de objetos los datos se organizan en función de prefijos de depósitos, por lo que no se necesitan carpetas que no estén vacías. En un blog futuro profundizaremos en cómo se organizan los datos con prefijos y carpetas. Por lo tanto, verás sólo estas 3 carpetas y no el resto que vimos en la carpeta local.
Ahora intentemos leer los mismos datos directamente desde el depósito MinIO usando el código Python a continuación, nombre el archivo 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 salida debería parecer familiar.
% python3 tiledb-minio-demo.py [1. 2. 3.]
Hemos leído sobre MinIO, a continuación veamos cómo podemos escribir los datos directamente en un depósito de MinIO, en lugar de copiarlos a MinIO desde una fuente existente.
Hasta ahora le hemos mostrado cómo leer datos que ya existen, ya sea en el almacenamiento local o en un depósito existente. Pero si quisieras empezar de nuevo escribiendo directamente en MinIO desde el principio, ¿cómo funcionaría? Vamos a ver.
El código para escribir datos directamente en el depósito MinIO es el mismo que el anterior, excepto con dos cambios de línea.
La ruta al depósito MinIO donde se almacenan los datos de TileDB debe actualizarse tiledb_minio_demo
(en lugar tiledb_demo
).
Usaremos la tiledb.from_numpy
, como hicimos anteriormente con el almacenamiento local, para crear la matriz que se almacenará en el depósito 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]
Después de realizar estos 2 cambios, ejecute el script y debería ver el resultado a continuación
% python3 tiledb-minio-demo.py [1. 2. 3.]
Si ejecuta el script nuevamente, fallará con el siguiente error porque intentará escribir nuevamente.
tiledb.cc.TileDBError: [TileDB::StorageManager] Error: Cannot create array; Array 's3://tiledb-demo/tiledb_minio_demo/' already exists
Simplemente comente la siguiente línea y podrá volver a ejecutarla varias veces.
# 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.]
Verifique el depósito de MinIO Play para asegurarse de que los datos estén allí como se esperaba
% 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/
Ahí lo tienes, introducir datos en MinIO es así de simple. ¿Obtuviste los mismos resultados que antes? Deberías haberlo hecho, pero si no lo hiciste, hay algunas cosas que puedes consultar.
Veremos algunos errores comunes que puede encontrar al intentar leer/escribir en MinIO.
Si su clave de acceso y clave secreta son incorrectas, debería esperar ver un mensaje de error como el siguiente
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.
A continuación, debe asegurarse de que el nombre de host y el puerto sean correctos; sin un punto final adecuado, estos son los errores que encontrará.
Nombre de host incorrecto:
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't resolve host name
Puerto incorrecto:
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't connect to server
Por último, pero no menos importante, uno de los errores más crípticos que he visto es el siguiente
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
Después de un montón de depuración, resulta que si se está conectando mediante http pero el servidor MinIO tiene TLS activado, verá el error anterior. Solo asegúrese de que el esquema de conexión tenga la configuración correcta; en este caso, config["vfs.s3.scheme"] = "https".
Hay una canción de rap (puedes buscarla) en la que rapean sobre tener montones y montones de montones de * tos* dinero en efectivo. Pero hay otra canción de rap en la que afirman que tienen tantos fajos de dinero en efectivo que ya no se les puede llamar “pilas”, sino que ahora son “bastidores”. Esencialmente, cuando sus pilas se vuelven tan grandes y tan altas, necesita estantes sobre estantes para almacenar sus fajos de efectivo.
Esta es una comparación adecuada porque sus montones de datos significan tanto (o más) para usted como los montones de dinero en efectivo sobre los que hablan. Si tan solo existiera algo como MinIO para mantener todos sus objetos (físicos o virtuales) seguros y fácilmente accesibles.
Con MinIO en la mezcla, puedes escalar fácilmente TileDB a
Hemos agregado los fragmentos de código utilizados en este blog a un
También aparece aquí .