MinIO は、両方ともパフォーマンスとスケールを考慮して構築されているため、強力なプライマリ TileDB バックエンドを作成します。 MinIO は、さまざまな種類のクラウドおよびオンプレミス環境で起動できる単一の Go バイナリです。非常に軽量ですが、次のような機能も満載です。
TileDB は、ゲノミクス、地理空間、生物医学イメージング、金融、機械学習などのさまざまなアプリケーションでデータを保存するために使用されます。 TileDB の能力は、あらゆるデータを高密度または疎の多次元配列として効率的にモデル化できるという事実に由来します。これは、ほとんどのデータ サイエンス ツールで内部的に使用される形式です。データとメタデータを TileDB 配列に保存することで、データの保存と管理の問題をすべて抽象化しながら、多数の API と統合を介して好みのプログラミング言語やデータ サイエンス ツールでデータに効率的にアクセスできます。
それでは、TileDB を使用してテスト データを作成してみましょう。
TileDB pip
モジュールをインストールします。これにより、 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 バケットから読み取るなど、何か楽しいことをしてみましょう。
まず、Docker エコシステムで 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
データ ディレクトリの内容を MinIO 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
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 つのフォルダーのみが表示され、ローカル フォルダーに表示された残りのフォルダーは表示されません。
次に、以下の Python コードを使用して、同じデータを MinIO バケットから直接読み取ってみましょう。ファイルに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 バケットに直接書き込むコードは、2 行の変更を除いて上記と同じです。
TileDB データが保存されている MinIO バケットへのパスは、( tiledb_demo
ではなく) tiledb_minio_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]
これら 2 つの変更を加えた後、スクリプトを実行すると、以下の出力が表示されるはずです。
% 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
最後になりましたが、私がこれまでに見た中で最も不可解なエラーの 1 つは次のとおりです。
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 を簡単に拡張できます。
このブログで使用されているコード スニペットを
ここにも登場します。