MinIO tạo ra một chương trình phụ trợ TileDB chính mạnh mẽ vì cả hai đều được xây dựng để đạt được hiệu suất và quy mô. MinIO là một hệ nhị phân Go duy nhất có thể được khởi chạy trong nhiều loại môi trường đám mây và tại chỗ khác nhau. Nó rất nhẹ nhưng cũng có nhiều tính năng như
TileDB được sử dụng để lưu trữ dữ liệu trong nhiều ứng dụng khác nhau, chẳng hạn như Genomics, Geospatial, Biomedical Imaging, Finance, Machine Learning, v.v. Sức mạnh của TileDB bắt nguồn từ thực tế là mọi dữ liệu đều có thể được mô hình hóa một cách hiệu quả dưới dạng mảng đa chiều dày đặc hoặc thưa thớt, đây là định dạng được hầu hết các công cụ khoa học dữ liệu sử dụng nội bộ. Bằng cách lưu trữ dữ liệu và siêu dữ liệu của bạn trong mảng TileDB, bạn trừu tượng hóa mọi khó khăn trong việc quản lý và lưu trữ dữ liệu, đồng thời truy cập dữ liệu một cách hiệu quả bằng ngôn ngữ lập trình hoặc công cụ khoa học dữ liệu yêu thích của bạn thông qua nhiều API và tích hợp của chúng tôi.
Hãy cùng tìm hiểu và tạo một số dữ liệu thử nghiệm bằng TileDB.
Cài đặt mô-đun pip
TileDB, mô-đun này cũng sẽ cài đặt phần phụ thuộc 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
Tạo một mảng thử nghiệm bằng cách chạy tập lệnh Python bên dưới, đặt tên 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[:])
Chạy tập lệnh
% python3 tiledb-demo.py [1. 2. 3.]
Điều này sẽ tạo một thư mục có tên tiledb_demo
để lưu trữ dữ liệu thực tế.
% 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
Bạn có thể tiếp tục sử dụng nó như cũ nhưng sẽ không có ích gì nếu mọi thứ đều cục bộ vì nếu đĩa hoặc nút cục bộ bị lỗi thì bạn sẽ mất toàn bộ dữ liệu của mình. Thay vào đó, hãy làm điều gì đó thú vị, chẳng hạn như đọc cùng dữ liệu này từ nhóm MinIO.
Chúng ta sẽ bắt đầu bằng cách kéo mc vào hệ sinh thái docker và sau đó sử dụng play.min.io để tạo nhóm.
Kéo hình ảnh docker mc
% docker pull minio/mc
Kiểm tra với MinIO Play bằng cách liệt kê tất cả các nhóm
% docker run minio/mc ls play [LONG TRUNCATED LIST OF BUCKETS]
Tạo một nhóm để di chuyển dữ liệu TileDB cục bộ của chúng tôi tới, đặt tên là tiledb-demo
.
% docker run minio/mc mb play/tiledb-demo Bucket created successfully `play/tiledb-demo`.
Sao chép nội dung của thư mục dữ liệu tiledb_demo
vào nhóm tiledb-demo
của 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
Liệt kê nội dung của tiledb-demo
để đảm bảo dữ liệu đã được sao chép.
% 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/
Lưu ý: Ứng dụng khách MinIO ( mc
) hoặc bất kỳ ứng dụng khách nào tương thích với S3, chỉ sao chép các thư mục không trống. Lý do cho điều này là trong thế giới lưu trữ đối tượng, dữ liệu được sắp xếp dựa trên tiền tố nhóm, do đó không cần đến các thư mục không trống. Trong một blog tương lai, chúng tôi sẽ tìm hiểu sâu hơn về cách sắp xếp dữ liệu bằng tiền tố và thư mục. Do đó, bạn chỉ thấy 3 thư mục này chứ không thấy phần còn lại mà chúng tôi thấy trong thư mục cục bộ.
Bây giờ, hãy thử đọc cùng một dữ liệu trực tiếp từ nhóm MinIO bằng mã Python bên dưới, đặt tên tệp tiledb-minio-demo.py
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[:])
Đầu ra trông quen thuộc
% python3 tiledb-minio-demo.py [1. 2. 3.]
Chúng ta đã đọc từ MinIO, tiếp theo hãy xem cách chúng ta có thể ghi dữ liệu trực tiếp vào nhóm MinIO, thay vì sao chép dữ liệu đó vào MinIO từ nguồn hiện có.
Cho đến nay, chúng tôi đã chỉ cho bạn cách đọc dữ liệu đã tồn tại trong bộ nhớ cục bộ hoặc bộ chứa hiện có. Nhưng nếu bạn muốn bắt đầu lại bằng cách viết trực tiếp vào MinIO ngay từ đầu, thì cách đó sẽ như thế nào? Chúng ta hãy xem xét.
Mã để ghi dữ liệu trực tiếp vào nhóm MinIO giống như trên ngoại trừ việc thay đổi hai dòng.
Đường dẫn đến nhóm MinIO nơi lưu trữ dữ liệu TileDB phải được cập nhật thành tiledb_minio_demo
(thay vì tiledb_demo
).
Chúng ta sẽ sử dụng hàm tiledb.from_numpy
, như chúng ta đã làm trước đó với bộ nhớ cục bộ, để tạo mảng lưu trữ trong nhóm 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]
Sau khi thực hiện 2 thay đổi này, hãy chạy tập lệnh và bạn sẽ thấy kết quả đầu ra bên dưới
% python3 tiledb-minio-demo.py [1. 2. 3.]
Nếu bạn chạy lại tập lệnh, nó sẽ thất bại với lỗi dưới đây vì nó sẽ cố gắng ghi lại.
tiledb.cc.TileDBError: [TileDB::StorageManager] Error: Cannot create array; Array 's3://tiledb-demo/tiledb_minio_demo/' already exists
Chỉ cần nhận xét dòng sau và bạn có thể chạy lại nó nhiều lần.
# 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.]
Kiểm tra nhóm MinIO Play để đảm bảo dữ liệu ở đó như mong đợi
% 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/
Thế đấy, việc lấy dữ liệu vào MinIO thật đơn giản. Bạn có nhận được kết quả tương tự như trước đó không? Bạn nên có, nhưng nếu không thì có một số thứ bạn có thể kiểm tra.
Chúng ta sẽ xem xét một số lỗi phổ biến mà bạn có thể gặp phải khi cố gắng đọc/ghi vào MinIO.
Nếu khóa truy cập và khóa bí mật của bạn không chính xác, bạn sẽ thấy thông báo lỗi như bên dưới
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.
Tiếp theo, bạn cần đảm bảo tên máy chủ và cổng là chính xác, nếu không có điểm cuối thích hợp thì đây là những lỗi bạn sẽ gặp phải.
Tên máy chủ không chính xác:
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't resolve host name
Cổng sai:
tiledb.cc.TileDBError: [TileDB::S3] Error: … Couldn't connect to server
Cuối cùng nhưng không kém phần quan trọng, một trong những lỗi khó hiểu nhất mà tôi từng thấy là lỗi sau:
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
Sau rất nhiều lần gỡ lỗi, hóa ra nếu bạn đang kết nối bằng http nhưng máy chủ MinIO đã kích hoạt TLS thì bạn sẽ thấy lỗi trên. Chỉ cần đảm bảo sơ đồ kết nối được đặt đúng cấu hình, trong trường hợp này là config["vfs.s3.scheme"] = "https".
Có một bài hát rap (bạn có thể tìm kiếm nó) trong đó họ rap về việc có nhiều chồng tiền mặt * ho* . Nhưng có một bài hát rap khác mà họ khẳng định họ có rất nhiều tiền mặt đến mức không thể gọi là “stack” nữa, giờ chúng là “rack”. Về cơ bản, khi ngăn xếp của bạn quá lớn và quá cao, bạn cần có các giá trên các giá để lưu trữ tiền mặt của mình.
Đây là một so sánh phù hợp vì lượng dữ liệu của bạn có ý nghĩa nhiều (hoặc nhiều hơn) đối với bạn cũng như lượng tiền mặt mà họ đang nói đến. Giá như có thứ gì đó như MinIO để giữ cho tất cả các đối tượng của bạn – vật lý hoặc ảo – an toàn và dễ dàng truy cập.
Với sự kết hợp của MinIO, bạn có thể dễ dàng mở rộng quy mô TileDB thành
Chúng tôi đã thêm các đoạn mã được sử dụng trong blog này vào một
Cũng xuất hiện ở đây .