Databend + lakeFS:将数据版本控制嵌入你的分析工作流

news2024/11/23 23:39:01

作者:尚卓燃(PsiACE)

澳门科技大学在读硕士,Databend 研发工程师实习生

Apache OpenDAL(Incubating) Committer

PsiACE (Chojan Shang) · GitHub

图片

云计算为以数据为中心的应用提供了廉价、弹性、共享的存储服务,这为现代数据处理工作流提供了显而易见的好处:海量数据、高并发访问、大吞吐量,越来越多的案例开始将旧有的技术栈向数据湖架构进行迁移。

当我们将数据湖置于云端之后,新的问题随之而来:

  • 旧有的数据仓库/大数据分析技术可能并不是专为云和对象存储设计的,性能和兼容性可能不太理想,需要投入大量的资源进行维护,如何为数据湖提供真正现代的、低成本、高性能、高质量的分析服务?

  • 对数据管理的需求仅一步加强,对分析结果的可复现性、数据源的可共享性提供了更高的要求,如何为数据提供弹性和可管理性,让数据科学家、数据分析师和数据工程师在逻辑一致的视图下紧密协作?

有问题,就会有答案!

Databend 基于云上的对象存储打造了真正跨云且原生的数据仓库。采用 serverless 理念设计,提供分布式、弹性可拓展、运维方便的高性能查询引擎,支持常见的结构化与半结构化数据,能够与现代数据技术栈进行紧密集成。

lakeFS 致力于为共享和协作处理数据提供解决方案。用类似 Git 的操作逻辑赋能对象存储,采用版本化方案为数据提供逻辑一致的视图,为现代化数据工作流嵌入有意义的分支名和提交信息,并且为数据、文档的一体化提供解决方案。

在这篇文章中,我们将会结合二者,提供一个简单清晰的 workshop,帮助你快速搭建现代化的数据工作流。

为什么你需要 Databend

随着数据量的激增,传统的数据仓库面临着巨大的挑战。它们无法有效地存储和处理海量数据,也难以根据工作负载弹性调整计算和存储资源,导致使用成本高昂。此外,数据处理复杂,需要投入大量资源进行 ETL,数据回退和版本控制也非常困难。

Databend 致力于解决这些痛点。它是一款使用 Rust 开发的开源、弹性、负载感知的云数据仓库,能够为超大规模数据集提供经济高效的复杂分析能力。

  • 云友好: 无缝集成各种云存储,如 AWS S3、Azure Blob、CloudFlare R2 等。

  • 高性能: 使用 Rust 开发,利用 SIMD 和向量化处理实现极速分析。

  • 经济弹性: 创新设计,存储和计算独立伸缩,优化成本和性能。

  • 简易数据管理: 内置数据预处理能力,无需外部 ETL 工具。

  • 数据版本控制: 提供类似 Git 的多版本存储,支持任意时间点的数据查询、克隆和回退。

  • 丰富的数据支持: 支持 JSON、CSV、Parquet 等多种数据格式和类型。

  • AI 增强分析: 集成 AI 函数,提供由大模型驱动的数据分析能力。

  • 社区驱动: 拥有友好、持续增长的社区,提供易用的云上分析平台。

图片

上图为 Databend 架构图,摘自datafuselabs/databend 。

为什么你需要 lakeFS

由于对象存储往往缺乏原子性、回滚等能力,数据的安全性不能很好地得到保证,质量和可恢复性也随之下降。为了保护生产环境的数据,往往不得不采用隔离副本的形式进行预演测试,消耗资源不说,还难以真正进行协同工作。

提到协同,你可能会想到 Git ,但 Git 并不是为数据管理而设计的,除了二进制数据管理不便之外,Git LFS 对单个文件大小的限制也制约了其适用场景。

lakeFS 应运而生,它提供用于数据湖的开源数据版本控制 — branch, commit, merge, revert,就像使用 Git 管理代码一样。由于支持零拷贝开发/测试隔离环境、连续质量验证、错误数据的原子回滚、可重复性等高级特性,你甚至可以轻松在生产数据上验证 ETL 工作流,而不再担心对业务造成损害。

