使用 MinIO 超级充电 TileDB 引擎

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 tiledbCollecting tiledbDownloading 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:00Collecting packagingDownloading packaging-23.2-py3-none-any.whl (53 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.0/53.0 kB 643.1 kB/s eta 0:00:00Collecting numpy>=1.23.2Downloading 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:00Installing collected packages: packaging, numpy, tiledbSuccessfully installed numpy-1.26.3 packaging-23.2 tiledb-0.25.0

通过运行以下 Python 脚本创建一个测试数组,将其 tiledb-demo.py 命名为 。

import tiledbimport numpy as npimport os, shutil# Local patharray_local = os.path.expanduser("./tiledb_demo")# Create a simple 1D arraytiledb.from_numpy(array_local, np.array([1.0, 2.0, 3.0]))# Read the arraywith tiledb.open(array_local) as A:print(A[:])

运行脚本

% python3 tiledb-demo.py[1. 2. 3.]

这将创建一个目录 tiledb_demo 来存储实际数据。

% ls -l tiledb_demo/total 0drwxr-xr-x  3 aj  staff   96 Jan 31 05:27 __commitsdrwxr-xr-x  2 aj  staff   64 Jan 31 05:27 __fragment_metadrwxr-xr-x  3 aj  staff   96 Jan 31 05:27 __fragmentsdrwxr-xr-x  2 aj  staff   64 Jan 31 05:27 __labelsdrwxr-xr-x  2 aj  staff   64 Jan 31 05:27 __metadrwxr-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-demoBucket 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 tiledbimport numpy as np# MinIO keysminio_key = "minioadmin"minio_secret = "minioadmin"# The configuration object with MinIO keysconfig = tiledb.Config()config["vfs.s3.aws_access_key_id"] = minio_keyconfig["vfs.s3.aws_secret_access_key"] = minio_secretconfig["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 contextctx = tiledb.Ctx(config)# The MinIO bucket URI path of tiledb demoarray_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 demoarray_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 demoarray_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.mzph.cn/news/679663.shtml

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

相关文章

牛客周赛 Round 32 E.小红的回文数【挖掘性质+哈希前缀和】

原题链接:https://ac.nowcoder.com/acm/contest/75174/E 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 小红定义一个整数是“好数”,当且仅当该…

java学习07---综合练习

飞机票 1.需求: 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7…

Linux命令-blockdev命令(从命令行调用区块设备控制程序)

说明 blockdev命令 在命令调用“ioxtls”函数,以实现对设备的控制。 语法 blockdev(选项)(参数)选项 -V:打印版本号并退出; -q:安静模式; -v:详细信息模式; --setro:只读&#x…

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ(现在称为如 Apache Tomca…

以谷歌浏览器为例 讲述 JavaScript 断点调试操作用法

今天来说个比较实用的东西 用浏览器开发者工具 对 javaScript代码进行调试 我们先创建一个index.html 编写代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

Verilog和Verilog-A有什么区别

Verilog和Verilog-A都是硬件描述语言&#xff0c;用于设计和仿真电子系统。 Verilog 是一种硬件描述语言&#xff0c;广泛用于数字电路的设计、验证和仿真。它是一种结构化的语言&#xff0c;用于描述数字电路的行为和结构。Verilog可用于编写数字逻辑、寄存器传输级&#xff…

Nature Machine Intelligence 法国国家科学研究中心评论“使用大语言模型进行研究的危机”

ChatGPT 于 2022 年底发布&#xff0c;将大型语言模型 &#xff08;LLM&#xff09; 推到了聚光灯下。通过使用户能够直接用自然语言查询模型&#xff0c;ChatGPT 实现了对这些模型的访问——这是一个受欢迎的发展。从那时起&#xff0c;ChatGPT 和 Bard、Claude 和 Bing AI 等…

linux安装单机版redis详细步骤,及python连接redis案例

文章目录 linux相关工具yum方式安装redis使用编译安装redis配置redis为systemctl启动其它: 安装redis6.0python连接redis案例 linux相关工具 ./redis-benchmark #用于进行redis性能测试的工具 ./redis-check-dump #用于修复出问题的dump.rdb文件 ./redis-cli …

MongoDB聚合:$geoNear

$geoNear根据指定的点按照距离以由近到远的顺序输出文档。 从4.2版本开始&#xff0c;MongoDB移除了limit和num选项以及100个文档的限制&#xff0c;如果要限制结果文档的数量可以使用$limit阶段。 语法 { $geoNear: { <geoNear options> } }$geoNear操作接受一个包含…

【报错解决】-bash: export: `-8‘: not a valid identifier 不是有效的标识符

现象 一登陆就提示-bash: export: -8’: not a valid identifier 不是有效的标识符 问题出现的原因 设置字符集时多写了空格 [rootdb1 ~]# cat >>/etc/profile<<EOF export LANGen_US.UTF -8(-8前不应有空格) EOF 解决方法 cd /etc vi profile 把export带有-8的…

188. 买卖股票的最佳时机 IV

188. 买卖股票的最佳时机 IV 题目链接&#xff1a;188. 买卖股票的最佳时机 IV 代码如下&#xff1a; //动态规划 //参考&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/ class Solution { public:int maxProfit(int k, vector<int>&am…

如何升级至ChatGPT Plus:快速指南,ChatGPT的秘密武器GPT4.0是什么?

提到 ChatGPT。想必大家都有所耳闻。自从 2022 年上线以来&#xff0c;就受到国内外狂热的追捧和青睐&#xff0c;上线2个月&#xff0c;月活突破1个亿&#xff01;&#xff01;&#xff01; 而且还在持续上涨中。因为有很多人都在使用 ChatGPT 。无论是各大头条、抖音等 App、…

利用YOLOv8 pose estimation 进行 人的 头部等马赛克

文章大纲 马赛克几种OpenCV 实现马赛克的方法高斯模糊pose estimation 定位并模糊:三角形的外接圆与膨胀系数实现实现代码实现效果参考文献与学习路径之前写过一个文章记录,怎么对人进行目标检测后打码,但是人脸识别有个问题是,很多人的背影,或者侧面无法识别出来人脸,那…

工具 canvas 画时钟表

自己写的工具&#xff0c;代码和Auto.js有差异 importClass(android.view.MotionEvent) importClass(android.graphics.Paint) importClass(java.util.TimeZone); importClass(java.text.SimpleDateFormat); ui.layout( <vertical><text id"坐标1"/>&l…

powershell 雅地关闭UDP监听器

在PowerShell中优雅地关闭UDP监听器意味着你需要一种机制来安全地停止正在运行的UdpClient实例。由于UdpClient类本身没有提供直接的停止或关闭方法&#xff0c;你需要通过其他方式来实现这一点。通常&#xff0c;这涉及到在监听循环中添加一个检查点&#xff0c;以便在接收到停…

vue-生命周期+工程化开发(三)

生命周期 Vue 生命周期 和 生命周期的四个阶段 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;一个Vue实例从 创建…

【办公类-23-02】20240212徐迟《江南小镇(南浔古镇)》“水晶晶”和景物”数量提取66个

作品展示 背景需求&#xff1a; 2024年春节前夕&#xff0c;我与家人前往浙江湖州、南浔旅行。探寻母亲、外婆外公、曾外婆的祖籍南浔的风土人情。在古镇上看到了”著名诗人“徐迟”的介绍。 母亲说&#xff1a;我的姑母就是在南浔读了小学和中学&#xff0c;她小学时的老师就…

PKI - 借助Nginx 实现Https_使用CA签发证书

文章目录 Pre概述操作步骤1. 生成 CA 密钥对2. 生成自签名的 CA 证书3. 生成服务器密钥对和证书签名请求 (CSR)4. 使用 CA 签署服务器证书 Nginx Https 自签证书1. 生成自签名证书和私钥2. 配置 Nginx 使用 CA签发的 HTTPS 证书3. 重启 Nginx 服务4. 直接访问5. 不验证证书直接…

Junit5基础教程

文章目录 一&#xff0c;导入依赖二&#xff0c;基本功能一、常用断言二、执行顺序和常用注解1、通过BeforeAll类的注解来保证顺序2、通过order注解来保证执行顺序 三、依赖测试四、参数化测试五、测试套件SelectPackages、IncludePackages、SelectClasses、IncludeTags等注解的…

Spark MLlib

目录 一、Spark MLlib简介 &#xff08;一&#xff09;什么是机器学习 &#xff08;二&#xff09;基于大数据的机器学习 &#xff08;三&#xff09;Spark机器学习库MLlib 二、机器学习流水线 &#xff08;一&#xff09;机器学习流水线概念 &#xff08;二&#xff09…