paint-brush
MinIO ile TileDB Motorunu Güçlendirinile@minio
26,413 okumalar
26,413 okumalar

MinIO ile TileDB Motorunu Güçlendirin

ile MinIO7m2024/03/21
Read on Terminal Reader

Çok uzun; Okumak

MinIO, güçlü bir birincil TileDB arka ucu oluşturur çünkü her ikisi de performans ve ölçek için tasarlanmıştır.
featured image - MinIO ile TileDB Motorunu Güçlendirin
MinIO HackerNoon profile picture


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: çoğaltma Ve şifreleme ve sağlar entegrasyonlar çeşitli uygulamalarla. MinIO, endüstri lideri performansı ve ölçeklenebilirliği nedeniyle TileDB için mükemmel bir arkadaştır. MinIO muazzam bir performansa sahip; bunu yalnızca 32 düğümlü GET'lerde 325 GiB/s (349 GB/s) ve PUT'larda 165 GiB/s (177 GB/s) olarak kıyasladık. kullanıma hazır NVMe SSD'ler – ve analitik ve AI/ML iş yükleriyle veri gölleri/göl evleri oluşturmak için kullanılır.


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 Ayarlayın

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.

Verileri MinIO Paketine Taşıma

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.

Doğrudan MinIO Kovasına Yazma

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

Ortak tuzaklar

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

Raflar Üzerindeki Raflar Raflar Üzerindeki Raflar

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. birden fazla veri merkezinde birden fazla raf nispeten kolaylıkla. Ayrıca MinIO'yu mükemmel kılan tüm özelliklere de sahip olursunuz. Güvenlik ve Erişim Kontrolü , Katmanlama , Nesne Kilitleme ve Saklama , Anahtar Şifreleme Hizmeti (KES) , diğerlerinin yanı sıra kutudan çıkar çıkmaz. Tüm verilerinizi MinIO'da bulundurarak, gerekli depolama karmaşıklığını azaltırsınız ve dolayısıyla veri depolama maliyetlerinde önemli tasarruflar elde edersiniz; aynı zamanda MinIO'yu ticari donanımda çalıştırmak mümkün olan en iyi performans-maliyet oranını sağlar. MinIO, TileDB motorunuzu sorgulamayı keyifli hale getiren sektör lideri performansla güçlendirir.


Bu blogda kullanılan kod parçacıklarını bir git deposu . MinIO'yu TileDB'ye nasıl bağlayacağınız veya verileri MinIO'ya nasıl geçireceğiniz konusunda herhangi bir sorunuz varsa bizimle şu adresten iletişime geçtiğinizden emin olun: Gevşek !


Ayrıca burada görünür.