paint-brush
Усовершенствуйте движок TileDB с помощью MinIOк@minio
26,413 чтения
26,413 чтения

Усовершенствуйте движок TileDB с помощью MinIO

к MinIO7m2024/03/21
Read on Terminal Reader

Слишком долго; Читать

MinIO представляет собой мощный основной бэкэнд TileDB, поскольку оба созданы для обеспечения производительности и масштабируемости.
featured image - Усовершенствуйте движок TileDB с помощью MinIO
MinIO HackerNoon profile picture


MinIO представляет собой мощный основной бэкэнд TileDB, поскольку оба созданы для обеспечения производительности и масштабируемости. MinIO — это один двоичный файл Go, который можно запускать в различных типах облачных и локальных сред. Он очень легкий, но при этом оснащен такими вещами, как репликация и шифрование , и это обеспечивает интеграции с различными приложениями. MinIO — идеальный компаньон для TileDB благодаря своей лучшей в отрасли производительности и масштабируемости. MinIO обладает потрясающей производительностью: мы протестировали его на уровне 325 ГиБ/с (349 ГБ/с) на GET и 165 ГиБ/с (177 ГБ/с) на PUT всего с 32 узлами готовые твердотельные накопители NVMe – и используется для создания озер/озёрных домов с аналитикой и рабочими нагрузками AI/ML.


TileDB используется для хранения данных в различных приложениях, таких как геномика, геопространственные данные, биомедицинская визуализация, финансы, машинное обучение и другие. Возможности TileDB проистекают из того факта, что любые данные можно эффективно моделировать как в виде плотного, так и разреженного многомерного массива, который является форматом, используемым внутри большинства инструментов обработки данных. Сохраняя ваши данные и метаданные в массивах TileDB, вы избавляетесь от всех проблем с хранением и управлением данными, одновременно эффективно получая доступ к данным с помощью вашего любимого языка программирования или инструмента обработки данных через наши многочисленные API и интеграции.

Настройка TileDB

Давайте углубимся и создадим несколько тестовых данных с помощью TileDB.


Установите модуль pip TileDB, который также должен установить зависимость 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


Создайте тестовый массив, запустив приведенный ниже скрипт Python, назовите его 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[:])


Запустите сценарий

 % python3 tiledb-demo.py [1. 2. 3.]


Это создаст каталог tiledb_demo для хранения фактических данных.

 % 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


Вы можете продолжать использовать его как есть, но это нехорошо, если все локально, потому что в случае сбоя локального диска или узла вы потеряете все свои данные. Давайте вместо этого сделаем что-нибудь интересное, например, прочитаем те же данные из корзины MinIO.

Миграция данных в корзину MinIO

Мы начнем с добавления mc в нашу экосистему докеров, а затем с помощью play.min.io для создания корзины.


Извлеките образ Mc Docker

 % docker pull minio/mc


Протестируйте с помощью MinIO Play, перечислив все сегменты.

 % docker run minio/mc ls play [LONG TRUNCATED LIST OF BUCKETS]


Создайте корзину для перемещения наших локальных данных TileDB, назовите ее tiledb-demo .

 % docker run minio/mc mb play/tiledb-demo Bucket created successfully `play/tiledb-demo`.


Скопируйте содержимое каталога данных tiledb_demo в корзину tiledb-demo MinIO.


 % 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


Перечислите содержимое tiledb-demo , чтобы убедиться, что данные скопированы.


 % 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/


Примечание. Клиент MinIO ( mc ) или любой другой клиент, совместимый с S3, копирует только непустые папки. Причина этого в том, что в мире объектного хранилища данные организованы на основе префиксов сегментов, поэтому непустые папки не нужны. В будущем блоге мы углубимся в то, как данные организованы с помощью префиксов и папок. Следовательно, вы видите только эти 3 папки, а не остальные, которые мы видели в локальной папке.


Теперь давайте попробуем прочитать те же данные непосредственно из корзины MinIO, используя приведенный ниже код Python, назовите файл 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[:])


Вывод должен выглядеть знакомо

 % python3 tiledb-minio-demo.py [1. 2. 3.]


Мы прочитали данные из MinIO, теперь давайте посмотрим, как мы можем записывать данные непосредственно в корзину MinIO, а не копировать их в MinIO из существующего источника.

