paint-brush
Superalimentar el motor TileDB con MinIOpor@minio
26,371 lecturas
26,371 lecturas

Superalimentar el motor TileDB con MinIO

por MinIO7m2024/03/21
Read on Terminal Reader

Demasiado Largo; Para Leer

MinIO constituye un potente backend principal de TileDB porque ambos están diseñados para ofrecer rendimiento y escalabilidad.
featured image - Superalimentar el motor TileDB con MinIO
MinIO HackerNoon profile picture


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 replicación y cifrado , y proporciona integraciones con diversas aplicaciones. MinIO es el compañero perfecto para TileDB debido a su rendimiento y escalabilidad líderes en la industria. MinIO es capaz de ofrecer un rendimiento tremendo: lo hemos evaluado a 325 GiB/s (349 GB/s) en GET y 165 GiB/s (177 GB/s) en PUT con solo 32 nodos de SSD NVMe disponibles en el mercado – y se utiliza para construir lagos de datos/casas de lagos con análisis y cargas de trabajo de IA/ML.


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.

Configurar TileDB

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.

Migración de datos al 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.

Escribir directamente en el depósito MinIO

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.

Errores comunes

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

Bastidores sobre bastidores sobre bastidores

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 múltiples racks en múltiples centros de datos con relativa facilidad. También obtienes todas las funciones que hacen que MinIO sea excelente, como Seguridad y Control de Acceso , niveles , Bloqueo y retención de objetos , Servicio de cifrado de claves (KES) , entre otros, nada más sacarlo de la caja. Al tener todos sus datos en MinIO, disminuye la complejidad del almacenamiento requerido y, por lo tanto, logra ahorros considerables en los costos de almacenamiento de datos, mientras que al mismo tiempo ejecutar MinIO en hardware básico proporciona la mejor relación posible entre rendimiento y costo. MinIO potencia su motor TileDB con un rendimiento líder en la industria que hace que realizar consultas sea un placer.


Hemos agregado los fragmentos de código utilizados en este blog a un repositorio git . Si tiene alguna pregunta sobre cómo conectar MinIO a TileDB o migrar datos a MinIO, asegúrese de comunicarse con nosotros en Flojo !


También aparece aquí .