图片

上图为 lakeFS 推荐的数据工作流,摘自 Git for Data - lakeFS 。

Workshop:使用 lakeFS 加持你的分析业务

在这个 workshop 中,我们将会利用 lakeFS 为存储库创建分支,并使用 Databend 对预置数据进行分析和转换。

由于实验环境包含一些依赖,第一次启动可能用时较久。我们更推荐使用 Databend Cloud + lakeFS cloud 的组合,这样你就可以跳过耗时颇多的 环境设置 部分,直接上手体验 数据分析 与转换

环境设置

本次使用的环境中除了 lakeFS 之外,还将包括作为底层对象存储服务的 MinIO ,以及 Jupyter 、Spark 等常用的数据科学工具。 你可以查看 这个 git 存储库了解更多相关信息。

图片

上图为本次实验环境的示意图,摘自 treeverse/lakeFS-samples 。

克隆存储库

git clone https://github.com/treeverse/lakeFS-samples.git
cd lakeFS-samples

启动全栈实验环境

docker compose --profile local-lakefs up

一旦启动实验环境,你就可以使用默认配置登录 lakeFS 和 MinIO,以在后续的步骤中观察数据的变化。

数据观察

在环境设置过程中,会在 lakeFS 中预先准备一个名为 quickstart 的存储库,在这一步中,我们将会对其进行一些简单的观察。

如果你使用自己部署的 lakeFS + MinIO 环境

  • 可能需要先自己手动在 MinIO 中创建对应的 bucket 。

图片

  • 再在 LakeFS 中创建对应的存储库,并勾选填充示例数据。

图片

lakeFS