Запись непосредственно в корзину MinIO

До сих пор мы показали вам, как читать данные, которые уже существуют, либо в локальном хранилище, либо в существующей корзине. Но если бы вы хотели начать все сначала, записывая данные непосредственно в MinIO, как бы это работало? Давайте взглянем.


Код для записи данных непосредственно в корзину MinIO аналогичен приведенному выше, за исключением двух изменений строки.


Путь к корзине MinIO, в которой хранятся данные TileDB, должен быть обновлен до tiledb_minio_demo (вместо tiledb_demo ).


Мы будем использовать функцию tiledb.from_numpy , как мы делали ранее с локальным хранилищем, чтобы создать массив для хранения в корзине 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]


После внесения этих двух изменений запустите скрипт, и вы увидите результат ниже.

 % python3 tiledb-minio-demo.py [1. 2. 3.]


Если вы запустите сценарий еще раз, он завершится ошибкой с приведенной ниже ошибкой, поскольку он попытается записать еще раз.

 tiledb.cc.TileDBError: [TileDB::StorageManager] Error: Cannot create array; Array 's3://tiledb-demo/tiledb_minio_demo/' already exists


Просто закомментируйте следующую строку, и вы сможете запустить ее несколько раз.

 # 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.]


Проверьте корзину MinIO Play, чтобы убедиться, что данные находятся там так, как ожидалось.


 % 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/


Вот и все, перенести данные в MinIO очень просто. Вы получили те же результаты, что и раньше? Вам следовало бы это сделать, но если вы этого не сделали, есть несколько вещей, которые вы можете проверить.

Распространенные ловушки

Мы рассмотрим некоторые распространенные ошибки, с которыми вы можете столкнуться при попытке чтения/записи в MinIO.


Если ваш ключ доступа и секретный ключ неверны, вы должны увидеть сообщение об ошибке, как показано ниже.


 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.


Затем вам необходимо убедиться, что имя хоста и порт верны, без правильной конечной точки вы можете столкнуться с этими ошибками.


Неверное имя хоста:

 tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't resolve host name


Неправильный порт:

 tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't connect to server


И последнее, но не менее важное: одна из самых загадочных ошибок, которые я когда-либо видел, это следующая

 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


После тонны отладки выяснилось, что если вы подключаетесь по http, но на сервере MinIO активирован TLS, вы увидите вышеуказанную ошибку. Просто убедитесь, что схема подключения настроена правильно, в данном случае config["vfs.s3.scheme"] = "https".

Стеллажи на стойках

Есть рэп-песня (можете поискать), где читают о том, что у вас стопки за стопками * кашель* наличных. Но есть еще одна рэп-песня, в которой они утверждают, что у них так много пачек денег, что их больше нельзя называть «пачками», теперь это «стойки». По сути, когда ваши стопки становятся такими большими и высокими, вам нужны стеллажи на стеллажах на стеллажах для хранения стопок наличных.


Это удачное сравнение, потому что ваши стопки данных значат для вас столько же (или больше), сколько и стопки денег, о которых они читают. Если бы только было что-то вроде MinIO, чтобы обеспечить безопасность и легкость доступа ко всем вашим объектам – физическим или виртуальным.


Используя MinIO, вы можете легко масштабировать TileDB до несколько стоек в нескольких центрах обработки данных с относительной легкостью. Вы также получаете все функции, которые делают MinIO отличным, например Безопасность и контроль доступа , Многоуровневое распределение , Блокировка и удержание объектов , Служба шифрования ключей (KES) , среди прочего, прямо из коробки. Размещая все свои данные в MinIO, вы снижаете требуемую сложность хранилища и, следовательно, получаете значительную экономию затрат на хранение данных, в то же время использование MinIO на обычном оборудовании обеспечивает наилучшее соотношение производительности и стоимости. MinIO расширяет возможности вашего движка TileDB, обеспечивая лучшую в отрасли производительность, что превращает запросы в удовольствие.


Мы добавили фрагменты кода, используемые в этом блоге, в Git-репозиторий . Если у вас есть вопросы о том, как подключить MinIO к TileDB или перенести данные в MinIO, обязательно свяжитесь с нами по телефону Слабый !


Также появляется здесь .