paint-brush
MinIO で TileDB エンジンをスーパーチャージする@minio
26,369 測定値
26,369 測定値

MinIO で TileDB エンジンをスーパーチャージする

MinIO7m2024/03/21
Read on Terminal Reader

長すぎる; 読むには

MinIO は、両方ともパフォーマンスとスケールを考慮して構築されているため、強力なプライマリ TileDB バックエンドになります。
featured image - MinIO で TileDB エンジンをスーパーチャージする
MinIO HackerNoon profile picture


MinIO は、両方ともパフォーマンスとスケールを考慮して構築されているため、強力なプライマリ TileDB バックエンドを作成します。 MinIO は、さまざまな種類のクラウドおよびオンプレミス環境で起動できる単一の Go バイナリです。非常に軽量ですが、次のような機能も満載です。レプリケーションそして暗号化、そしてそれは提供します統合さまざまなアプリケーションで。 MinIO は、業界をリードするパフォーマンスとスケーラビリティにより、TileDB に最適です。 MinIO は驚異的なパフォーマンスを実現します。わずか 32 ノードで GET で 325 GiB/s (349 GB/s)、PUT で 165 GiB/s (177 GB/s) のベンチマークを実施しました。既製のNVMe SSD – 分析および AI/ML ワークロードを備えたデータ レイク/レイク ハウスを構築するために使用されます。


TileDB は、ゲノミクス、地理空間、生物医学イメージング、金融、機械学習などのさまざまなアプリケーションでデータを保存するために使用されます。 TileDB の能力は、あらゆるデータを高密度または疎の多次元配列として効率的にモデル化できるという事実に由来します。これは、ほとんどのデータ サイエンス ツールで内部的に使用される形式です。データとメタデータを TileDB 配列に保存することで、データの保存と管理の問題をすべて抽象化しながら、多数の API と統合を介して好みのプログラミング言語やデータ サイエンス ツールでデータに効率的にアクセスできます。

TileDB のセットアップ

それでは、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 バケットから読み取るなど、何か楽しいことをしてみましょう。

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 に直接書き込んで新たに始めたい場合は、どうすればよいでしょうか?見てみましょう。


データを 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 を簡単に拡張できます。複数のデータセンターにわたる複数のラック比較的簡単に。また、MinIO を優れたものにするすべての機能も利用できます。セキュリティとアクセス制御 階層化オブジェクトのロックと保持キー暗号化サービス (KES) 、特に箱から出してすぐに使えます。すべてのデータを MinIO に置くことで、必要なストレージの複雑さが軽減され、データ ストレージ コストの大幅な節約が実現されると同時に、汎用ハードウェアで MinIO を実行することで最高のパフォーマンス対コスト比が得られます。 MinIO は、クエリを楽しくする業界トップのパフォーマンスで TileDB エンジンを強化します。


このブログで使用されているコード スニペットをgitリポジトリ。 MinIO を TileDB に接続する方法、またはデータを MinIO に移行する方法についてご質問がある場合は、必ずお問い合わせください。スラック


ここにも登場します。