在浏览器打开 lakeFS(http://127.0.0.1:8000),输入 Access Key ID 和 Secret Access Key 就可以登录到 lakeFS 。

接着打开 quickstart 存储库,可以看到已经存在一些默认的数据,并且还包含一个默认教程。

图片

lakeFS 的数据存储库模式几乎与 GitHub 之类的代码存储库对应,几乎没有什么学习成本:其中 lakes.parquet为预先准备好的数据,data 文件夹中的 lakes.source.md 介绍了数据的来源 ; scripts 文件夹包含用于数据校验的脚本,其完整的工作流可以在_lakefs_actions 目录下找到,编写形式类似 GitHub Actions ;README.md 对应下方教程的 Markdown 源文件,而 images 中包含了使用的全部图像。

MinIO

由于在实验环境中,我们使用 MinIO 作为底层存储,所以在 MinIO 中也可以找到一个名为 quickstart 的 bucket 。这是由 lakeFS 创建存储库时的 StorageNamespace 决定的。

图片

其中,dummy 文件是新建 lakeFS 存储库时就会创建的,用来确保我们有足够的权限写入 bucket 。

而 _lakefs 目录中只包含两个文件,从 S3 等数据源导入数据时创建,用来标识对导入文件原始位置的一些引用。

通过 lakeFS 编写的新对象则会位于 data 目录下。

数据的对应

打开 data 目录,我们可以找到一些文件,但很难与 lakeFS 中的数据对应起来。

图片

让我们回到 lakeFS ,点击文件右侧的齿轮图标,再选中 Object Info 就可以轻松找出对应关系。

图片

数据分析 与转换

在这一步中,我们将会部署 Databend 服务,通过 Stage 挂载 lakeFS 中的数据并进行分析,并用转换后的结果替换 denmark-lakes 分支中的 lakes.parquet 数据文件。

部署 Databend

Databend 的存储引擎同样支持 Time Travel、原子回滚等高级特性,无需担心操作失误。

这里我们使用单节点 Databend 服务的形式,以 MinIO 作为存储后端。总体上部署过程可以参考 Databend 官方文档 ,需要注意的一些细节如下:

  • 由于我们已经在上面的步骤中部署了 MinIO 服务,这里只需要打开 127.0.0.1:9000 创建一个名为 databend 的 Bucket 。

  • 接着需要为日志和 Meta 数据准备相关的目录

sudo mkdir /var/log/databend
sudo mkdir /var/lib/databend
sudo chown -R $USER /var/log/databend
sudo chown -R $USER /var/lib/databend
  • 其次,因为默认的 http_handler_port 已经被前面的服务占用掉,所以需要编辑 databend-query.toml 进行一些修改避免冲突:
http_handler_port = 8088
  • 另外,我们还需要根据 Docs | Configuring Admin Users 配置管理员用户,由于只是一个 workshop ,这里选择最简单的方式,只是取消 [[query.users]] 字段以及 root 用户的注释:
[[query.users]]
name = "root"
auth_type = "no_password"
  • 由于我们使用 MinIO 作为存储后端,所以需要对 [storage] 进行配置。
[storage]
# fs | s3 | azblob | obs | oss
type = "s3"

# To use S3-compatible object storage, uncomment this block and set your values.
[storage.s3]
bucket = "databend"
endpoint_url = "http://127.0.0.1:9000"
access_key_id = "minioadmin"
secret_access_key = "minioadmin"
enable_virtual_host_style = false

接下来就可以正常启动 Databend :

./scripts/start.sh

我们强烈推荐你使用 BendSQL 作为客户端,由于 http_handler_port 端口变更,需要使用 bendsql -P 8088 连接 Databend 服务。当然,我们也支持像 MySQL Client 和 HTTP API 等多种访问形式。

创建分支

lakeFS 的使用方法与 GitHub 类似,打开 Web UI 的 branches 页面 ,点击 Create Branch 按钮,创建一个名为 denmark-lakes 的分支。

图片

创建 Stage

Databend 可以通过 Stage 来挂载位于远端存储服务的数据目录。由于 lakeFS 提供 S3 Gateway API,所以我们可以按照 s3 兼容服务进行配置连接。需要注意的是,此处的 URL 需要按照 s3://<repo>/<branch> 进行构造,而且 lakeFS 的 ENDPOINT_URL 为 8000 端口。

CREATE STAGE lakefs_stage
URL='s3://quickstart/denmark-lakes/'
CONNECTION = (
  REGION = 'auto'
  ENDPOINT_URL = 'http://127.0.0.1:8000'
  ACCESS_KEY_ID = 'AKIAIOSFOLKFSSAMPLES'
  SECRET_ACCESS_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY');

通过执行下述 SQL 语句,我们可以过滤出目录中 Parquet 格式的数据文件。

LIST @lakefs_stage PATTERN = '.*[.]parquet';

图片

由于 Databend 已经支持 SELECT form Stage 能力,无需导入数据也可以进行基本的查询。

SELECT * FROM @lakefs_stage/lakes.parquet LIMIT 5;

图片

创建表,并进行一些简单的查询

在清洗数据之前,让我们先将数据导入到 Databend 中,进行一些简单的查询。

由于 Databend 内置 Infer Schema(推断数据结构)能力,可以方便地从文件创建表。

CREATE TABLE lakes AS SELECT * FROM  @lakefs_stage/lakes.parquet;

图片

接下来,让我们列出湖泊最多的 5 个国家。

SELECT   country, COUNT(*)
FROM     lakes
GROUP BY country
ORDER BY COUNT(*)
DESC LIMIT 5;

图片

数据清洗

这次数据清洗的目标是构造一个小型的湖泊数据集,只保留丹麦湖泊数据。使用 DELETE FROM 语句可以轻松满足这一目标。

DELETE FROM lakes WHERE Country != 'Denmark';

图片

接下来让我们再次查询湖泊数据,检查是否只剩下丹麦湖泊。

SELECT   country, COUNT(*)
FROM     lakes
GROUP BY country
ORDER BY COUNT(*)
DESC LIMIT 5;

图片

利用 PRESIGN 将结果写回 lakeFS

在这一步中,我们需要用清洗后的结果替换 denmark-lakes 分支中的 Parquet 文件。

首先我们可以使用 COPY INTO <location> 语法,将数据导出到内置的匿名 Stage。

COPY INTO @~ FROM lakes FILE_FORMAT = (TYPE = PARQUET);

接下来,让我们列出 @~ 这个 Stage 下的结果文件。

LIST @~ PATTERN = '.*[.]parquet';

图片

执行 PRESIGN DOWNLOAD 语句,我们可以获取用于下载结果数据文件的 URL:

PRESIGN DOWNLOAD @~/<your-result-data-file>;

图片

打开新终端,利用 curl 命令即可完成数据文件下载。

curl -O '<your-presign-download-url>'

接下来,使用 PRESIGN UPLOAD 语句,我们可以获取预签名的 URL ,用于上传数据文件。这里使用 @lakefs_stage/lakes.parquet; 是希望将 lakes.parquet替换为我们清洗后的丹麦湖泊数据。

PRESIGN UPLOAD @lakefs_stage/lakes.parquet;

图片

打开终端,利用 curl 命令即可完成上传。

curl -X PUT -T <your-result-data-file> '<your-presign-upload-url>'

此时文件已经被替换为清洗后的数据,再次列出 Stage 中的 Parquet 文件,可以看到文件大小和最后修改时间已经发生变化。

LIST @lakefs_stage PATTERN = '.*[.]parquet';

再次查询数据文件进行验证,确认已经是清洗后的数据。

SELECT   country, COUNT(*)
FROM     @lakefs_stage/lakes.parquet
GROUP BY country
ORDER BY COUNT(*)
DESC LIMIT 5;

图片

提交变更

这一步我们会将变更提交至 lakeFS 进行保存。

在 lakeFS 的 Web UI 界面中,打开 Uncommitted Changes 页面,确保选中 denmark-lakes 分支。

点击右上角的 Commit Changes 按键,编写提交信息,并确认提交。

图片

检查主分支中原始数据

denmark-lakes 中的原始数据已经被替换为清洗后的较小数据集,让我们切换回 main 分支,检查原始数据有没有收到影响。

同样地,通过创建 Stage 来挂载数据文件。

CREATE STAGE lakefs_stage_check
URL='s3://quickstart/main/'
CONNECTION = (
  REGION = 'auto'
  ENDPOINT_URL = 'http://127.0.0.1:8000'
  ACCESS_KEY_ID = 'AKIAIOSFOLKFSSAMPLES'
  SECRET_ACCESS_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY');

接着查询湖泊数据,列出湖泊数量最多的 5 个国家。

SELECT   country, COUNT(*)
FROM     @lakefs_stage_check/lakes.parquet
GROUP BY country
ORDER BY COUNT(*)
DESC LIMIT 5;

图片

main 分支中的一切都保持原样,我们在保证原始数据不受干扰的情况下,得到了一份清洗好的丹麦湖泊数据集。

额外挑战

在这个 workshop 中,我们了解到如何为数据创造隔离的分支,并且在 Databend 中进行了一些简单的查询和清洗工作。

如果你还想挑战更多内容,可以参考 IakeFS 的官方教程,尝试分支合并和数据回滚能力;也可以参考 Databend 官方教程,体验在数据导入阶段进行数据清洗和 Time Travel 等能力。

我们同样欢迎将 Databend 和 IakeFS 引入生产环境,在真实的工作负载中进行验证。

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

Databend Cloud:https://databend.cn

Databend 文档:Databend - The Future of Cloud Data Analytics. | Databend

Wechat:Databend

GitHub:GitHub - datafuselabs/databend: Modern alternative to Snowflake. Cost-effective and simple for massive-scale analytics. Cloud: https://databend.com

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

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

相关文章

致远OA wpsAssistServlet接口存在任意文件上传漏洞

致远OA wpsAssistServlet接口存在任意文件上传漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: app"致远互联-OA" && title"V8.0SP2" 漏洞复现1. 构造poc2. 发送数据包3. 访问webshell地址 免责声明 仅用于技术交流,目的是向相关安全人员展示…

10个国内设计师都在用的Figma插件分享给你,超实用!

随着设计工具的不断发展和持续创新&#xff0c;产生了许多实用的小插件&#xff0c;可以帮助设计师朋友们有效提高设计效率&#xff0c;节省不必要的设计时间和设计精力到意义和价值更高的设计部分上去。而Figma作为一个功能丰富有强大的专业设计工具&#xff0c;深受国内设计师…

低代码开发,节约成本更好的选择

目录 低代码开发过程中是如何工作的&#xff1f; 低代码开发具备哪些功能&#xff1f; 具备的功能有&#xff1a; 01、高性能、高拓展 02、功能丰富&#xff0c;满足通用场景 03、私有化部署 04、代码生成器&#xff0c;下载代码进行二次开发 05、适配国产化&#xff0c;支持主…

最小化安装移动云大云操作系统--BCLinux-R8-U2-Server-x86_64-231017版

有个业务系统因为兼容性问题&#xff0c;需要安装el8.2的系统&#xff0c;因此对应安装国产环境下的BCLinuxR8U2系统来满足用户需求。BCLinux-R8-U2-Server是中国移动基于AnolisOS8.2深度定制的企业级X86服务器通用版操作系统。本文记录在DELL PowerEdge R720xd服务器上最小化安…

JDK 21新特性深度分析,但我用Java 8

官方文档链接&#xff1a;https://openjdk.org/projects/jdk/21/ 下载链接&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows 1、介绍 JDK21 是2023.09.19发布的正式版 其他版本的含义&#xff1a; Alpha&#xff1a;软件或系统的内部测试版…

[JavaWeb]——面试官:谈谈你对springboot配置文件的理解

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、springboot中三种配置文件对比 二、语法格式 propertiles yml(推荐) XML 前言&#xff1a; 什么是配置文件❓ 配置文件是用于存储程序或系统配置信息的文本文件。它通常包含了一些参数和选项&#xff0…

LEECODE 1480一维数组的动态和

class Solution { public:vector<int> runningSum(vector<int>& nums) {vector<int> runningSum;int sum 0;int len nums.size();for(int i 0; i < len; i){sum sum nums[i];runningSum.push_back(sum);}return runningSum;} };

算法通关村第四关-黄金挑战基础计算器问题

大家好我是苏麟 , 今天带来栈的比较难的问题 . 计算器问题 基础计算器 LeetCode 224 描述 : 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 s 由数字、、-、(、)、和 组成s 表示一个有效的表达式 不能用作一元运算(例如&#xff0c; …

玩转硬件之Micro:bit的玩法(四)——声控灯

智能家居的普及在近几年来呈现出了爆发式的增长。随着科技的不断进步和人们对便利生活的追求&#xff0c;越来越多的家庭开始采用智能家居系统&#xff0c;使生活更加智能化、便捷化。 智能家居的普及不仅改变了人们的生活方式&#xff0c;也为家庭带来了更多的便利和舒适。现…

Betaflight 4.5 + Aocoda-RC F405V2 + AT32F435 Mark4 试飞初步总结

Betaflight 4.5 Aocoda-RC F405V2 AT32F435 Mark4 试飞初步总结 1. 源由2. 试飞3. 问题3.1 图传功率设置异常3.2 图传信号不理想3.3 ELRS915 信号差3.4 RSSI dbm告警3.5 翻滚不太顺手3.6 摄像头色彩异常3.7 磁力计指示方向异常 4. 参考资料 1. 源由 开销了一整天的时间&…

去除短视频平台水印 | 一键下载神器

当咱们这些视频创作者在短视频平台找素材的时候&#xff0c;经常会碰到下载下来居然带着平台水印的烦恼&#xff0c;这可让咱们的创作受到了限制和困扰不过别着急&#xff01;咱这就推荐几款超方便的短视频一键去水印下载工具&#xff0c;帮你快速去掉水印&#xff0c;轻松搞定…

第五章 基于视图的SysML模型|系统建模语言SysML实用指南学习

仅供个人学习记录 定制的机制在15.7节 定制语言部分阐述 仅记录个别值得专门记下来的概念 SysML视图 画布 图内容diagram context 也被称作画布canvas 省略号 显示省略号表示并非所有可视分区元素均显示 离页连接器 两节点之间的路径标识反映了节点所表示的两个模型元…

如何巧妙公布成绩

宝子们&#xff0c;来来来&#xff01;听说你们对如何公布学生成绩很头疼&#xff1f;别担心&#xff0c;今天就让我来给大家支支招&#xff01; 1在家长群内发公告&#xff0c;孩子的成绩已出&#xff0c;想知道具体成绩可以私信哦&#xff5e;简单粗暴&#xff01;关心孩子的…

会stm32有机会进大公司吗?

今日话题&#xff0c;会stm32有机会进大公司吗&#xff1f;我本科期间参与了飞思卡尔和电赛等比赛&#xff0c;使用过多种单片机&#xff0c;但渐渐发现单片机只是其中的一小部分。不要过分迷恋所谓的单片机基础和技巧&#xff0c;更值得深入研究的是C语言。如果你对此感兴趣&a…

【C++入门 三】学习C++缺省参数 | 函数重载 | 引用

C入门 三 1.缺省参数1.1 缺省参数概念1.2 缺省参数分类 2. 函数重载2.1 函数重载概念2.2 C支持函数重载的原理--名字修饰(name Mangling) 3.引用3.1引用概念3.2引用特性3.3 常引用3.4 使用场景1. 做参数2. 做返回值 3.5 传值、传引用效率比较3.6引用和指针的区别 4.引用和指针的…

Qt PingFang字体在Debian/Ubuntu上安装

1 下载ttf格式的字体库 2 将上图中的ttf文件拷贝到/usr/share/fonts/truetype 3 执行 fc-cache -f -v 4 如果qt程序字体效果未显示&#xff0c;可能与qt的字体路径有关 我这边是这样修改的&#xff1a;

使用 C# 在Word中插入图表

Word中的图表功能将数据可视化地呈现在文档中。这为展示数据和进行数据分析提供了一种方便且易于使用的工具&#xff0c;使作者能够以直观的方式传达信息。要通过C#代码来实现在Word中绘制图表&#xff0c;可以借助 Spire.Doc for .NET 控件&#xff0c;具体操作参考下文。 目录…

Qt QSystemTrayIcon实现系统托盘

1.简介 QSystemTrayIcon是Qt中的一个类&#xff0c;用于创建和管理系统托盘图标。系统托盘图标是显示在操作系统任务栏或通知区域的小图标&#xff0c;它可以用来在后台运行的应用程序中提供快速访问功能。 2.常用方法 设置托盘的显示图标 setIcon(const QIcon &icon) …

Python 文件处理:完整指南,一文够了

Python 是一种流行的解释型动态类型编程语言&#xff0c;用于构建 Web 服务、桌面应用程序、自动化脚本和机器学习项目。程序员在使用基于 Python 的软件项目时&#xff0c;通常必须访问操作系统的文件系统。 例如&#xff0c;我们使用文本文件作为输入&#xff0c;编写文本文…

用了这款插件,零代码基础也能写代码你信吗?

写在前面 使用过chatGPT的同学&#xff0c;可能都会有过这样的经历&#xff1f;遇到代码不会的问题&#xff0c;本能的就去求助chatGPT&#xff0c;然后并根据chatGPT的回答去优化代码。但是&#xff0c;没了梯子的话&#xff0c;chatGPT是不是也帮不上忙了&#xff1f;还是只…