MinIO, güçlü bir birincil TileDB arka ucu oluşturur çünkü her ikisi de performans ve ölçek için tasarlanmıştır. MinIO, birçok farklı bulut ve şirket içi ortamda başlatılabilen tek bir Go ikili programıdır. Çok hafiftir ancak aynı zamanda aşağıdaki gibi özelliklerle doludur:
TileDB, verileri Genomik, Jeo-uzaysal, Biyomedikal Görüntüleme, Finans, Makine Öğrenimi ve daha fazlası gibi çeşitli uygulamalarda depolamak için kullanılır. TileDB'nin gücü, herhangi bir verinin, çoğu veri bilimi aracı tarafından dahili olarak kullanılan format olan yoğun veya seyrek çok boyutlu bir dizi olarak verimli bir şekilde modellenebilmesinden kaynaklanmaktadır. Verilerinizi ve meta verilerinizi TileDB dizilerinde depolayarak, tüm veri depolama ve yönetim zorluklarını ortadan kaldırırken, çok sayıda API'miz ve entegrasyonlarımız aracılığıyla en sevdiğiniz programlama dili veya veri bilimi aracıyla verilere verimli bir şekilde erişebilirsiniz.
TileDB'yi kullanarak biraz test verileri oluşturalım.
numpy
bağımlılığını da kurması gereken TileDB pip
modülünü yükleyin.
% 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
Aşağıdaki Python betiğini çalıştırarak bir test dizisi oluşturun ve tiledb-demo.py
adını verin.
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[:])
Komut dosyasını çalıştır
% python3 tiledb-demo.py [1. 2. 3.]
Bu, gerçek verileri depolamak tiledb_demo
adında bir dizin oluşturacaktır.
% 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
Olduğu gibi kullanmaya devam edebilirsiniz ancak her şeyin yerel olması sorun değil çünkü yerel disk veya düğüm arızalanırsa tüm verilerinizi kaybedersiniz. Bunun yerine aynı verileri bir MinIO kümesinden okumak gibi eğlenceli bir şey yapalım.
Docker ekosistemimizde mc'yi çekerek ve ardından kovayı oluşturmak için play.min.io'yu kullanarak başlayacağız.
Mc docker görüntüsünü çekin
% docker pull minio/mc
Tüm kovaları listeleyerek MinIO Play ile test edin
% docker run minio/mc ls play [LONG TRUNCATED LIST OF BUCKETS]
Yerel TileDB verilerimizi taşıyacağımız bir paket oluşturun ve buna tiledb-demo
adını verin.
% docker run minio/mc mb play/tiledb-demo Bucket created successfully `play/tiledb-demo`.
tiledb_demo
veri dizininin içeriğini MinIO tiledb-demo
klasörüne kopyalayın
% 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
Verilerin kopyalandığından emin olmak tiledb-demo
içeriğini listeleyin.
% 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/
Not: MinIO İstemcisi ( mc
) veya S3 uyumlu herhangi bir istemci yalnızca boş olmayan klasörleri kopyalar. Bunun nedeni, nesne depolama dünyasında verilerin paket öneklerine göre düzenlenmesi, dolayısıyla boş olmayan klasörlere ihtiyaç duyulmamasıdır. Gelecekteki bir blogda verilerin önekler ve klasörlerle nasıl organize edildiğini daha derinlemesine ele alacağız. Bu nedenle, yerel klasörde gördüğümüz geri kalanları değil, yalnızca bu 3 klasörü görürsünüz.
Şimdi aşağıdaki Python kodunu kullanarak aynı verileri doğrudan MinIO klasöründen okumaya çalışalım, tiledb-minio-demo.py
olarak adlandırın.
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[:])
Çıktı tanıdık gelmeli
% python3 tiledb-minio-demo.py [1. 2. 3.]
MinIO'dan okuduk, şimdi verileri mevcut bir kaynaktan MinIO'ya kopyalamak yerine doğrudan bir MinIO klasörüne nasıl yazabileceğimizi görelim.
Şimdiye kadar size yerel depolamada veya mevcut bir pakette zaten mevcut olan verileri nasıl okuyacağınızı gösterdik. Ancak en başından itibaren doğrudan MinIO'ya yazarak yeni bir başlangıç yapmak isteseydiniz bu nasıl işe yarardı? Hadi bir bakalım.
Verileri doğrudan MinIO klasörüne yazma kodu, iki satır değişikliği dışında yukarıdakiyle aynıdır.
TileDB verilerinin depolandığı MinIO paketinin yolu, tiledb_minio_demo
( tiledb_demo
yerine) olarak güncellenmelidir.
MinIO klasöründe depolanacak diziyi oluşturmak için daha önce yerel depolamada yaptığımız tiledb.from_numpy
işlevini kullanacağız.
[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]
Bu 2 değişikliği yaptıktan sonra betiği çalıştırın ve aşağıdaki çıktıyı görmelisiniz.
% python3 tiledb-minio-demo.py [1. 2. 3.]
Betiği tekrar çalıştırırsanız, tekrar yazmayı deneyeceğinden aşağıdaki hatayla başarısız olacaktır.
tiledb.cc.TileDBError: [TileDB::StorageManager] Error: Cannot create array; Array 's3://tiledb-demo/tiledb_minio_demo/' already exists
Sadece aşağıdaki satırı yorumlayın ve onu birden çok kez yeniden çalıştırabilirsiniz.
# 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.]
Verilerin beklendiği gibi orada olduğundan emin olmak için MinIO Play grubunu kontrol edin
% 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/
İşte, MinIO'ya veri aktarmak bu kadar basit. Daha önce aldığınız sonuçların aynısını mı aldınız? Yapmanız gerekirdi, ancak yapmadıysanız göz atabileceğiniz birkaç şey var.
MinIO'ya okumaya/yazmaya çalışırken karşılaşabileceğiniz bazı yaygın hatalara bakacağız.
Erişim anahtarınız ve gizli anahtarınız yanlışsa aşağıdaki gibi bir hata mesajı görmeyi beklemelisiniz
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.
Daha sonra, ana bilgisayar adının ve bağlantı noktasının doğru olduğundan emin olmanız gerekir; uygun bir uç nokta olmazsa bunlar karşılaşacağınız hatalardır.
Yanlış Ana Bilgisayar Adı:
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't resolve host name
Yanlış Port:
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't connect to server
Son fakat bir o kadar da önemlisi, gördüğüm en şifreli hatalardan biri şu:
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
Bir sürü hata ayıklamanın ardından, http kullanarak bağlanıyorsanız ancak MinIO sunucusunda TLS etkinleştirilmişse yukarıdaki hatayı göreceğiniz ortaya çıktı. Bağlantı şemasının doğru konfigürasyona ayarlandığından emin olun; bu durumda config["vfs.s3.scheme"] = "https".
Bir rap şarkısı var (arayabilirsiniz), burada yığınlar halinde * öksürük* nakit yığınları olduğu hakkında rap yapıyorlar. Ama bir rap şarkısı daha var ki, ellerinde o kadar çok para yığını var ki, artık onlara "yığın" denilemeyeceğini, artık "raf" olduklarını iddia ediyorlar. Esasen, yığınlarınız çok büyük ve çok yüksek olduğunda, nakit yığınlarınızı depolamak için raflar üzerinde raflara ihtiyaç duyarsınız.
Bu uygun bir karşılaştırma çünkü veri yığınlarınız sizin için, hakkında konuştukları para yığınları kadar (veya daha fazla) anlam taşıyor. Keşke tüm nesnelerinizi (fiziksel veya sanal) güvende ve kolayca erişilebilir tutacak MinIO gibi bir şey olsaydı.
MinIO'yu da ekleyerek TileDB'yi kolayca ölçeklendirebilirsiniz.
Bu blogda kullanılan kod parçacıklarını bir
Ayrıca burada görünür.