使用 MinIO 超级充电 TileDB 引擎

news2024/12/27 12:04:49

MinIO 是一个强大的主要 TileDB 后端,因为两者都是为性能和规模而构建的。MinIO 是一个单一的 Go 二进制文件,可以在许多不同类型的云和本地环境中启动。它非常轻量级,但也具有复制和加密等功能,并且提供与各种应用程序的集成。MinIO 是 TileDB 的完美伴侣,因为它具有行业领先的性能和可扩展性。MinIO 具有出色的性能——我们在 GET 上以 325 GiB/s (349 GB/s) 的速度对其进行了基准测试,在 PUT 上以 165 GiB/s (177 GB/s) 的速度对其进行了基准测试,只需 32 个现成的 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 Bucket

我们将首先在 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.]
[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]

我们已经阅读了 MinIO,接下来让我们看看如何直接将数据写入 MinIO 存储桶,而不是将其从现有源复制到 MinIO。

% python3 tiledb-minio-demo.py

[1. 2. 3.]

直接写入 MinIO 存储桶

到目前为止,我们已经向您展示了如何读取本地存储或现有存储桶中已存在的数据。但是,如果您想从一开始就直接向 MinIO 写入内容,那么这将如何工作?让我们来看看。

直接写入 MinIO 存储桶的代码与上述相同,只是更改了两行。

