使用 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,一经查实,立即删除!

相关文章

java学习07---综合练习

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

浅谈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&…

【报错解决】-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的…

如何升级至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…

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…

第5集《佛说四十二章经》

和尚尼慈悲、诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义第五面&#xff0c;第三章、割爱去贪。 蕅益大师他把《四十二章经》的内涵分成两个部分&#xff1a;第一部分是第一章、第二章的正道法门&#xff1b;其次&#xff0c;第三章之后共有四十章都…

Java图形化界面编程—— ImageIO 笔记

2.8.4 ImageIO的使用 在实际生活中&#xff0c;很多软件都支持打开本地磁盘已经存在的图片&#xff0c;然后进行编辑&#xff0c;编辑完毕后&#xff0c;再重新保存到本地磁盘。如果使用AWT要完成这样的功能&#xff0c;那么需要使用到ImageIO这个类&#xff0c;可以操作本地磁…

【MATLAB】GA_BP神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 GA_BP神经网络回归预测算法结合了遗传算法&#xff08;Genetic Algorithm, GA&#xff09;和BP神经网络&#xff08;Backpropagation Neural Network, BPNN&#xff09;&#xff0c;用于解…

分享88个文字特效,总有一款适合您

分享88个文字特效&#xff0c;总有一款适合您 88个文字特效下载链接&#xff1a;https://pan.baidu.com/s/1Y0JCf4vLyxIJR6lfT9VHvg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

Gemini VS GPT-4,当前两大顶级AI模型实测

随着谷歌在AI军备竞赛中急起直追&#xff0c;“有史以来最强大模型”Gemini Advanced终于上线&#xff0c;AI爱好者们总算等来了一款号称能够匹敌GPT-4的大语言模型。 月费19.99美元&#xff08;包含Google One订阅&#xff09;的Gemini Advanced实际表现如何&#xff1f;究竟…

C++进阶(十五)C++的类型转换

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换1、static_cast2、reint…

[office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法

excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 在日常工作中经常会到用excel&#xff0c;有时需要计算毛重和皮重的时间间隔&#xff0c;具体的计算方式是什么&#xff0c;一起来了解一下吧 在日常工作中经常会到用excel&#xff0c;在整理编辑过磅数据…

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)

目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum&#xff0c;也就是Linux系统的应用商店 Linux--基础开…