paint-brush
MinIO로 TileDB 엔진 강화~에 의해@minio
26,371 판독값
26,371 판독값

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에서 325GiB/s(349GB/s), PUT에서 165GiB/s(177GB/s)로 벤치마킹했습니다. 기성품 NVMe SSD – 분석 및 AI/ML 워크로드를 갖춘 데이터 레이크/레이크 하우스를 구축하는 데 사용됩니다.


TileDB는 유전체학, 지리공간, 생물의학 이미징, 금융, 기계 학습 등과 같은 다양한 애플리케이션에 데이터를 저장하는 데 사용됩니다. TileDB의 힘은 모든 데이터를 대부분의 데이터 과학 도구에서 내부적으로 사용하는 형식인 조밀하거나 희박한 다차원 배열로 효율적으로 모델링할 수 있다는 사실에서 비롯됩니다. 데이터와 메타데이터를 TileDB 배열에 저장하면 모든 데이터 저장 및 관리 문제를 추상화하는 동시에 다양한 API 및 통합을 통해 선호하는 프로그래밍 언어 또는 데이터 과학 도구로 데이터에 효율적으로 액세스할 수 있습니다.

TileDB 설정

TileDB를 사용하여 테스트 데이터를 살펴보고 만들어 보겠습니다.


numpy 종속성도 설치해야 하는 TileDB pip 모듈을 설치합니다.


 % 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 버킷에 직접 데이터를 쓰는 코드는 두 줄 변경을 제외하고 위와 동일합니다.


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]


두 가지 사항을 변경한 후 스크립트를 실행하면 아래 출력이 표시됩니다.

 % 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


마지막으로 제가 본 가장 알 수 없는 오류 중 하나는 다음과 같습니다.

 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로 마이그레이션하는 방법에 대해 질문이 있는 경우 다음 주소로 문의해 주세요. 느슨하게 !


여기에도 나타납니다.