使用 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 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 有任何疑问,请务必联系我们!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这MySQL错误日志异常也太猛了吧

作者:田逸(formyz) 一台核心业务数据库,版本为MySQL 8.34 社区服务器版。从上线以来,这个数据库服务器的错误日志增增加非常迅猛(如下图所示),每24小时能增加到10多个G的容量。 因为…

前后端分离nodejs+vue动态网站的图书借阅管理系统35ih5

读者模块 1)注册:读者输入账号、密码、确认密码、姓名、手机、身份证、邮箱,点击注册按钮,完成注册。 2)登录:普通读者成功输入读者账号和密码,点击登录按钮。 3)读者主页面:读者登录成功后,选择…

C++重新入门-循环

目录 1.循环类型 while循环: for循环 基于范围的for循环(C11) do...while 循环 2.循环控制语句 3.无限循环 有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着…

使用Flash download tool进行ESP32固件烧录

背景 为方便分发固件,可在任意电脑上安装烧录软件,直接将固件烧录进 烧录内容 查看vscode上platformio的烧录过程 Writing at 0x00000000... (100 %) Wrote 15104 bytes (10401 compressed) at 0x00000000 in 0.4 seconds (effective 281.3 kbit/s).…

【Spring源码分析】Spring的启动流程源码解析

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入(一)【Spring源码分析】…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

openresty (nginx)快速开始

文章目录 一、什么是openresty?二、openresty编译安装1. 编译安装命令1.1 编译完成后路径1.2 常用编译选项解释 2. nginx配置文件配置2.1 nginx.conf模板 3. nginx常见配置一个站点配置多个域名nginx配置中location匹配规则 三、OpenResty工作原理OpenResty工作原理…

实现自定义标记

实现自定义标记 问题陈述 New Tech Book的高级管理层决定在其用JSP设计的应用程序的所有页面上显示版权信息。它们还要去如何向应用程序中添加JSP页面,可以重用显示版本信息的代码。公司的软件开发人员Jerry Smith决定用自定义标记来创建应用程序的这一部分。 解决方案 要解…

【数学建模】【2024年】【第40届】【MCM/ICM】【D题 五大湖的水位控制问题】【解题思路】

一、题目 (一) 赛题原文 2024 ICM Problem D: Great Lakes Water Problem Background The Great Lakes of the United States and Canada are the largest group of freshwater lakes in the world. The five lakes and connecting waterways const…

社区团购系统-UMLChina建模知识竞赛第5赛季第6轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。 如果有第4题,第4题为附加题&am…

SpringBoot3整合Knife4j

前置&#xff1a; 官网&#xff1a;快速开始 | Knife4j gitee&#xff1a;swagger-bootstrap-ui-demo: knife4j 以及swagger-bootstrap-ui 集成框架示例项目 - Gitee.com 1.依赖引入&#xff1a; ps&#xff1a;json处理需要引入相关包 <dependency><groupId>c…

sqli-labs-master靶场训练笔记(54-65|决战紫禁之巓)

2024.2.5 level-54 1、先判断类型和闭合类型 ?id1/0 #正常 证明不是数字型 ?id1 #错误 ?id1 -- a #正常 判断是 闭合 2、 判断列数 这里需要运气&#xff0c;但是根据前面50多关的经验直接猜测是3列 ?id-1 union select 1,2,3 -- a 3、爆表名&#xf…

leetcode:131.分割回文串

树形结构&#xff1a; 切割到字符串的尾部&#xff0c;就是叶子节点。 回溯算法三部曲&#xff1a; 1.递归的参数和返回值&#xff1a; 参数字符串s和startIndex切割线 2.确定终止条件&#xff1a; 当分割线到字符串末尾时到叶子节点&#xff0c;一种方案出现 3.单层搜索…

真、开源LLM-OLMo

论文&#xff1a;https://arxiv.org/pdf/2402.00838.pdf Weights https://huggingface.co/allenai/OLMo-7B Code https://github.com/allenai/OLMo Data https://huggingface.co/datasets/allenai/dolma Evaluation https://github.com/allenai/OLMo-Eval Adaptation http…

行业科普应用分享 | 用于安全和安保的仪器仪表

【前言】 物联网带来了对安全和安保的新要求。利用物联网&#xff0c;运营商可以从复杂和分布式的装置中获益。此外&#xff0c;自主系统在现代工业的运作中正变得越来越重要。 从制造业到农业&#xff0c;这些远程操作需要仪器提供持续监测&#xff0c;以提供安全和保障。这…

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…

uniapp微信小程序开发踩坑日记:Pinia持久化

如果你使用过Pinia&#xff0c;那你应该知道Pinia持久化插件&#xff1a;https://prazdevs.github.io/pinia-plugin-persistedstate/zh/ 但由于官方文档提供的说明并不是针对小程序开发&#xff0c;所以我们在使用这个插件实现uniapp小程序开发中Pinia持久化会出现问题 我在C…

java学习07---综合练习

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

人力资源智能化管理项目(day05:角色管理)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 搭建页面结构 分页组件&#xff1a;设置layout&#xff0c;表示需要显示的内容&#xff0c;用逗号分隔&#xff0c;布局元素会依次显示。prev表示上一页&#xff0c;next为…

Ps:统计

Ps菜单&#xff1a;文件/脚本/统计 Scripts/Statistics 统计 Statistics脚本命令提供了一种高效的方法来处理和分析大量图像&#xff0c;使用户能够自动执行复杂的图像分析任务&#xff0c;并在多个图像间应用统计学方法。这个功能极大地扩展了 Photoshop 在科学研究、图像编辑…