存储 TileDB 数据的 MinIO 存储桶的路径必须更新为 tiledb_minio_demo (而不是 tiledb_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.] [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

最后但并非最不重要的一点是,我见过的最隐晦的错误之一是

经过大量调试后,事实证明,如果您使用 http 进行连接,但 MinIO 服务器激活了 TLS,那么您将看到上述错误。只要确保连接方案设置为正确的配置,在这种情况下,config[“vfs.s3.scheme”] = “https”.

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

机架上的机架 机架上的机架

有一首说唱歌曲(你可以搜索它),他们说唱有一堆堆的咳嗽现金。但是还有另一首说唱歌曲,他们声称他们有这么多的现金,以至于他们不能再被称为“堆栈”,他们现在是“架子”。从本质上讲,当你的筹码变得如此之大和如此之高时,你需要一个架子上的架子来存储你的现金堆栈。

这是一个恰当的比较,因为你的数据堆对你来说意味着与他们正在说唱的一堆现金一样多(或更多)。要是有像 MinIO 这样的东西来保证你所有的对象——物理的或虚拟的——安全且易于访问就好了。

借助 MinIO,您可以轻松地将 TileDB 扩展到多个数据中心的多个机架。您还可以获得使 MinIO 出色的所有功能,例如安全和访问控制、分层、对象锁定和保留、密钥加密服务 (KES) 等开箱即用。通过将所有数据保存在 MinIO 中,您可以降低所需的存储复杂性,从而节省大量数据存储成本,同时在商用硬件上运行 MinIO 可提供最佳的性价比。MinIO 以行业领先的性能增强您的 TileDB 引擎,让查询成为一种乐趣。

我们已将本博客中使用的代码片段添加到 git 存储库中。如果您对如何将 MinIO 连接到 TileDB 或将数据迁移到 MinIO 有任何疑问,请务必联系我们!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1445147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享76个时间日期JS特效,总有一款适合您

分享76个时间日期JS特效,总有一款适合您 76个时间日期JS特效下载链接:https://pan.baidu.com/s/1s7tPGT_ItK7dNK5_qbZkug?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程, 面向过程就是一步一步去操作,你需要知道每一步的步骤。 面向对象的编程以对象为核心,通过定义类描述实体及其行为,并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

C++进阶(十四)智能指针

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、为什么需要智能指针?二、内存泄漏1、 什么是内存泄漏,内存泄漏的危…

探索现代Web前端开发框架:选择最适合你的工具

在当今快速发展的Web开发领域,前端开发框架的选择显得尤为关键。这些框架可以帮助我们更高效地构建出交互性强、性能卓越的用户界面。本文将带你了解几个当前最受欢迎的Web前端开发框架,并帮助你根据自己的需求选择最合适的工具。 1. React React由Fac…

前端面试题——JS实现反转链式表

前言 反转单向链表就是将整个单链表的数据进行倒序的过程。 例如,如果反转之前的单链表是0->1->2->3,那么反转之后的单链表应该是3->2->1->0。这个操作通常是通过改变链表中每个节点的指针方向来实现的,即让每个节点的指…

【经验】PIC16F877A串口发送字符串问题

PIC16F877A串口发送,查询方式,就为了调出这个费了我一天时间,原来是串口芯片电压问题,现总结如下: 1、注意232串口芯片供电电压,有5V和3.3V的 2、注意TXD、RXD接线,单片机的TXD接232芯片的R2O…

docker镜像命令

1、查看docker版本详情 docker version 2、查看本地所有镜像 docker images 名词解释:REPOSITORY - 镜像仓库源TAG - 镜像的标签(就是版本号标识)IMAGE ID - 镜像的idCREATED - 镜像创建时间SIZE - 镜像大小 3、可选项 在执行基础命令时…

代码随想录day19--二叉树的应用7

LeetCode235.二叉搜索树的最近公共祖先 题目描述: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、…

问题:A注册会计师必须在期中实施实质性程序的情形是()。 #学习方法#其他

问题:A注册会计师必须在期中实施实质性程序的情形是()。 A.甲公司整体控制环境不佳 B.将期中实质性程序所获证据与期末数据进行比较 C.评估的认定层次重大错报风险很高 D.没有把握通过在期中…

【MySQL】——数值函数的学习

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Z1fAnfrxGD7I5gqp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【大厂AI课学习笔记】【1.6 人工智能基础知识】(4)深度学习和机器学习

关于深度学习和机器学习,出来包含关系之外,还有如上总结的知识点。 分别从特征处理、学习方法、数据依赖、硬件依赖等4个方面,进行了总结。 从特征处理上看:深度学习从数据中习得高级特征,并自行创建新的特征。这比普…

c++猜数游戏

一.题目要求 系统随机产生1~100的随机数,进行猜数,如果猜的数过大提示猜数过大,过小提出猜数过小,直到猜出正确的数字 二.代码 三.示例

无人机飞控算法原理基础研究,多旋翼无人机的飞行控制算法理论详解,无人机飞控软件架构设计

多旋翼无人机的飞行控制算法主要涉及到自动控制器、捷联式惯性导航系统、卡尔曼滤波算法和飞行控制PID算法等部分。 自动控制器是无人机飞行控制的核心部分,它负责接收来自无人机传感器和其他系统的信息,并根据预设的算法和逻辑,对无人机的姿…

Python:解析数组二分查找算法bisect

简介:bisect模块提供对维护一个已排序列表而无须在每次插入后对该列表重排序的支持。对于具有大量条目需要大量比较运算的长列表,这改进了原来的线性搜索或频繁重排序。之所以被命名为 bisect 是因为它使用了基本的二分算法来完成任务。 不同于其他搜索特…

MongoDB 与 mongo-express docker 安装

MongoDB 和 mongo-express 与 MySQL 不同,MongoDB 为 NoSQL 数据库,MongoDB 中没有 table ,schema 概念,取而代之的 collection,其中 collection 存储的为 BSON 格式,是一种类似于 JSON 的用于存储 k-v 键…

Docker实战01

七十八、compse是什么能干嘛 docker-compose容器编排(你的容器实例太多了,你如何管理,容器之间涉及到启动的顺序,容器之间涉及到网络通信的调用) 1、是什么? Docker-Compose是Docker官方的开源项目&…

「数据结构」哈希表1:基本概念

🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! 基本概念 🍉哈希表🍉哈希冲突🍌负载因子调节🍌解决哈希冲突🥝1. 闭散…

HACKTHEBOX通关笔记——mango(退役)

信息收集 端口扫描 ┌──(root㉿kali)-[~] └─# nmap -sC -sV -A -p- --min-rate10000 10.129.229.185 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-31 20:44 EST Warning: 10.129.229.185 giving up on port because retransmission cap hit (10). Nmap scan …

VBA_NZ系列工具NZ01: VBA二维码应用技术

我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…

什么是宿主软件?宿主软件有哪些?

什么是宿主软件? 宿主软件就是专业的音乐制作软件,我们日常听到的大多数正规音乐作品都是用宿主软件制作出来的,这些软件一般需要安装各类插件,插件就像寄生虫需要在宿主软件里加载才可以工作。 插件主要分虚拟乐器插件和音频处理插件两类…